Mysql基础与高级
哔哩哔哩:尚硅谷
Mysql基础
启动与停止mysql
注意:管理员身份进入cmd
1 |
|
mysql服务器端的登录与退出
方式一:Mysql自带的客户端
仅限于root用户
方式二:通过windows自带的客户端
登录
1 |
|
mysql常见命令
1 |
|
MySql语法规范
- 不区分大小写,建议关键字大写,表名,列名小写
- 每条命令用最好用分号结尾
- 每条可以根据需要,进行换行缩进
- 注释
- 单行注释:# 注释文字
- 单行注释:– 注释文字
- 多行注释: /*注释文字*/
026
使用函数concat()实现多个字符串拼接
027
DESC 表名 : 查看表的结构
IFNULL(A,B)函数:如果查询字段A为NULL,则返回B,否则保持A不变。
028
<>:等同于不等于!=
&& || ! / and or not
like
between and
in
is null / is not null
029
最好使用<>代替!=
030
模糊查询
1 |
|
LIKE关键字:
一般和通配符搭配使用:
%可以匹配任意多个字符(零个或多个字符)
可以判断字符型或数值型
_任意单个字符
转义使用 \
SELECT * FROM employees WHERE last_name LIKE '_$_' ESCAPE '$'; // 声明$为转义字符。
1
2
3
4
5
6
7
8
9
10
* BETWEEN AND
* 包含临界值
* 两个临界值不能交换顺序
* IN
* ```sql
WHERE job_id in ('a','b','c');
判断某字段是否属于in列表中的某一项。
IN列表的类型必须一致或兼容。
IN不支持通配符
IS NULL
- 等于运算符不能判断NULL值。
安全等于<=>
- 可以判断NULL,普通类型值。
字符型和日期型常量值必须用’’括起来。
031
ISNULL 返回 1 / 原本值:判断某字段是否为NULL,如果是,则返回1,否则返回0。
045
字符函数,utf-8中,一个汉字占3字节,一个英文字母占一字节。GBK字符集中,一个汉字占两个字节。
获取使用字符集的情况:
1 |
|
LENGTH():获取参数值字节数。
CONCAT():拼接字符。
UPPER / LOWER:转换大小写。
SUBSTRING / SUBSTR
1
2
3
4
5# 注意:索引从1开始
#截取从指定索引处后面所有字符
SELECT SUBSTR('雨过天晴云破除',5); // 返回云破除
#截取从指定索引处指定字符长度的字符
SELECT SUBSTR('雨过天晴云破除',1,4); //雨过天晴INSTR:返回子串第一次出现的索引,如果找不到,返回0。
TRIM:去掉前后空格。
去掉前后指定字符:
1
2#去掉前后的a
SELECT TRIM('a' FROM 'aaaaaaaaa小aaa七aaaaaaaa');
LPAD / RPAD:
1
2# 用指定的字符实现左填充指定字符长度
SELECT LPAD('白纵生',10,'*')AS out_put;REPLACE:用指定的字符串替换目标字符串。
046
数学函数:
ROUND:四舍五入(绝对值)
1
2# 保留几位小数。
SELECT ROUND(1.595,2);CEIL:向上取整,返回大于等于该参数的最小整数(负数也是)。
FLOOR:向下取整,返回小于等于该参数的最大整数(负数也是)。
TRUNCATE:截断。
1
SELECT TRUNCATE(1.65,1); #小数点后保留1位。
MOD:取余。(等价于%)
RAND():获取随机数,返回0-1之间的小数
047
日期函数
#now:返回当前系统日期 + 时间
1 |
|
#CURDATE :返回当前系统日期,不包含时间。
1 |
|
#CURTIME:返回当前系统时间,不包含日期。
1 |
|
#可以获取指定部分的年、月、日、时、分、秒
1 |
|
#str_to_date:将日期格式的字符串转换为指定格式的日期(解析)。
1 |
|
格式符 | 功能 |
---|---|
%Y | 4位的年份 |
%y | 2位的年份 |
%m | 月份(01,02……,12) |
%c | 月份(1,2,3……12) |
%d | 日(01,02,……) |
%H | 小时(24小时制) |
%h | 小时(12小时制) |
%i | 分钟(00,01,……,59) |
%s | 秒(00,01,……,59) |
#date_format:将日期转换为字符。
1 |
|
048
其他函数
1 |
|
049
流程控制函数
if函数:if else的效果
1 |
|
050
case函数的使用1:switch case的效果
1 |
|
case函数的使用2:类似于 多重if
1 |
|
首字符排序不同于完整的字符排序
051
分组函数:用作统计使用,又被称为聚合函数或统计函数或组函数。
SUM
AVG:忽略NULL
MAX:忽略NULL
MIN:忽略NULL
COUNT:注意!计算非空行数,NULL字段不会被计算进去(忽略NULL)。
COUNT(*)统计行数
058
DATEDIFF(a,b):求a,b两天之间的天数差。
071
进行多表连接时,为表起别名后,原名称失效,必须使用别名。
073
非等值连接
例子:
1 |
|
1 |
|
074
自连接:别名的好处!!!
1 |
|
079
- sql99分类:
- 内连接:
- inner JOIN:可以省略
- 外连接:
- left JOIN
- right JOIN
- 交叉连接:
- cross JOIN:求笛卡尔积
- 内连接:
089
多行子查询
操作符 | 含义 |
---|---|
IN/NOT IN | 等于列表中的任意一个(IN可以使用ANY来代替) |
ANY/SOME | 和子查询返回的某一个值比较,满足任意一个即可(ANY可以使用最大最小来代替) |
ALL | 和子查询返回的所有值比较,需要满足所有 |
092
FROM后面的子查询使用:将子查询结果当做一张表来使用,这张表必须取别名。
093
相关子查询:EXISTS(查询语句),返回BOOL值(0/1),判断子查询返回值是否为空。
095
分页查询:当要显示的数据,一页显示不全,需要分页提交sql。
要显示的页数page,每页的条目数size:LIMIT (page-1)*size,size;
1 |
|
100
union 联合 合并:将多条查询语句的结果合并为一个结果,就是语句拆分,方便观看。
查询语句1
union
查询语句2
1 |
|
- 注意:
- 要求联合查询时,查询的列数必须一致。
- 要求多条查询语句的每一列的类型和顺序最好一致。
- 结果集合会自动过滤去重,不想去重,可以添加关键字ALL(UNION ALL)
104
方式一:insert into 表名 values(),(),(),……;
方式二:insert into 表名 set ……;
- 方式一,可以实现一条语句插入多条数据;方式二不行
- 方式一支持子查询;方式二不支持。(insert into select将结果集插入表中)
106
修改多表的记录
sql92:
1 |
|
sql 99:
1 |
|
107
整个表删除:
DELETE FROM 表名;
TRUNCATE TABLE 表名;
108
多表级联删除
sql92
1 |
|
sql99
1 |
|
109
注意:TRUNCATE语句加WHERE会报错!只能单独使用。
- TRUNCATE与DELETE的区别:
- 前者不能加WHERE,后者可以。
- 前者效率高于后者
- 假如要删除的表中有自增长列,如果用DELETE删除后,自增长列的值从断点开始;而TRUNCATE删除后,再插入数据,自增长列的值从1开始。
- TRUNCATE删除没有返回值,而DELETE有返回值。
- TRUNCATE删除不能回滚,而DELETE删除后可以回滚。
110
联合也可以实现多行数据插入操作。(INSERT INTO 表名 SELECT …… UNION SELECT ……UNION……)
111
库已存在,再次创建会报错。
优化:
1 |
|
112
修改列名
1 |
|
修改列的类型或约束
1 |
|
添加新列
1 |
|
删除列
1 |
|
修改表名
1 |
|
115
1 |
|
116
表的复制
1 |
|
118
Tinyint:1字节
Smallint:2字节
Mediumint:3字节
Int\Integer:4字节
Bigint:8字节
整型的特点:
- 如果不设置无符号还是有符号,默认是有符号,如果想设置无符号数,需要添加unsigned关键字。
- 如果插入的数值超出了整型的范围,会警告out of range,默认插入临界值。
- 如果不设置长度,会有默认的长度。(INT(9))
- INT(长度)搭配ZEROFILL关键字,默认长度不会改变存储范围,只是显示的时候会有不同,显示位数不足会自动补0。
浮点数
- float:4字节
- double:8字节
定点型
- DEC(M,D)
- DECIMAL(M,D)
float、double中M\D可以省略,会随着插入值的精度来决定精度。
DECIMAL虽然声明时可以省略,但是会被默认置为(10,0),。
M:整数部位和小数部位的总位数,超出范围插入临界值。
D:小数点后的位数。
定点型的精度会更高。
所选择的类型越简单越好,越节约空间越好。
121
较短的文本
char:长度省略,默认为1
varchar:比较节省空间,但是效率相对较低,声明时长度不可省略。
当字符没有到达限定长度,字符有多长,分配多长的存储空间。
较长的文本
- text
- blob
位类型
bit
binary:包含二进制字符串,下同。
varbinary
枚举类型:
ENUM(‘A’,’B’,’C’);
不区分大小写
要求插入值必须属于列表中指定的值之一。
SET类型:
用于保存集合
不区分大小写
SET可以一次选取多个成员,而ENUM只能选一个
根据成员的个数不同,存储所占的字节数也不同。
1 |
|
122
日期型
DATE
DATETIME:8字节,1000-9999
TIME
YEAR
TIMESTAMP:4字节,1970-2038,范围较小,属性容易受Mysql版本和SQLMode的影响,时间戳,占用空间较小。
设置时区:
1 |
|
125
常见约束:一种限制,用于限制表中的数据的准确性和可靠性。
NOT NULL(非空约束):保证该字段的值不能为空。
DEFAULT:用于保证该字段有默认值。
PRIMARY KEY:主键,用于保证该字段的唯一性,并且非空。
UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空.
CHECK:mysql中不支持,检查约束。
FOREIGN KEY:外键约束。
在从表添加外键约束,用于引用主表中的某值。
添加时机:创建、修改表(modify)
列级约束:六大约束语法都支持,但外键没有效果。
表级约束:除了非空和默认,其他都支持。
主键、外键、唯一键,自动生成索引
唯一键:
1 |
|
检查键:
1 |
|
允许组合主键和组合唯一键,但不推荐。
主键的关联列必须是一个KEY,一般是主键或唯一键。
插入数据,先插主表,再插从表。
删除先删从表,再删主表。
130
添加列级约束:MODIFY
添加表级约束:ALTER TABLE 表名 ADD PRIMARY KEY(列名);
131
1.删除非空约束
1 |
|
2.删除默认约束:
1 |
|
3.删除主键:
1 |
|
4.删除唯一键:
1 |
|
5.删除外键
1 |
|
6.添加外键
1 |
|
132
标识列:自增长列:可以不用手动插值,系统提供默认的序列值。
1.创建表时设置标识列
1 |
|
1 |
|
特点:
标识列必须和主键搭配吗?不一定,但要求是一个键,比如唯一键也可以。
一个表可以有几个标识列?至多一个。
标识列的类型:只能是数值型,float都可以。
标识列设置步长:SET AUTO_INCREMENT_INCREMENT = ? / 手动设置
134
TCL语句:Transation Control Language,事务控制语言。
事务:一个或者一组sql组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
在mysql中的数据用各种不同的技术存储在文件中(内存中)。
SHOW ENGINES:查看mysql支持的存储引擎。
在mysql中用的最多的存储引擎有:innodb、myisam、memory等。其中innodb支持事务,而myisam、memory等不支持事务。
特点:事务特点—ACID
135
隐式事务:事务没有明显的开启和结束的标记。
如:insert、update、delete等。
Variable_name Value
autocommit ON(自动提交开启)
显示事务:事务具有明显的开启和结束的标记。
1 |
|
136
脏读
不可重复读
幻像读
丢失更新
1 |
|
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
read uncommitted | √ | √ | √ |
read committed | × | √ | √ |
repeatable read | × | × | √ |
serializable | × | × | × |
mysql默认为第三个隔离级别,repeatable read。
oracle默认为第二个隔离级别,read committed。
138
1 |
|
139
视图:虚拟表,和普通表一样。
mysql5.1版本出现的新特性,是通过表动态生成的数据,只保存了sql逻辑,不保存查询结果。
1 |
|
修改视图:
1 |
|
1 |
|
删除视图
1 |
|
修改视图:把视图当做表进行操作。
插入
1 |
|
修改
删除
如果不希望更改视图,可以为其添加权限
- 具备以下特点的视图,实际上不允许更新:
- 包含以下关键字的sql语句:分组函数、distinct、group by、having、union、union all
- 常量视图
- SELECT中包含子查询
- JOIN
- FROM 一个不能更新的视图
- WHERE子句的子查询引用了FROM子句中的表。
148
删除主表记录:
- 级联删除
1 |
|
- 级联置空
1 |
|
唯一键
添加唯一
1 |
|
删除唯一
1 |
|
149
- 变量
- 系统变量
- 全局变量
- 会话变量
- 自定义变量
- 用户变量
- 局部变量
- 系统变量
1 |
|
1 |
|
1 |
|
作用域 | 定义和使用的位置 | 语法 | |
---|---|---|---|
用户变量 | 当前会话 | 会话中的任何地方 | 添加加@符号,不用限定类型 |
系统变量 | BEGIN END中 | 只能在BEGIN END中,且为第一句话 | 一般不用加@符号,需要限定类型 |
1 |
|
155
存储过程与函数
提高代码重用性、简化操作、减少编译次数、减少了和数据库服务器的连接次数,提高了效率。
1 |
|
157
1 |
|
158
创建带in模式参数的存储过程
1 |
|
1 |
|
159
创建带out模式的存储过程
1 |
|
一个存储过程,也支持多个OUT变量返回。
160
创建带inout模式参数的存储过程
1 |
|
162
删除存储过程:DROP PROCEDURE 存储过程名称;(一次只能删除一个存储过程)
163
查看存储过程
1 |
|
165
1 |
|
1 |
|
166
查看函数
1 |
|
删除存储过程
1 |
|
170
流程控制结构
顺序结构:程序从上往下执行。
分支结构:程序从两条或多条路径中选择一条去执行。
循环结构:满足一定条件的基础上,重复执行一段代码。
分支结构
IF函数
功能:实现简单的双分支
语法:
1
2
3SELECT IF(表达式1,表达式2,表达式3);
# 执行:表达式1成立,返回表达式2,否则返回表达式3
# 应用:任何地方。
case结构
情况一:类似于JAVA中的SWITCH语句,一般用于实现等值判断。
1
2
3
4
5
6case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1
when 常量2 then 要显示的值2或语句2
……
else 要返回的值n或语句n
end CASE;情况二:类似于JAVA中的多重IF语句,一般用于实现区间判断。
1
2
3
4
5
6case
when 要判断的条件1 then 要显示的值1或语句1;
when 要判断的条件2 then 要显示的值2或语句2;
……
else 要返回的值n或语句n;
end CASE;
特点:
1.可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,BEGIN END 中,或BEGIN END外面
也可以作为独立的语句去使用,只能放在BEGIN END中
2.如果WHEN中的值满足或条件成立,则执行对应的THEN后面的语句,并结束CASE
如果都不满足,则执行ELSE中的语句或值
3.ELSE可以省略,如果省略了ELSE,并且WHEN中的条件都不满足,则返回NULL
1
2
3
4
5
6
7
8
9CREATE PROCEDURE test_case(IN score)
BEGIN
CASE
WHEN score >= 90 AND score<= 100 THEN SELECT 'A';
WHEN score >= 80 THEN SELECT 'B';
WHEN score >= 70 THEN SELECT 'C';
ELSE SELECT 'D';
END CASE;
END
173
if结构
功能:实现多重分支
语法:
1
2
3
4
5if 条件1 then 语句1;
elseif 条件2 then 语句2;
……
[else 语句n;]
end if;只能用于BEGIN END中
案例:根据传入的成绩,来返回级别。
1
2
3
4
5
6
7
8CREATE FUNCTION test_if(score INT) RETURNS CHAR
BEGIN
IF score >= 90 and score <= 100 THEN RETURN 'A';
ELSEIF score >= 80 THEN RETURN 'B';
ELSEIF score >= 60 THEN RETURN 'C';
ELSE RETURN 'D';
END IF;
END;
174
循环结构
分类:
- WHILE
- LOOP
- REPEAT
循环控制:
- leave(类似于break,跳出,结束当前所在循环)
- iterate(类似于continue,结束本次循环,继续下一次循环)
语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14# WHILE
[标签:]WHILE 循环条件 DO
循环体;
END WHILE [标签];
# LOOP:可以用来模拟简单的死循环
【标签:】LOOP
循环体;
END LOOP [标签];
# REPEAT
【标签:】REPEAT
循环体;
UNTIL 结束循环的条件 【标签】;案例:批量插入,根据次数插入到admin表中
1
2
3
4
5
6
7
8
9CREATE PROCEDURE test_while(IN count INT)
BEGIN
DECLARE i INT;
SET i = 1;
WHILE i <= count DO
INSERT INTO admin VALUES(……);
SET i = i + 1;
END WHILE;
END;添加leave
如果次数大于20则停止。
1
2
3
4
5
6
7
8
9
10
11CREATE PROCEDURE test_while(IN count INT)
BEGIN
DECLARE i INT;
SET i = 1;
a:WHILE i <= count DO
INSERT INTO admin VALUES(……);
SET i = i + 1;
IF i >= 20 THEN leave a;
END IF;
END WHILE;
END;添加iterate语句
插入偶数次
1
2
3
4
5
6
7
8
9
10
11CREATE PROCEDURE test_while(IN count INT)
BEGIN
DECLARE i INT;
SET i = 0;
a:WHILE i <= count DO
SET i = i + 1;
IF MOD(i,2)!=0 THEN iterate a;
END IF;
INSERT INTO admin VALUES(……);
END WHILE;
END;
MySQL高级
MySql的架构介绍
- mysql简介
- mysql linux版的安装
- mysql配置文件
- mysql逻辑架构介绍
- mysql存储引擎
索引优化分析
- 性能下降SQL慢:执行时间长、等待时间长
- 常见通用的JOIN查询
- 索引简介
- 性能分析
- 索引优化(SQL调优)
查询截取分析
- 查询优化
- 慢查询日志
- 批量数据脚本
- Show Profile
- 全局查询日志
主从复制
- 复制基本原理
- 复制基本原则
- 复制的最大问题
- 主从常见配置
MySql锁机制
- 行锁
- 表锁
- 页锁
02 MySql简介
MySQL是一个关系型数据库管理 系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。
MySQL是一种关系数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内, 这样就增加了速度并提高了灵活性。
Mysq|是开源的,所以你不需要支付额外的费用。
Mysq是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。
Mysq|支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
MySQL使用标准的SQL数据语言形式。
Mysq可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、 Java、 Perl、 PHP、 Eiffel、 Ruby和Tcl等。
MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB, 64位系统支持最大的表文件为8TB。
后端向数据库开发转型。
- 数据库内部结构和原理
- 数据库建模优化
- 数据库索引建立
- SQL语句优化
- SQL编程(自定义函数、存储过程、触发器、定时任务)
- mysq|服务器的安装配置
- 数据库的性能监控分析与系统优化
- 各种参数常量设定
- 主从复制
- 分布式架构搭建、垂直切割和水平切割
- 数据迁移
- 容灾备份和恢复
- shell或python等脚本语言开发
- 对开源数据库进行二次开发
03 RPM安装
1 |
|
灯火阑珊