MySQL基础总结

20170708――20170807
注:cmd需要以管理员身份运行
 
1,启动与关闭        
    net start mysql    ,  
    net stop mysql
2,登录与退出        
    mysql -u(username) -p(password) -P(端口号) -h(服务器地址),
    exit;    quit;    \q;
默认端口号:3306,本机服务器地址:127.0.0.1
3,修改MySQL提示符
    ①连接客户端时 :mysql -u(username) -p(password) --prompt 提示符
    ②连接客户端后 :mysql>prompt 提示符

4,常用命令
    SELECT VERSION();    显示当前服务器版本
    SELECT NOW();        显示当前日期时间
    SELECT USER();        显示当前用户
    SELECT DATABASE();    显示当前打开的数据库
5,语句规范
    ① 关键字与函数名称全部大写
    ② 数据库名称,表名称,字段名称全部小写
    ③ SQL语句必须以分号结尾
6,创建数据库
    CREATE {DATABASE | SCHEMA } [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name
7,查看当前服务器下的数据库列表
    SHOW DATABASES;
8,修改数据库
    ALTER {DATABASE | SCHEMA} db_name [DEFAULT] CHARACTER SET [=] charset_name;
9,删除数据库
    DROP {DATABASE | SCHEMA} [IF EXISTS] db_name;
10,数据类型
    整形 :
 
        
    浮点型
 
    日期
 
    字符型
 
定长:用空格补齐
L+1或L+2里多出来的字节是用来保存数据值的长度的。在对长度可变的数据进行处理时,MySQL要把数据内容和数据长度都保存起来。
 
11,创建数据表:先打开数据库    USE db_name
    CREATE TABLE [IF NOT EXISTS] tb_name(column_name data_type,...)
column_name:列名称,data_type:数据类型
 
12,查看数据表
    SHOW TABLES [FROM db_name] [LIKE 'pattern'|WHERE expr]
13,查看数据表结构
    SHOW COLUMNS FROM tb_name;
14,记录插入(为行内容赋值)
    INSERT [INTO] tb_name [(col_name,...)] VALUES(val,...);
(col_name,...)若省略则需要写入所有要插入的字段
15,记录的查找(查看赋值结果如何)
    SELECT expr,...FROM tb_name;
16,自动编号
    AUTO_INCREMENT
必须与主键组合使用,起始值为1,每次增量为1;类型可以为整数或者浮点数,浮点数的小数部分必须为0
 
17,主键约束    PRIMARY KEY
    ① 一张数据表中只能有一个主键
    ② 主键保证记录的唯一性
    ③ 主键自动为NOT NULL
自动编号不需要赋值,主键约束可以赋值,但是不允许重复
18,唯一约束    UNIQUE KEY
    ① 唯一约束可以保证记录的唯一性
    ② 唯一约束的字段可以为空值
    ③ 每张数据表可以存在多个唯一的约束
唯一约束不允许有多个空值
19,默认约束    DEFAULT  
    当插入记录时,如果没有明确为字段赋值,则自动赋予默认值
eg:
CREATE TABLE tb1(
    id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(20) NOT NULL UNIQUE KEY,
    sex ENUM('1','2','3') DEFAULT '3'
);
 
20,根据约束所针对的字段的数目可以分为 表级约束(>=2字段)和列级约束(1字段)
 
21,根据功能将约束分为
    NOT NULL    (非空约束)
    PRIMARY KEY    (主键约束)
    UNIQUE KEY    (唯一约束)
    DEFAULT        (默认约束)
    FOREIGN KEY    (外键约束)
 
 
22,外键约束    FOREIGN KEY(chl_col_name)REFERENCES fath_tb_name(fath_col_name)
    
 
 
 
23,表级约束与列级约束
(1)对一个数据列建立的约束,称为列级约束
(2)对多个数据列建立的约束,称为表级约束
(3)列级约束既可以在列定义时声明,也可以在列定以后声明
(4)表级约束只能在列定义后声明
24,修改数据表(改)
 
添加单列    ALTER TABLE tb_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name ]
添加多列    ALTER TABLE tb_name ADD [COLUMN] (col_name column_definition,...);
删除列        ALTER TABLE tb_name DROP [COLUMN] col_name;
添加主键约束    ALTER TABLE tb1_name add [CONSTRAINT [symbol]] PRIMARY KEY  [index_type] (index_col_name,...)
添加唯一约束    ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUWE [INDEX | KEY] [index_name] [index_type] (index_col_name,...)
添加外键约束    ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY  [index_col_name,...) reference_definition
添加/删除默认约束    ALTER TABLE tbl_name ALTER [COLUMN] col_name{SET DEFAULT literal | DROP DEFAULT }
删除主键约束    ALTER TABLE tbl_name DROP PRIMARY KEY
删除唯一约束    ALTER TABLE tbl_name DROP {INDEX | KEY } index_name
删除外键约束    ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol
修改列定义    ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
修改列名称    ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name]
数据表更名        
    ① ALTER TABLE tbl_name RENAME [TO | AS] new_tbl_name
    ② RENAME TABLE tbl_name TO new_tbl_name [,tbl_name2 TO new_tbl_name2]...
