diff --git a/DB.md b/DB.md
index e9b0d2c..7fd57da 100644
--- a/DB.md
+++ b/DB.md
@@ -33,7 +33,7 @@
参考视频:https://www.bilibili.com/video/BV1zJ411M7TB
-参考文章:https://time.geekbang.org/column/intro/139
+参考专栏:https://time.geekbang.org/column/intro/139
参考书籍:https://book.douban.com/subject/35231266/
@@ -127,204 +127,6 @@ MySQL 配置:
-***
-
-
-
-### 常用工具
-
-#### mysql
-
-mysql 不是指 mysql 服务,而是指 mysql 的客户端工具
-
-```sh
-mysql [options] [database]
-```
-
-* -u --user=name:指定用户名
-* -p --password[=name]:指定密码
-* -h --host=name:指定服务器IP或域名
-* -P --port=#:指定连接端口
-* -e --execute=name:执行SQL语句并退出,在控制台执行SQL语句,而不用连接到数据库执行
-
-示例:
-
-```sh
-mysql -h 127.0.0.1 -P 3306 -u root -p
-mysql -uroot -p2143 db01 -e "select * from tb_book";
-```
-
-
-
-***
-
-
-
-#### admin
-
-mysqladmin 是一个执行管理操作的客户端程序,用来检查服务器的配置和当前状态、创建并删除数据库等
-
-通过 `mysqladmin --help` 指令查看帮助文档
-
-```sh
-mysqladmin -uroot -p2143 create 'test01';
-```
-
-
-
-***
-
-
-
-#### binlog
-
-服务器生成的日志文件以二进制格式保存,如果需要检查这些文本,就要使用 mysqlbinlog 日志管理工具
-
-```sh
-mysqlbinlog [options] log-files1 log-files2 ...
-```
-
-* -d --database=name:指定数据库名称,只列出指定的数据库相关操作
-
-* -o --offset=#:忽略掉日志中的前 n 行命令。
-
-* -r --result-file=name:将输出的文本格式日志输出到指定文件。
-
-* -s --short-form:显示简单格式,省略掉一些信息。
-
-* --start-datatime=date1 --stop-datetime=date2:指定日期间隔内的所有日志
-
-* --start-position=pos1 --stop-position=pos2:指定位置间隔内的所有日志
-
-
-
-***
-
-
-
-#### dump
-
-##### 命令介绍
-
-mysqldump 客户端工具用来备份数据库或在不同数据库之间进行数据迁移,备份内容包含创建表,及插入表的 SQL 语句
-
-```sh
-mysqldump [options] db_name [tables]
-mysqldump [options] --database/-B db1 [db2 db3...]
-mysqldump [options] --all-databases/-A
-```
-
-连接选项:
-
-* -u --user=name:指定用户名
-* -p --password[=name]:指定密码
-* -h --host=name:指定服务器 IP 或域名
-* -P --port=#:指定连接端口
-
-输出内容选项:
-
-* --add-drop-database:在每个数据库创建语句前加上 Drop database 语句
-* --add-drop-table:在每个表创建语句前加上 Drop table 语句 , 默认开启,不开启 (--skip-add-drop-table)
-* -n --no-create-db:不包含数据库的创建语句
-* -t --no-create-info:不包含数据表的创建语句
-* -d --no-data:不包含数据
-* -T, --tab=name:自动生成两个文件:一个 .sql 文件,创建表结构的语句;一个 .txt 文件,数据文件,相当于 select into outfile
-
-示例:
-
-```sh
-mysqldump -uroot -p2143 db01 tb_book --add-drop-database --add-drop-table > a
-mysqldump -uroot -p2143 -T /tmp test city
-```
-
-
-
-***
-
-
-
-##### 数据备份
-
-命令行方式:
-
-* 备份命令:mysqldump -u root -p 数据库名称 > 文件保存路径
-
-* 恢复
- 1. 登录MySQL数据库:`mysql -u root p`
- 2. 删除已经备份的数据库
- 3. 重新创建与备份数据库名称相同的数据库
- 4. 使用该数据库
- 5. 导入文件执行:`source 备份文件全路径`
-
-图形化界面:
-
-* 备份
-
- 
-
-* 恢复
-
- 
-
-
-
-
-
-***
-
-
-
-#### import
-
-mysqlimport 是客户端数据导入工具,用来导入mysqldump 加 -T 参数后导出的文本文件
-
-```sh
-mysqlimport [options] db_name textfile1 [textfile2...]
-```
-
-示例:
-
-```sh
-mysqlimport -uroot -p2143 test /tmp/city.txt
-```
-
-导入 sql 文件,可以使用 MySQL 中的 source 指令 :
-
-```mysql
-source 文件全路径
-```
-
-
-
-***
-
-
-
-#### show
-
-mysqlshow 客户端对象查找工具,用来很快地查找存在哪些数据库、数据库中的表、表中的列或者索引
-
-```sh
-mysqlshow [options] [db_name [table_name [col_name]]]
-```
-
-* --count:显示数据库及表的统计信息(数据库,表 均可以不指定)
-
-* -i:显示指定数据库或者指定表的状态信息
-
-示例:
-
-```sh
-#查询每个数据库的表的数量及表中记录的数量
-mysqlshow -uroot -p1234 --count
-#查询test库中每个表中的字段书,及行数
-mysqlshow -uroot -p1234 test --count
-#查询test库中book表的详细情况
-mysqlshow -uroot -p1234 test book --count
-```
-
-
-
***
@@ -333,7 +135,7 @@ mysqlshow -uroot -p1234 test book --count
-## 体系结构
+## 体系架构
### 整体架构
@@ -362,7 +164,7 @@ mysqlshow -uroot -p1234 test book --count
- 数据存储层,主要是将数据存储在文件系统之上,并完成与存储引擎的交互
- File System:文件系统,保存配置文件、数据文件、日志文件、错误文件、二进制文件等
-
+
@@ -370,12 +172,10 @@ mysqlshow -uroot -p1234 test book --count
-### 执行流程
+### 建立连接
#### 连接器
-##### 连接原理
-
池化技术:对于访问数据库来说,建立连接的代价是比较昂贵的,因为每个连接对应一个用来交互的线程,频繁的创建关闭连接比较耗费资源,有必要建立数据库连接池,以提高访问的性能
连接建立 TCP 以后需要做**权限验证**,验证成功后可以进行执行 SQL。如果这时管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限,只有再新建的连接才会使用新的权限设置
@@ -384,7 +184,25 @@ MySQL 服务器可以同时和多个客户端进行交互,所以要保证每
整体的执行流程:
-
+
+
+
+
+***
+
+
+
+#### 权限信息
+
+grant 语句会同时修改数据表和内存,判断权限的时候使用的是内存数据
+
+flush privileges 语句本身会用数据表(磁盘)的数据重建一份内存权限数据,所以在权限数据可能存在不一致的情况下使用,这种不一致往往是由于直接用 DML 语句操作系统权限表导致的,所以尽量不要使用这类语句
+
+
+
+
+
+
@@ -392,7 +210,7 @@ MySQL 服务器可以同时和多个客户端进行交互,所以要保证每
-##### 连接状态
+#### 连接状态
客户端如果长时间没有操作,连接器就会自动断开,时间是由参数 wait_timeout 控制的,默认值是 8 小时。如果在连接被断开之后,客户端**再次发送请求**的话,就会收到一个错误提醒:`Lost connection to MySQL server during query`
@@ -403,14 +221,14 @@ MySQL 服务器可以同时和多个客户端进行交互,所以要保证每
* 定期断开长连接,使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连
```mysql
- kill connection id
+ KILL CONNECTION id
```
* MySQL 5.7 版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源,这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态
SHOW PROCESSLIST:查看当前 MySQL 在进行的线程,可以实时地查看 SQL 的执行情况,其中的 Command 列显示为 Sleep 的这一行,就表示现在系统里面有一个空闲连接
-
+
| 参数 | 含义 |
| ------- | ------------------------------------------------------------ |
@@ -423,12 +241,18 @@ SHOW PROCESSLIST:查看当前 MySQL 在进行的线程,可以实时地查看
| State | 显示使用当前连接的 sql 语句的状态,以查询为例,需要经过 copying to tmp table、sorting result、sending data等状态才可以完成 |
| Info | 显示执行的 sql 语句,是判断问题语句的一个重要依据 |
+**Sending data 状态**表示 MySQL 线程开始访问数据行并把结果返回给客户端,而不仅仅只是返回给客户端,是处于执行器过程中的任意阶段。由于在 Sending data 状态下,MySQL 线程需要做大量磁盘读取操作,所以是整个查询中耗时最长的状态
+
+
+
***
+### 执行流程
+
#### 查询缓存
##### 工作流程
@@ -440,7 +264,7 @@ SHOW PROCESSLIST:查看当前 MySQL 在进行的线程,可以实时地查看
1. 客户端发送一条查询给服务器
2. 服务器先会检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果(一般是 K-V 键值对),否则进入下一阶段
3. 分析器进行 SQL 分析,再由优化器生成对应的执行计划
-4. MySQL 根据优化器生成的执行计划,调用存储引擎的 API 来执行查询
+4. 执行器根据优化器生成的执行计划,调用存储引擎的 API 来执行查询
5. 将结果返回给客户端
大多数情况下不建议使用查询缓存,因为查询缓存往往弊大于利
@@ -456,7 +280,7 @@ SHOW PROCESSLIST:查看当前 MySQL 在进行的线程,可以实时地查看
##### 缓存配置
-1. 查看当前的 MySQL 数据库是否支持查询缓存:
+1. 查看当前 MySQL 数据库是否支持查询缓存:
```mysql
SHOW VARIABLES LIKE 'have_query_cache'; -- YES
@@ -493,7 +317,7 @@ SHOW PROCESSLIST:查看当前 MySQL 在进行的线程,可以实时地查看
SHOW STATUS LIKE 'Qcache%';
```
-
+
| 参数 | 含义 |
| ----------------------- | ------------------------------------------------------------ |
@@ -575,7 +399,7 @@ SELECT * FROM t WHERE id = 1;
解析器:处理语法和解析查询,生成一课对应的解析树
* 先做**词法分析**,输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么代表什么。从输入的 select 这个关键字识别出来这是一个查询语句;把字符串 t 识别成 表名 t,把字符串 id 识别成列 id
-* 然后做**语法分析**,根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。如果你的语句不对,就会收到 `You have an error in your SQL syntax` 的错误提醒
+* 然后做**语法分析**,根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。如果语句不对,就会收到 `You have an error in your SQL syntax` 的错误提醒
预处理器:进一步检查解析树的合法性,比如数据表和数据列是否存在、别名是否有歧义等
@@ -610,7 +434,7 @@ MySQL 中保存着两种统计数据:
* innodb_table_stats 存储了表的统计数据,每一条记录对应着一个表的统计数据
* innodb_index_stats 存储了索引的统计数据,每一条记录对应着一个索引的一个统计项的数据
-MySQL 在真正执行语句之前,并不能精确地知道满足条件的记录有多少条,只能根据统计信息来估算记录,统计信息就是索引的区分度,一个索引上不同的值的个数(比如性别只能是男女,就是 2 ),称之为基数(cardinality),**基数越大说明区分度越好**
+MySQL 在真正执行语句之前,并不能精确地知道满足条件的记录有多少条,只能根据统计信息来估算记录,统计信息就是索引的区分度,一个索引上不同的值的个数(比如性别只能是男女,就是 2 ),称之为基数(cardinality),**基数越大说明区分度越好**
通过**采样统计**来获取基数,InnoDB 默认会选择 N 个数据页,统计这些页面上的不同值得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数
@@ -666,11 +490,11 @@ MySQL 在真正执行语句之前,并不能精确地知道满足条件的记
#### 引擎层
-Server 层和存储引擎层的交互是**以记录为单位的**,存储引擎会将符合条件的单条记录返回给 Server 层做进一步处理,并不是直接返回所有的记录
+Server 层和存储引擎层的交互是**以记录为单位的**,存储引擎会将单条记录返回给 Server 层做进一步处理,并不是直接返回所有的记录
工作流程:
-* 首先根据二级索引选择扫描范围,获取第一条符合条件的记录,进行回表查询,将聚簇索引的记录返回 Server 层
+* 首先根据二级索引选择扫描范围,获取第一条符合二级索引条件的记录,进行回表查询,将聚簇索引的记录返回 Server 层,由 Server 判断记录是否符合要求
* 然后在二级索引上继续扫描下一个符合条件的记录
@@ -685,160 +509,5162 @@ Server 层和存储引擎层的交互是**以记录为单位的**,存储引擎
+### 终止流程
+#### 终止语句
-## 单表操作
+终止线程中正在执行的语句:
-### SQL
+```mysql
+KILL QUERY thread_id
+```
-- SQL
+KILL 不是马上终止的意思,而是告诉执行线程这条语句已经不需要继续执行,可以开始执行停止的逻辑(类似于打断)。因为对表做增删改查操作,会在表上加 MDL 读锁,如果线程被 KILL 时就直接终止,那这个 MDL 读锁就没机会被释放了
- - Structured Query Language:结构化查询语言
- - 定义了操作所有关系型数据库的规则,每种数据库操作的方式可能会存在不一样的地方,称为“方言”
+命令 `KILL QUERYthread_id_A` 的执行流程:
-- SQL 通用语法
+* 把 session A 的运行状态改成 THD::KILL_QUERY(将变量 killed 赋值为 THD::KILL_QUERY)
+* 给 session A 的执行线程发一个信号,让 session A 来处理这个 THD::KILL_QUERY 状态
- - SQL 语句可以单行或多行书写,以**分号结尾**。
- - 可使用空格和缩进来增强语句的可读性。
- - MySQL 数据库的 SQL 语句不区分大小写,**关键字建议使用大写**。
- - 数据库的注释:
- - 单行注释:-- 注释内容 #注释内容(mysql特有)
- - 多行注释:/* 注释内容 */
+会话处于等待状态(锁阻塞),必须满足是一个可以被唤醒的等待,必须有机会去**判断线程的状态**,如果不满足就会造成 KILL 失败
-- SQL 分类
+典型场景:innodb_thread_concurrency 为 2,代表并发线程上限数设置为 2
- - DDL(Data Definition Language)数据定义语言
+* session A 执行事务,session B 执行事务,达到线程上限;此时 session C 执行事务会阻塞等待,session D 执行 kill query C 无效
+* C 的逻辑是每 10 毫秒判断是否可以进入 InnoDB 执行,如果不行就调用 nanosleep 函数进入 sleep 状态,没有去判断线程状态
- - 用来定义数据库对象:数据库,表,列等。关键字:create、drop,、alter 等
+补充:执行 Ctrl+C 的时候,是 MySQL 客户端另外启动一个连接,然后发送一个 KILL QUERY 命令
- - DML(Data Manipulation Language)数据操作语言
- - 用来对数据库中表的数据进行增删改。关键字:insert、delete、update 等
- - DQL(Data Query Language)数据查询语言
+***
- - 用来查询数据库中表的记录(数据)。关键字:select、where 等
- - DCL(Data Control Language)数据控制语言
- - 用来定义数据库的访问权限和安全级别,及创建用户。关键字:grant, revoke等
+#### 终止连接
- 
+断开线程的连接:
+```mysql
+KILL CONNECTION id
+```
+断开连接后执行 SHOW PROCESSLIST 命令,如果这条语句的 Command 列显示 Killed,代表线程的状态是 KILL_CONNECTION,说明这个线程有语句正在执行,当前状态是停止语句执行中,终止逻辑耗时较长
-***
+* 超大事务执行期间被 KILL,这时回滚操作需要对事务执行期间生成的所有新数据版本做回收操作,耗时很长
+* 大查询回滚,如果查询过程中生成了比较大的临时文件,删除临时文件可能需要等待 IO 资源,导致耗时较长
+* DDL 命令执行到最后阶段被 KILL,需要删除中间过程的临时文件,也可能受 IO 资源影响耗时较久
+总结:KILL CONNECTION 本质上只是把客户端的 SQL 连接断开,后面的终止流程还是要走 KILL QUERY
+一个事务被 KILL 之后,持续处于回滚状态,不应该强行重启整个 MySQL 进程,应该等待事务自己执行完成,因为重启后依然继续做回滚操作的逻辑
-### DDL
-#### 数据库
-* R(Retrieve):查询
- * 查询所有数据库:
- ```mysql
- SHOW DATABASES;
- ```
+***
- * 查询某个数据库的创建语句
- ```sql
- SHOW CREATE DATABASE 数据库名称; -- 标准语法
-
- SHOW CREATE DATABASE mysql; -- 查看mysql数据库的创建格式
+
+### 常用工具
+
+#### mysql
+
+mysql 不是指 mysql 服务,而是指 mysql 的客户端工具
+
+```sh
+mysql [options] [database]
+```
+
+* -u --user=name:指定用户名
+* -p --password[=name]:指定密码
+* -h --host=name:指定服务器IP或域名
+* -P --port=#:指定连接端口
+* -e --execute=name:执行SQL语句并退出,在控制台执行SQL语句,而不用连接到数据库执行
+
+示例:
+
+```sh
+mysql -h 127.0.0.1 -P 3306 -u root -p
+mysql -uroot -p2143 db01 -e "select * from tb_book";
+```
+
+
+
+***
+
+
+
+#### admin
+
+mysqladmin 是一个执行管理操作的客户端程序,用来检查服务器的配置和当前状态、创建并删除数据库等
+
+通过 `mysqladmin --help` 指令查看帮助文档
+
+```sh
+mysqladmin -uroot -p2143 create 'test01';
+```
+
+
+
+***
+
+
+
+#### binlog
+
+服务器生成的日志文件以二进制格式保存,如果需要检查这些文本,就要使用 mysqlbinlog 日志管理工具
+
+```sh
+mysqlbinlog [options] log-files1 log-files2 ...
+```
+
+* -d --database=name:指定数据库名称,只列出指定的数据库相关操作
+
+* -o --offset=#:忽略掉日志中的前 n 行命令。
+
+* -r --result-file=name:将输出的文本格式日志输出到指定文件。
+
+* -s --short-form:显示简单格式,省略掉一些信息。
+
+* --start-datatime=date1 --stop-datetime=date2:指定日期间隔内的所有日志
+
+* --start-position=pos1 --stop-position=pos2:指定位置间隔内的所有日志
+
+
+
+***
+
+
+
+#### dump
+
+##### 命令介绍
+
+mysqldump 客户端工具用来备份数据库或在不同数据库之间进行数据迁移,备份内容包含创建表,及插入表的 SQL 语句
+
+```sh
+mysqldump [options] db_name [tables]
+mysqldump [options] --database/-B db1 [db2 db3...]
+mysqldump [options] --all-databases/-A
+```
+
+连接选项:
+
+* -u --user=name:指定用户名
+* -p --password[=name]:指定密码
+* -h --host=name:指定服务器 IP 或域名
+* -P --port=#:指定连接端口
+
+输出内容选项:
+
+* --add-drop-database:在每个数据库创建语句前加上 Drop database 语句
+* --add-drop-table:在每个表创建语句前加上 Drop table 语句 , 默认开启,不开启 (--skip-add-drop-table)
+* -n --no-create-db:不包含数据库的创建语句
+* -t --no-create-info:不包含数据表的创建语句
+* -d --no-data:不包含数据
+* -T, --tab=name:自动生成两个文件:一个 .sql 文件,创建表结构的语句;一个 .txt 文件,数据文件,相当于 select into outfile
+
+示例:
+
+```sh
+mysqldump -uroot -p2143 db01 tb_book --add-drop-database --add-drop-table > a
+mysqldump -uroot -p2143 -T /tmp test city
+```
+
+
+
+***
+
+
+
+##### 数据备份
+
+命令行方式:
+
+* 备份命令:mysqldump -u root -p 数据库名称 > 文件保存路径
+* 恢复
+ 1. 登录MySQL数据库:`mysql -u root p`
+ 2. 删除已经备份的数据库
+ 3. 重新创建与备份数据库名称相同的数据库
+ 4. 使用该数据库
+ 5. 导入文件执行:`source 备份文件全路径`
+
+更多方式参考:https://time.geekbang.org/column/article/81925
+
+图形化界面:
+
+* 备份
+
+ 
+
+* 恢复
+
+ 
+
+
+
+
+
+***
+
+
+
+#### import
+
+mysqlimport 是客户端数据导入工具,用来导入mysqldump 加 -T 参数后导出的文本文件
+
+```sh
+mysqlimport [options] db_name textfile1 [textfile2...]
+```
+
+示例:
+
+```sh
+mysqlimport -uroot -p2143 test /tmp/city.txt
+```
+
+导入 sql 文件,可以使用 MySQL 中的 source 指令 :
+
+```mysql
+source 文件全路径
+```
+
+
+
+***
+
+
+
+#### show
+
+mysqlshow 客户端对象查找工具,用来很快地查找存在哪些数据库、数据库中的表、表中的列或者索引
+
+```sh
+mysqlshow [options] [db_name [table_name [col_name]]]
+```
+
+* --count:显示数据库及表的统计信息(数据库,表 均可以不指定)
+
+* -i:显示指定数据库或者指定表的状态信息
+
+示例:
+
+```sh
+#查询每个数据库的表的数量及表中记录的数量
+mysqlshow -uroot -p1234 --count
+#查询test库中每个表中的字段书,及行数
+mysqlshow -uroot -p1234 test --count
+#查询test库中book表的详细情况
+mysqlshow -uroot -p1234 test book --count
+```
+
+
+
+
+
+
+
+****
+
+
+
+
+
+## 单表操作
+
+### SQL
+
+- SQL
+
+ - Structured Query Language:结构化查询语言
+ - 定义了操作所有关系型数据库的规则,每种数据库操作的方式可能会存在不一样的地方,称为“方言”
+
+- SQL 通用语法
+
+ - SQL 语句可以单行或多行书写,以**分号结尾**。
+ - 可使用空格和缩进来增强语句的可读性。
+ - MySQL 数据库的 SQL 语句不区分大小写,**关键字建议使用大写**。
+ - 数据库的注释:
+ - 单行注释:-- 注释内容 #注释内容(MySQL 特有)
+ - 多行注释:/* 注释内容 */
+
+- SQL 分类
+
+ - DDL(Data Definition Language)数据定义语言
+
+ - 用来定义数据库对象:数据库,表,列等。关键字:create、drop,、alter 等
+
+ - DML(Data Manipulation Language)数据操作语言
+
+ - 用来对数据库中表的数据进行增删改。关键字:insert、delete、update 等
+
+ - DQL(Data Query Language)数据查询语言
+
+ - 用来查询数据库中表的记录(数据)。关键字:select、where 等
+
+ - DCL(Data Control Language)数据控制语言
+
+ - 用来定义数据库的访问权限和安全级别,及创建用户。关键字:grant, revoke等
+
+ 
+
+
+
+***
+
+
+
+### DDL
+
+#### 数据库
+
+* R(Retrieve):查询
+
+ * 查询所有数据库:
+
+ ```mysql
+ SHOW DATABASES;
```
-
+ * 查询某个数据库的创建语句
+
+ ```sql
+ SHOW CREATE DATABASE 数据库名称; -- 标准语法
+
+ SHOW CREATE DATABASE mysql; -- 查看mysql数据库的创建格式
+ ```
+
+
+
+* C(Create):创建
+
+ * 创建数据库
+
+ ```mysql
+ CREATE DATABASE 数据库名称;-- 标准语法
+
+ CREATE DATABASE db1; -- 创建db1数据库
+ ```
+
+ * 创建数据库(判断,如果不存在则创建)
+
+ ```mysql
+ CREATE DATABASE IF NOT EXISTS 数据库名称;
+ ```
+
+ * 创建数据库,并指定字符集
+
+ ```mysql
+ CREATE DATABASE 数据库名称 CHARACTER SET 字符集名称;
+ ```
+
+ * 例如:创建db4数据库、如果不存在则创建,指定字符集为gbk
+
+ ```mysql
+ -- 创建db4数据库、如果不存在则创建,指定字符集为gbk
+ CREATE DATABASE IF NOT EXISTS db4 CHARACTER SET gbk;
+
+ -- 查看db4数据库的字符集
+ SHOW CREATE DATABASE db4;
+ ```
+
+
+
+* U(Update):修改
+
+ * 修改数据库的字符集
+
+ ```mysql
+ ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称;
+ ```
+
+ * 常用字符集:
+
+ ```mysql
+ --查询所有支持的字符集
+ SHOW CHARSET;
+ --查看所有支持的校对规则
+ SHOW COLLATION;
+
+ -- 字符集: utf8,latinI,GBK,,GBK是utf8的子集
+ -- 校对规则: ci 大小定不敏感,cs或bin大小写敏感
+ ```
+
+
+
+* D(Delete):删除
+
+ * 删除数据库:
+
+ ```mysql
+ DROP DATABASE 数据库名称;
+ ```
+
+ * 删除数据库(判断,如果存在则删除):
+
+ ```mysql
+ DROP DATABASE IF EXISTS 数据库名称;
+ ```
+
+
+
+* 使用数据库:
+
+ * 查询当前正在使用的数据库名称
+
+ ```mysql
+ SELECT DATABASE();
+ ```
+
+ * 使用数据库
+
+ ```mysql
+ USE 数据库名称; -- 标准语法
+ USE db4; -- 使用db4数据库
+ ```
+
+
+
+
+***
+
+
+
+#### 数据表
+
+- R(Retrieve):查询
+
+ - 查询数据库中所有的数据表
+
+ ```mysql
+ USE mysql;-- 使用mysql数据库
+
+ SHOW TABLES;-- 查询库中所有的表
+ ```
+
+ - 查询表结构
+
+ ```mysql
+ DESC 表名;
+ ```
+
+ - 查询表字符集
+
+ ```mysql
+ SHOW TABLE STATUS FROM 库名 LIKE '表名';
+ ```
+
+
+
+- C(Create):创建
+
+ - 创建数据表
+
+ ```mysql
+ CREATE TABLE 表名(
+ 列名1 数据类型1,
+ 列名2 数据类型2,
+ ....
+ 列名n 数据类型n
+ );
+ -- 注意:最后一列,不需要加逗号
+ ```
+
+ - 复制表
+
+ ```mysql
+ CREATE TABLE 表名 LIKE 被复制的表名; -- 标准语法
+
+ CREATE TABLE product2 LIKE product; -- 复制product表到product2表
+ ```
+
+ - 数据类型
+
+ | 数据类型 | 说明 |
+ | --------- | ------------------------------------------------------------ |
+ | INT | 整数类型 |
+ | DOUBLE | 小数类型 |
+ | DATE | 日期,只包含年月日:yyyy-MM-dd |
+ | DATETIME | 日期,包含年月日时分秒:yyyy-MM-dd HH:mm:ss |
+ | TIMESTAMP | 时间戳类型,包含年月日时分秒:yyyy-MM-dd HH:mm:ss
如果不给这个字段赋值或赋值为 NULL,则默认使用当前的系统时间 |
+ | CHAR | 字符串,定长类型 |
+ | VARCHAR | 字符串,**变长类型**
name varchar(20) 代表姓名最大 20 个字符:zhangsan 8 个字符,张三 2 个字符 |
+
+ `INT(n)`:n 代表位数
+
+ * 3:int(9)显示结果为 000000010
+ * 3:int(3)显示结果为 010
+
+ `varchar(n)`:n 表示的是字符数
+
+ - 例如:
+
+ ```mysql
+ -- 使用db3数据库
+ USE db3;
+
+ -- 创建一个product商品表
+ CREATE TABLE product(
+ id INT, -- 商品编号
+ NAME VARCHAR(30), -- 商品名称
+ price DOUBLE, -- 商品价格
+ stock INT, -- 商品库存
+ insert_time DATE -- 上架时间
+ );
+ ```
+
+
+
+- U(Update):修改
+
+ - 修改表名
+
+ ```mysql
+ ALTER TABLE 表名 RENAME TO 新的表名;
+ ```
+
+ - 修改表的字符集
+
+ ```mysql
+ ALTER TABLE 表名 CHARACTER SET 字符集名称;
+ ```
+
+ - 添加一列
+
+ ```mysql
+ ALTER TABLE 表名 ADD 列名 数据类型;
+ ```
+
+ - 修改列数据类型
+
+ ```mysql
+ ALTER TABLE 表名 MODIFY 列名 新数据类型;
+ ```
+
+ - 修改列名称和数据类型
+
+ ```mysql
+ ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
+ ```
+
+ - 删除列
+
+ ```mysql
+ ALTER TABLE 表名 DROP 列名;
+ ```
+
+
+
+- D(Delete):删除
+
+ - 删除数据表
+
+ ```mysql
+ DROP TABLE 表名;
+ ```
+
+ - 删除数据表(判断,如果存在则删除)
+
+ ```mysql
+ DROP TABLE IF EXISTS 表名;
+ ```
+
+
+
+***
+
+
+
+### DML
+
+#### INSERT
+
+* 新增表数据
+
+ * 新增格式 1:给指定列添加数据
+
+ ```mysql
+ INSERT INTO 表名(列名1,列名2...) VALUES (值1,值2...);
+ ```
+
+ * 新增格式 2:默认给全部列添加数据
+
+ ```mysql
+ INSERT INTO 表名 VALUES (值1,值2,值3,...);
+ ```
+
+ * 新增格式 3:批量添加数据
+
+ ```mysql
+ -- 给指定列批量添加数据
+ INSERT INTO 表名(列名1,列名2,...) VALUES (值1,值2,...),(值1,值2,...)...;
+
+ -- 默认给所有列批量添加数据
+ INSERT INTO 表名 VALUES (值1,值2,值3,...),(值1,值2,值3,...)...;
+ ```
+
+* 字符串拼接
+
+ ```mysql
+ CONCAT(string1,string2,'',...)
+ ```
+
+
+
+* 注意事项
+
+ - 列名和值的数量以及数据类型要对应
+ - 除了数字类型,其他数据类型的数据都需要加引号(单引双引都可以,推荐单引)
+
+
+
+***
+
+
+
+#### UPDATE
+
+* 修改表数据语法
+
+ * 标准语法
+
+ ```mysql
+ UPDATE 表名 SET 列名1 = 值1,列名2 = 值2,... [where 条件];
+ ```
+
+ * 修改电视的价格为1800、库存为36
+
+ ```mysql
+ UPDATE product SET price=1800,stock=36 WHERE NAME='电视';
+ SELECT * FROM product;-- 查看所有商品信息
+ ```
+
+* 注意事项
+
+ - 修改语句中必须加条件
+ - 如果不加条件,则将所有数据都修改
+
+
+
+***
+
+
+
+#### DELETE
+
+* 删除表数据语法
+
+ ```mysql
+ DELETE FROM 表名 [WHERE 条件];
+ ```
+
+* 注意事项
+ * 删除语句中必须加条件
+ * 如果不加条件,则将所有数据删除
+
+
+
+
+
+***
+
+
+
+### DQL
+
+#### 查询语法
+
+数据库查询遵循条件在前的原则
+
+```mysql
+SELECT DISTINCT
+