MySql进阶教程
全部的PDF笔记: https://qingling.icu/posts/50465.html
原视频地址: 黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括
一.Mysql入门
1.SQL
全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 。
1.1 SQL通用语法
1.2 SQL分类
1.3 DDL-数据定义语言
连接本地mysql的命令
1 | mysql -u root -p |
常用的DDL操作
1 | -- ------------------------------------------------------数据库的操作------------------------------------------------------------------------ |
Mysql的数据类型
数值数据类型
字符串数据类型
日期时间类型
1.4 DML-数据操作语言
1 | -- ------------------------------------------------DML-增删改操作--------------------------------------------------- |
1.5 DQL-数据查询语言
- 基本查询(不带任何条件)
- 条件查询(WHERE)
- 聚合函数(count、max、min、avg、sum)
- 分组查询(group by)
- 排序查询(order by)
- 分页查询(limit
测试数据准备
1 | -- 数据准备 |
1.5.1 基础查询
1 | -- 查看插入的数据 |
1.5.2 条件查询
语法: SELECT 字段列表 FROM 表名 WHERE 条件列表 ;
举例
1 | -- 条件查询 |
1.5.3 聚合函数
语法: SELECT 聚合函数(字段列表) FROM 表名 ;
注意 : NULL值是不参与所有聚合函数运算的
1 | -- 聚合函数 |
1.5.4 分组查询
语法: SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组 后过滤条件 ];
where与having区别
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤
- 判断条件不同:where不能对聚合函数进行判断,而having可以
注意事项:
• 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
• 执行顺序: where > 聚合函数 > having 。
• 支持多字段分组, 具体语法为 : group by columnA,columnB
1 | -- 分组查询 |
1.5.5 排序查询
语法: SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;
注意事项:
• 如果是升序, 可以不指定排序方式ASC,因为升序ASC是默认值 ;
• 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;
1 | -- 排序查询 |
1.5.6 分页查询
语法: SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
注意事项:
• 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
• 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
• 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
1 | -- 分页查询 |
1.5.7 DQL语句案例
1 | -- DQL语句案例 |
1.5.8 执行顺序
总结
1.6 DCL-数据控制语言
1.6.1 管理用户
查询用户: select * from mysql.user;
创建用户:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
修改用户密码: ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ;
删除用户:DROP USER '用户名'@'主机名' ;
注意事项:
• 在MySQL中需要通过用户名@主机名的方式,来唯一标识一个用户• 主机名可以使用 % 通配
• 这类SQL开发人员操作的比较少,主要是DBA( Database Administrator 数据库管理员)使用
1 | -- 切换到系统中自带的mysql数据库 |
1.6.2 权限控制
查询权限: SHOW GRANTS FOR '用户名'@'主机名' ;
授予权限: GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
撤销权限: REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
注意事项:
• 多个权限之间,使用逗号分隔
• 授权时, 数据库名和表名可以使用 * 进行通配,代表所有
1 | -- 权限控制 |
总结
全部的SQL
1 | -- ------------------------------------------------------数据库的操作------------------------------------------------------------------------ |
2.函数
2.1 字符串函数
1 | -- concat函数(字符串拼接) |
案例
1 | -- 由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0 比如:1号员工的工号应该为00001 |
2.2 数值函数
1 | -- 数值函数 |
案例
1 | -- 通过数据库函数生成一个的随机的六位验证码 |
2.3 日期函数
1 | -- 日期函数 |
案例
1 | -- 查询所有员工的入职天数,并根据入职天数倒叙排序 |
2.4 流程函数
1 | -- 流程控制函数 |
案例
1 | -- 案例:统计班级各个学员的成绩,展示规则如下: |
函数相关的全部sql
1 | -- ----------------------------------------------------------函数-------------------------------------------------------- |
3.约束
3.1 概述
概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中数据的正确、有效性和完整性。
分类 :
3.2 约束演示
案例需求: 根据需求,完成表结构的创建,需求如下:
对应的建表语句为:
1 | create table tb_user( |
3.3 外键约束
3.3.1 介绍
3.3.2 语法
建立外键: ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) ;
删除外键: ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
举例
1 | -- 外键约束 |
3.3.3 删除/更新行为
详细介绍见PDF文件 https://qingling.icu/posts/50465.html
添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:
具体语法为:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
约束相关的sql
1 | -- ---------------------------------------------------约束演示------------------------------------------------------------ |
4.多表查询
4.1 多表关系
一对多
多对多
一对一
1 | -- 多表关系 |
4.2 多表查询概述
4.2.1 数据准备
1 | -- 数据准备 |
4.2.2 概述
4.2.3 分类
4.3 内连接
1 | -- 内连接演示 |
一旦为表起了别名,就不能再使用表名来指定对应的字段了,此时只能够使用别名来指定字段。
4.4 外连接
1 | -- 外连接 |
注意事项:左外连接和右外连接是可以相互替换的,只需要调整在连接查询时SQL中,表结构的先后顺序就可以了。而我们在日常开发使用时,更偏向于左外连接。
4.5 自连接
1 | -- 自连接 |
4.6 联合查询
1 | -- 联合查询 |
union all查询出来的结果,仅仅进行简单的合并,并未去重
union 联合查询,会对查询出来的结果进行去重处理
4.7 子查询
标量子查询
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。常用的操作符:= <> > >= < <=
1 | -- 标量子查询 |
列子查询
子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。常用的操作符:IN 、NOT IN 、 ANY 、SOME 、 ALL
1 | -- 列子查询 |
行子查询
子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。常用的操作符:= 、<> 、IN 、NOT IN
1 | -- 行子查询 |
表子查询
子查询返回的结果是多行多列,这种子查询称为表子查询。常用的操作符:IN
1 | -- 表子查询 |
多表查询相关的sql语句
1 | -- ---------------------------------------------多表查询-------------------------------------------------------- |
4.8 多表查询案例
题目
数据准备
1 | -- 数据准备 |
题解
1 | -- 题解 |
总结
5.事务
5.1 事务介绍
事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。就比如: 张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加1000。 这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。
注意: 默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐式的提交事务。
5.2 事务操作
数据准备
1 | -- 数据准备 |
控制事务一
控制事务二
1 | -- 开启事务 |
5.3 事务四大特性
5.4 并发事务问题
5.5 事务隔离级别
为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别,主要有以下几种:
“X” 表示不会出现
1 | -- 查看事务隔离级别 |
小结
基础篇全部的Sql
1 | -- ------------------------------------------------------数据库的操作------------------------------------------------------------------------ |
二.MySql进阶
1.存储引擎
1.1 MySql的体系结构
1.2 存储引擎简介
简介
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的,而不是 基于库的,所以存储引擎也可被称为表类型。我们可以在创建表的时候,来指定选择的存储引擎,如果 没有指定将自动选择默认的存储引擎。
查询一张数据库表的建表语句
1 | -- 查询建表语句 |
建表的时候指定存储引擎的语句
1.3 存储引擎特点
存储引擎的区别
1.4 存储引擎的选择
在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据 实际情况选择多种存储引擎进行组合。
- InnoDB: 是Mysql的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要 求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操 作,那么InnoDB存储引擎是比较合适的选择。
- MyISAM : 如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完 整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。(例如评论的数据、日志相关的数据、电商中足迹相关的数据)
- MEMORY:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。MEMORY的缺陷就是 对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性。
一句话:项目中绝大多数的时候使用的都是InnoDB
2.索引
2.1 索引概述
2.1.1 介绍
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
2.1.2 演示
注:下面的二叉树并不是一个真实的索引结构,而是一个举例
2.1.3 优缺点
2.2 索引结构
2.2.1 索引的数据结构有哪些
默认的索引结构是B+树索引结构
不同类型的存储引擎对不同的索引结构的支持情况
2.2.2 B+树的索引数据结构
二叉树和红黑树的不足
B树
B+树
MySql中的B+树结构
2.2.3 hash的索引数据结构
2.3.4 思考题
2.3 索引分类
当我们要查询name值是Arm的数据的时候,会先通过二级索引查询,然后通过聚集索引查询这一行的信息(回表查询)
思考题
第一条的执行效率高,第二条要回表查询(先查询name所在行对应的主键id,然后通过主键id查询这一行的数据)
2.4 索引语法
创建|查看|删除语法
举例
2.5 SQL性能分析
2.5.1 SQL执行频率
1 | -- 查看系统的状态信息 |
2.5.2 慢查询日志
1 | -- 查询慢查询日志是否开启 |
2.5.3 profile详情
1 | -- 是否支持profile详情功能 |
2.5.4 explain执行计划
2.6 索引使用
2.6.1 验证索引效率
现在有一个有着10000000数据的表(tb_sku),我们根据sn这一字段查询某一条具体的数据,没有建立索引之前的查询耗费的时间是20多秒,建立索引耗费大约90秒,为sn字段建立索引之后,查询耗费时间大概是零点几秒。
2.6.2 最左前缀法则
2.6.3 索引失效的情况
2.6.4 SQL提示
2.6.5 覆盖索引
2.6.6 前缀索引
2.6.7 单例索引与联合索引的选择问题
2.7 索引设计原则
3.SQL优化
3.1 插入数据的优化
100万的数据如果使用insert插入的话需要10分钟左右,如果使用文件的方式导入,只需要10多秒。
3.2 主键优化
3.3 order by优化
3.4 group by优化
3.5 limit优化
3.6 count优化
3.7 update优化
3.8 总结
4.视图/存储过程/触发器
4.1 视图
4.1.1 视图介绍
视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。
4.1.2 语法
创建
1 | CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [CASCADED | LOCAL ] CHECK OPTION ] |
查询
1 | 查看创建视图语句:SHOW CREATE VIEW 视图名称; |
修改
1 | 方式一:CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] |
删除
1 | DROP VIEW [IF EXISTS] 视图名称 [,视图名称] ... |
演示示例
1 | -- 视图 |
4.1.3 检查选项
当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入,更新,删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项: CASCADED 和 LOCAL,默认值为 CASCADED 。
1.CASCADED 级联
比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 cascaded,但是v1视图创建时未指定检查选项。 则在执行检查时,不仅会检查v2,还会级联检查v2的关联视图v1。
2.LOCAL 本地
比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 local ,但是v1视图创建时未指定检查选项。 则在执行检查时,知会检查v2,不会检查v2的关联视图v1。
1 | -- 检查选项 |
4.1.4 视图更新
要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新:
A. 聚合函数或窗口函数(SUM()、 MIN()、 MAX()、 COUNT()等)
B. DISTINCT
C. GROUP BY
D. HAVING
E. UNION 或者 UNION ALL
4.1.5 视图作用
4.1.6 视图案例
tb_user表结构以及sql语句
1 | create table tb_user( |
案例
1 | -- 视图案例 |
4.2 存储过程
4.2.1 介绍
4.2.2 基本语法
创建
1 | CREATE PROCEDURE 存储过程名称 ([ 参数列表 ]) |
调用
1 | CALL 名称 ([ 参数 ]); |
查看
1 | SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'xxx'; -- 查询指定数据库的存储过程及状态信息 |
删除
1 | DROP PROCEDURE [ IF EXISTS ] 存储过程名称 ; |
注意:
在命令行中,执行创建存储过程的SQL时,需要通过关键字 delimiter 指定SQL语句的结束符
演示示例
1 | -- 存储过程 |
4.2.3 变量
在MySQL中变量分为三种类型: 系统变量、用户定义变量、局部变量
4.2.3.1 系统变量
系统变量 是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)、会话 变量(SESSION)
1.查看系统变量
1 | SHOW [ SESSION | GLOBAL ] VARIABLES ; -- 查看所有系统变量 |
2.设置系统变量
1 | SET [ SESSION | GLOBAL ] 系统变量名 = 值 ; |
注意:
如果没有指定SESSION/GLOBAL,默认是SESSION,会话变量
1 mysql服务重新启动之后,所设置的全局参数会失效,要想不失效,可以在 /etc/my.cnf 中配置
A. 全局变量(GLOBAL): 全局变量针对于所有的会话
B. 会话变量(SESSION): 会话变量针对于单个会话,在另外一个会话窗口就不生效了
演示示例
1 | -- 系统变量 |
4.2.3.2 用户定义变量
用户定义变量 是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用 “@变量 名” 使用就可以。其作用域为当前连接
1.赋值
方式一:
1 | SET @var_name = expr [, @var_name = expr] ... ; |
赋值时,可以使用 = ,也可以使用 :=
方式二:
1 | SELECT @var_name := expr [, @var_name := expr] ... ; |
2.使用
1 | SELECT @var_name ; |
注意: 用户定义的变量无需对其进行声明或初始化,只不过获取到的值为NULL
演示示例
1 | -- 用户定义变量 |
4.2.3.3 局部变量
局部变量 是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的 局部变量和输入参数,局部变量的范围是在其内声明的BEGIN … END块
1**.声明**
1 | DECLARE 变量名 变量类型 [DEFAULT ... ] ; |
变量类型就是数据库字段类型:INT、BIGINT、CHAR、VARCHAR、DATE、TIME等
2.赋值
1 | SET 变量名 = 值 ; |
演示示例
1 | -- 局部变量 |
4.2.4 if判断
介绍
if 用于做条件判断,具体的语法结构为:
1 | IF 条件1 THEN |
在if条件判断的结构中,ELSE IF 结构可以有多个,也可以没有. ELSE结构可以有,也可以没有.
案例
根据定义的分数score变量,判定当前分数对应的分数等级
score >= 85分,等级为优秀
score >= 60分 且 score < 85分,等级为及格
score < 60分,等级为不及格
1 | -- if判断 |
4.2.5 参数
介绍
参数的类型,主要分为以下三种:IN、OUT、INOUT. 具体的含义如下:
语法
1 | CREATE PROCEDURE 存储过程名称 ([ IN/OUT/INOUT 参数名 参数类型 ]) |
案例
1.根据传入的分数score变量,判定当前分数对应的分数等级,并返回
score >= 85分,等级为优秀
score >= 60分 且 score < 85分,等级为及格
score < 60分,等级为不及格
1 | -- 参数 |
2.将传入的200分制的分数,进行换算,换成百分制,然后返回
1 | -- 2.将传入的200分制的分数,进行换算,换成百分制,然后返回 |