插入记录(增)    
    ① INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
    ② INSERT [INTO] tbl_name SET col_name={expr | DEFAULT},...    与第一种方式的区别在于,法②可以使用子查询(SubQuery),且一次只能插入一条记录
    ③ INSERT [INTO] tbl_name [(col_name,...)] SELECT ...    从一个数据表导入
 
更新记录(单表更新)
    UPDATE [LOW_PRIORITY][IGNORE] tbale_reference SET col_name1={expr1 | DEFAULT} [,col_name2={expr2 | DEFAULT}] ... [WHERE where_condition]
删除记录(单表删除)(删)
    DELETE FROM tbl_name [WHERE where_condition]
25, SELECT:
SELECT select_expr[,select_expr...]
[
    FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name|position} [ASC|DESC],...]
    [HAVING where_condition]
    [ORDER BY {col_name|expr|position}[ASC|DESC],...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
 
]
select_expr(查询表达式)    
    每一个表达式表示想要的一列,必须有至少一个
    多个列之间以逗号分隔
    星号*表示所有列,tbl_name.*表示命名表的所有列
    查询表达式可以使用[AS] alias_name为其赋予别名
    别名可用于GROUP BY , ORDRE BY 或 HAVING 字句
26,查询结果的操作(查)
where的条件查询
 
GROUP BY的查询结果分组
    [GROUP BY {col_name | position} [ASC | DESC],...]
ASC表示升序,DESC表示降序
 
HAVING 的分组条件    [HAVING where_condition]
eg:
SELECT id,age FROM tb_name GROUP BY id HAVING expr;
expr中出现的字段必须为聚合函数或者在前面的SELECT语句中出现的字段,该例中只能为id,age或者其他聚合函数。
聚合函数为max()min()avg()sum()count()等,只有一个返回值。
 
ORDER BY 对查询结果进行排序
    [ORDER BU {col_name | expr | position} [ASC | DESC],...]
eg: SELECT * FROM tb_name ORDER BY id DESC;    //按id的降序排列
LIMIT    限制查询结果返回的数量
    [LIMIT {[offset,]row_count | row_count OFFSET offset}]
eg:    SELECT * FROM tb_name LIMIT 1;        //只显示第一条
    SELECT * FROM tb_name LIMIT 3,2;    //显示第四条和第五条,排序时从0开始的
27, 修改客户端显示的内容编码(不影响数据表的内容)
    SET NAMES gbk/utf8...
28 , 子查询    指嵌套在查询内部,且必须始终出现在圆括号内,子查询可以包含多个关键字或条件,如     DISTINCT,GROUP BY,ORDER BY,LIMIT 函数等。子查询的外层查询可以是:SELECT,INSERT,UPDATE,SET或DO。子查询可以返回标量,一行,一列,或者一个子查询
分类:
    ① 使用比较运算符的子查询 = ,>=, < ,<= ,<> ,!= ,<=>
       语法结构 operand comparison_operator subquery
eg:
SELECT ROUND(AVG(goods_price),2) FROM tbd_goods;    //对价格字段求平均值,四舍五入保留两位,不写2,默认保留整数。
 
SELECT goods_id,goods_price,goods_name FROM tbd_goods WHERE goods_price >= (SELECT ROUND(AVG(goods_price),2) FROM tbd_goods)    //用子查询查找数据表中价格大于价格平均值的项
      用ANY,SOME,ALL修饰的比较运算符
        operand comparsion_operator ANY (subquery)
        operand comparsion_operator SOME (subquery)
        operand comparsion_operator ALL (subquery)
 
    ② 使用[NOT] IN
       语法结构 operand comparison_operator [NOT] IN (subquery)  
       ANY 运算符与IN等效,!=ALL或<>ALL 与NOT IN等效
    ③ 使用[NOT] EXISTS 的子查询,如果子查询返回任何行,EXISTS将返回TRUE,否则为FALSE。(不常用)
29 ,INSERT ... SELECT 将查询结果写入数据表
    INSERT [INTO] tbl_name [(col_name,...)] SELECT ...  
30 , 多表更新
    UPDATE table_references SET col_name1 = {expr | DEFAULT} [,col_name2 = {expr2 | DEFAULT} ... [WHERE where_condition]
    table_references : {[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN}
31 , CREATE ... SELECT 创建数据表同时将查询结果写入到数据表
    CREATE TABLE [IF NOT EXISTS] tbl_name [create_definition,...]select_statement
 
32 , 连接    
    ①{[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN}
    ②table_reference
    ③ON conditional_expr
 
JOIN
INNER JOIN:内连接和交叉连接等价,都是笛卡尔积运算
CROSS JOIN:交叉连接
LEFT [OUTER] JION 左连接:是根据最左表的记录,在被连接右表中找出符合条件的记录与之匹配,找不到与左表匹配的,用null填充。
RIGHT [OUTER] JOIN 右连接:是根据最右表的记录,在被连接左表中找出符合条件的记录与之匹配,找不到与右表匹配的,用null填充。
连接类型:
    INNER JOIN,内连接。在MySQL中,JOIN,CROSS JOIN和INNER JOIN是等价的。
        LEFT [OUTER] JOIN ,左外连接
        RIGHT [OUTER] JOIN,右外连接
连接条件:使用On关键字来设定连接条件,也可以用WHERE来代替。通常使用ON关键字来设定连接条件,使用WHERE关键字进行结果集记录的过滤
内连接:显示左表及右表符合连接条件的记录
左外连接:显示左表的全部及右表中符合条件的记录
右外连接:显示右表的全部及左表中符合条件的记录
 
多表连接
SELECT col_name1,col_name2,col_name3,col_name4,col_name5 FROM tbl_name1 AS t1  
INNER JOIN tbl_name2 AS t2 ON join_condition
INNER JOIN tbl_name3 AS t3 ON join_condition\G;
 
SELECT goods_id,goods_name,cate_name,brand_name,goods_price FROM tdb_goods AS g
    -> INNER JOIN tdb_goods_cate AS c ON g.cate_id=c.cate_id
    -> INNER JOIN tdb_goods_brands AS b ON g.brand_id=b.brand_id\G;
连接三个表联合显示查询结果,注意不同的INNER JOIN中间没有逗号!!没有逗号!!没有逗号!!
显示的结果和商品表tdb_goods的记录一样,不过之前是通过单表的查询来显示,这次是通过三张表的连接来显示。
多表的连接实际上是外键的逆向约束。外键把数据分开存储,多表连接又把数据联系在一起。
 
多表删除
DELETE tbl_name[.*] [,tbl_name[.*]] ... FROM table_references [WHERE where_condition]
 
子查询与连接总结:
 
子查询:出现在mysql语句的select子句,而子查询必须要出现在小括号()内,它的外层可以是select语句,insert语句,update语句,delete语句,而且在子查询中可以包含多个关键词:group by,order by,limit以及相关函数。。。引发子查询的情况有比较运算符,(Not)in运算符,exist(Not exists)引发的子查询
 
连接:连接分为外连接和内连接,内连接主要显示的是左表和右表当中都符合连接条件的记录。外链接有分为左外连接和右外连接,左外连接显示的是左表中的全部记录和右表符合条件的记录,右外连接和左外连接相反
 
33,字符函数
 
CONCAT();    连接多个字段
eg(面试题):SELECT CONCAT(first_name,'_',last_name) AS full_name FROM test;
 
CONCAT_WS();    用某个分隔符连接多个字段
eg:SELECT CONCAT_WS('_',first_name,last_name,...);
 
FORMAT()    数字格式化(返回类型为字符型)
eg: SELECT FORMAT(12530.75,2)        //12,530.75
    SELECT FORMAT(12530.75,1)        //12,530.8
    SELECT FORMAT(12530.75,0)        //12,531
 
UPPER()        转换成大写字母
LOWER()        转换成小写字母
eg:SELECT UPPER('MySQL')        //MYSQL
    SELECT LOWER(;MySQL')        //mysql
 
LEFT()        获取左侧字符串
RIGHT()        获取右侧字符串
eg:SELECT LEFT('mysql',2)        //my
   SELECT RIGHT('mysql',3)        //sql
   SELECT UPPER(LEFT('mysql',2))    //MY    函数嵌套  
   SELECT CONCAT(UPPER(LEFT('mysql',2)),LOWER(RIGHT('mysql',3)))    //MYsql        函数嵌套
 
LENGTH()    获取字符串长度
eg: SELECT LENGTH('MY SQL')    //6
 
LTRIM()        删除字符串的前导空格
RTRIM()        删除字符串的后续空格
TRIM()        删除字符串的前导和后续空格
eg: SELECT LENGTH(LTRIM('  mysql    '))        //9
    SELECT LENGTH(RTRIM('  mysql    '))        //7
    SELECT LENGTH(TRIM('  MYSQL    '))        //5
    SELECT TRIM(LEADING '?' FROM '???MYSQL??')    //MYSQL??    删除前导指定字符
    SELECT TRIM(TRAILING '?' FROM '???MYSQL??')//???MYSQL    删除后续指定字符
    SELECT TRIM(BOTH '?' FROM '???MYSQL??')    //MYSQL        删除前导和后续的指定字符
 
REPLACE        替换指定字符
eg: SELECT REPLACE('??MY??SQL???','?','')    //MYSQL
 
SUBSTRING    从某字符串的某个位置开始截取指定长度的字符
eg: SELECT SUBSTRING('MYSQL',1,2);        //MY    从1开始计数
    SELECT SUBSTRING('MYSQL',2);        //YSQL
    SELECT SUBSTRING('MYSQL',-2);        //QL从右往左数
    SELECT SUBSTRING('MYSQL',-1,-2);        //输出空
 
[NOT]LIKE    模式匹配
eg: SELECT 'MYSQL' LIKE 'M%'        //1     即true,MySQL中的%为通配符,类似Windows下的*,%代表任意字符,_代表任意一个字符
    SELECT 'MYSQL' LIKE 'm%'        //1    不区分大小写
 
34,数值运算函数
 
CEIL()        向上取整
FLOOR()     向下取整
DIV        整除运算
MOD        取模
POWER()        幂运算
ROUND()        四舍五入
TRUNCATE()    数字截取
 
35 ,比较运算符与函数
 
[NOT] BETWEEN AND();    //(不)在某个范围内
eg:SELECT 15 BETWEEN 1 AND 22;        //1(true),包括两边 [1,22]
    SELECT 15 BETWEEN 15 AND 15;    //1(true)
[NOT] IN();        //(不)在列出值范围内
eg:SELECT 15 IN(10,15,20);        //1(true)
    SELECT 15 IN(10,12,20);        //0(true)
IS [NOT] NULL;        //(不)为空
eg:SELECT NULL IS NULL;        //1(true)
    SELECT '' IS NULL;            //0(false)
 
36 , 日期时间函数
 
NOW();        //当前日期和时间
CURDATE();    //当前日期
CURTIME();    //当前时间
DATE_ADD();    //日期的变化
eg:SELECT DATE_ADD('2017-7-25',INTERVAL 365 DAY);    //2018-07-25  
    SELECT DATE_ADD('2017-7-25',INTERVAL -365 DAY);    //2016-07-25
    SELECT DATE_ADD('2017-7-25',INTERVAL 48 HOUR);    //2017-07-27 00:00:00  
    SELECT DATE_ADD('2017-7-25',INTERVAL 48*60 MINUTE); //2017-07-27 00:00:00
DATE_DIFF()    //日期差值
eg:SELECT DATEDIFF('2019-6-10','2015-6-8');        //1463
DATE_FORMAT()    //日期格式化
eg:SELECT DATE_FORMAT('2017-7-25','%m/%d/%Y');        //07/25/2017
 
37 , 信息函数
 
CONNECTION_ID()        //连接ID
eg:SELECT CONNECTION_ID();    //8(服务器不同输出不同)
 
DATABASE();        //当前数据库
eg:SELECT DATABASE();    
 
LAST_INSERT_ID()    //最后插入记录的ID号。    表中必须存在一个自动编号的字段,设置为主键,名字不一定叫ID。而且如果最后一条记录一次插入了多个数据,显示的是插入的多个数据的第一个数据的ID号
 
USER();        //当前用户
 
38 , 聚合函数
AVG()     平均值
COUNT()   计数
MAX()     最大值
MIN()     最小值
 
39 ,加密函数
 
MD5():信息摘要算法,为以后的Web页面做准备,尽量使用MD5()
eg:  SELECT MD5('admin');  
PASSWORD():密码算法,通过PASSWORD()修改(重要用于MYSQL数据库)当前用户和其他用户的密码,修改客户端自己的密码
eg: SET PASSWORD=PASSWORD(‘dimitar’); 把密码修改成dimitar。
 
40 , 自定义函数(udf     user-define-function):
两个必要条件:a,参数,b,返回值
 
创建自定义函数:
    CREATE FUNCTION function_name RETURNS{STRING|INTEGER|REAL|DECIMAL} routine_body     
 
 
eg:
CREATE FUNCTION F1() RETURNS VARCHAR(30) RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');
SELECT F1();    //2017年07月25日 16点:33分:01秒     输出当前时间并格式化
 
创建带参数的自定义函数:
eg:
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN(num1+num2)
SELECT f2(10,15)    //12.5
删除函数:
   DROP [IF EXISTS]FUNCTION fun_name;
 
修改分隔符:        DELIMITER 分隔符
 
41,存储过程:存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理
优点:
    a)增强SQL语句的功能和灵活性
    b)实现较快的执行速度
     c)减少网络流量
创建存储过程    CREATE [DEFINER = {user| CURRENT_USER}] PROCEDURE sp_name([proc_parameter[,...]]) [characteristic ...]routine_body
  proc_parameter: [IN|OUT|INOUT] param_name type
IN:表示该参数的值必须在调用存储过程时指定
OUT:表示该参数的值可以被存储过程改变,并且可以返回
INOUT:表示该参数的调用时指定,并且可以被改变和返回



 
eg: CREATE PROCEDURE sp() SELECT VERSION();
 
调用存储过程:
    CALL sp_name([parameter[,...]])
    CALL sp_name[()]
eg:CALL sp();
修改存储过程:只可以修改参数类型和注释,过程体不可以修改,只能删除再重建。
    ALTER ORICEDURE sp_name [characteristic ...] COMMENT 'string' | {CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}|SQL SECURITY{DEFINER|INVOKER}
删除存储过程:    DROP PRICEDURE[IF EXISTS] sp_name;
eg:    CREATE PROCEDURE removeUsersAndReturnUserNums(IN p_id INT UNSIGNED,OUT userNums INT UNSIGNED)
    BEGIN
    DELETE FROM users WHERE id = p_id;
    SELECT count(id) FROM users INTO userNums;
    END
    CALL removeUsersAndReturnUserNums(10,@nums);        //变量
    SELECT @nums;    //输出剩余条目数
SET @nums = 7;        //定义用户变量,只对当前客户端有效
SELECT ROW_COUNT();    //系统函数;得到插入,删除,更新 影响的记录总数
eg:INSERT test(username)VALUES('A'),('B'),('C');
    SELECT ROW_COUNT();        //3
    UPDATE test SET username = CONCAT(username,'--CHINA') WHERE id<=2;
    SELECT ROW_COUNT();        //2


42,存储引擎:可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎。每一种存储引擎使用不同的存储机制,索引技巧,锁定水平,最终提供广泛且不同的功能
查看数据表的存储引擎: SHOW CREATE TABLE tb_name;
mysql支持的存储引擎:
    MySAM(常用):存储限制可达256TB,支持索引,表级锁定,数据压缩
    InnoDB(常用): 限制为64TB,支持事务和索引,锁颗粒为行锁
    Memory
    CSV
    Archive
相关知识点:
①并发处理:
    并发控制:当多个连接对记录进行修改时保证数据的一致性和完整性。对于并发读或者并发写,系统采用“锁”系统解决
    a)锁:    
        共享锁(读锁):在同一时间段内,多个用户可以读取同一个资源,读取过程中数据不会发生任何变化。
        排他锁(写锁):在任何时候只能有一个用户写入资源,当进行写锁时会阻塞其他的读锁或者写锁操作。
    b)锁颗粒:
        表锁:是一种开销最小的锁策略。
        行锁:是一种开销最大的锁策略。
②事务处理:
    事务:用于保证数据库的完整性。
事务的特性:
    原子性(Atomicity)
    一致性(Consistency)
    隔离性(Isolation)
    持久性(Durability)
③外键:是保证数据一致性的策略
④索引:是对数据表中一列或多列的值进行排序的一种结构。是快速定位的一种方法
    普通索引
    唯一索引
    全文索引
    btree索引
    hash索引
    ...
        


修改存储引擎的方法
    ①通过修改MySQL配置文件实现 ———— default-storage-engine = engine
    ②通过创建数据表命令实现 ———— CREATE TABLE table_name( ... )ENGINE = engine;
    ③通过修改数据表命令实现 ———— ALTER TABLE table_name ENGINE [=] engine_name;
43,数据库管理工具:PHPMyAdmin,Navicat,MySQL Workbench
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值