数据库基础知识
SQL分类
分类 | 全程 | 说明 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语音,用来创建数据库用户,控制数据库的访问权限 |
常用数据类型
数值类型
数据类型 | 说明 |
---|---|
BIT(M) | 位类型。M指定位数,默认值1,范围1-64 |
TINYINT[UNSIGHED] 占1个字节 | 带符号的范围是-128到127,无符号的范围0到255,默认是有符号 |
SMALLINT[UNSIGHED] 2个字节 | 带符号的范围是-215到215-1,无符号的范围是0到216-1 |
MEDIUMINT[UNSIGNED] 3个字节 | 带符号的范围是-223到223-1,无符号的范围是0到224-1 |
INT[UNSIGNED] 4个字节 | 带符号的范围是-231到231-1,无符号的范围是0到232-1 |
BIGINT[UNSIGNED] 8个字节 | 带符号的范围是-263到263-1,无符号的范围是0到264-1 |
FLOAT[UNSIGNED] | 占用空间4个字节 |
DOUBLE[UNSIGNED] | 表示比float精度更大的小数,占用空间8个字节 |
DECIMAL[M,D] [UNSIGNED] | 定点数M指定长度,D表示小数点的位数 |
文本、二进制类型
数据类型 | 说明 |
---|---|
CHAR(SIZE) | 固定长度字符串 最大255 |
VARCHAR(SIZE) | 可变长度字符串 0~65535【即:216-1】 |
BLOB LONGBLOB | 二进制数据 BLOB 0~216-1 LONGBLOB 0~232-1 |
TEXT LONGTEXT | 文本 Text 0~216 LONGTEXT 0~232 |
时间日期
数据类型 | 说明 |
---|---|
DATE/DATETIME/TimeStamp | 日期类型(YYYY-MM-DD)(YYYY-MM-DD HH:MM:SS)TimeStamp表示时间戳,他可用于自动记录insert、update的操作时间 |
DDL-数据库操作
查看、删除数据库
显示数据库语句
SHOW DATABASES
查看当前数据库
SELECT DATABASE();
显示数据库创建语句
SHOW CREATE DATABASE 数据库名
数据库删除语句
DROP DATABASE[IF EXISTS] 数据库名
DDL-表操作
创建表
CREATE TABLE 表名(
字段1 字段1类型 [COMMENT 字段注释],
字段2 字段2类型 [COMMENT 字段注释],
字段3 字段3类型 [COMMENT 字段注释]
)[CHARACTER SET 字符集] [COLLATE 校对规则] [ENGINE 存储引擎] [COMMENT 表注释];
field:指定列名 datatype:指定列类型(字段类型)
CHARACTER SET:如不指定则为所在数据库类型字符集
COLLATE:如不指定则为所在数据库校对规则
ENGINE:存储引擎 默认INNODB
int类型的时候不强制确定长度
修改表字符集
alter table 表名 character set 字符集;
添加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [COMMENT 注释] [约束];
当不指定位置时,新增字段默认为数据表的最后一个字段
ALTER TABLE 表名 ADD 字段1名 数据类型 AFTER 字段2名;
表示将字段1新增到字段2的后面
ALTER TABLE 表名 ADD 字段名 数据类型 FIRST;
表示将字段新增到数据表的第一个字段
修改字段
ALTER TABLE 表名 CHANGE 原字段名 新字段名 新数据类型 [COMMENT 注释] [约束];
修改字段时,必须指定新字段的数据类型,即使新字段的数据类型与原数据类型相同
只需要修改字段的数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型;
MODIFY和CHANGE都可以改变字段的数据类型。但CHANGE可以在改变字段数据类型的同时改变字段名
修改字段的排列位置
将字段1放到字段2的后面
ALTER TABLE 表名 MODIFY 字段1 数据类型 AFTER 字段2;
字段1和字段2必须是表中已经有的字段
将字段1设置为数据表的第一个字段
ALTER TABLE 表名 MODIFY 字段1 数据类型 FIRST;
删除字段
ALTER TABLE tablename
修改表名
Rename table 表名 RENAME [TO] 新表名;
修改表字符集
alter table 表名 character set 字符集;
插入数据
INSERT INTO 表名 [(字段列表)] VALUES 值列表;
- 插入的数据应于字段的数据类型相同
- 数据的长度应在列的规定范围内
- 在values中列出的数据位置必须与被加入的列的排列位置相对应
- 字符和日期型数据应包含在单引号中
- 列可以插入空值,前提是该字段允许为空
- 如果是给表中的所有字段添加数据,可以不写前面的字段名称
- 默认值的使用,当不给某个字段值时,如果有默认值就会添加,否则报错
修改数据
UPDATE 表名 SET 字段名1=值1,字段名2=值2 [WHERE 条件表达式] ;
字段名n表示需要修改的字段名称,值n表示为待修改的字段提供的新数据;关键字WHERE
表示条件;条件表达式表示指定修改数据需满足的要求。当满足条件表达式的数据有多行时,所有满足该条件的数据都会被修改。
- UPDATE语法可以用新值更新原有表行中的各列
- SET子句指示要修改哪些列和要给予哪些值
- WHERE子句指定应更新哪些列,如没有WHERE子句,则更新所有的记录
删除数据
DELETE FROM 表名 [WHERE 条件表达式];
- 如果不使用WHERE语句,将删除表中所有数据
- DELETE语句不能删除某一列的值(可使用UPDATE设为 null 或者’')
- 使用DELETE语句仅删除记录,不删除表本身,如果删除表,使用drop table语句, DROP TABLE 表名;
查找数据
SELECT [ALL|DISTINCT] *|列名1,列名2,列名3,列名n FROM 表名 [WHERE 条件表达式] [GROUP BY 列名[ASC|DESC] [HAVING 条件表达式]] [ORDER BY 列名[ASC|DESC],....] [LIMIT [OFFSET] 记录数];
SELECT子句:指定查询结果集返回的列,当使用"*"时,可以显示表中所有的列;关键字DISTINCT为可选参数,用于消除查询结果集中的重复记录
DROM子句:指定查询的数据源,可以是表或视图
WHERE子句:指定查询的筛选条件
GROUP BY子句:指定查询的分组列名;关键字HAVING为可选参数,用于指定分组后的筛选条件
OPDER BY子句:指定查询结果集的排序列名。排序方式由参数ASC或DESC控制,其中ASC表示按升序排列,DESC表示按降序排列,当不指定排序参数时,默认为升序
LIMIT子句:用于限制查询结果集的行数,参数OFFSET为偏移量,当OFFSET为0时(默认),表示查询结果从第1条记录开始返回,若OFFSET为1时,查询结果会从第2条记录开始返回,以此类推;记录数则表示查询结果集中包含的记录行数
使用别名
SELECT 原列名 AS 信列名 FROM 表名;
WHERE语句
常用的比较运算符
运算符 | 含义 | 运算符 | 含义 |
---|---|---|---|
=、<=> | 等于 | <>、!= | 不等于 |
> | 大于 | < | 小于 |
>= | 大于等于 | <= | 小于等于 |
其中“=”和“<=>”运算符的区别是,“<=>”运算符可与NULL比较
常用的逻辑运算符
运算符 | 说明 |
---|---|
AND或&& | 逻辑与,双目运算符,操作数全为真,结果为1,否则为0;当一个操作数为NULL时,NULL AND 1结果为1,NULL AND 0结果为0 |
OR或` | |
NOT或! | 逻辑非,单目运算符,操作数为0,结果为1,操作数为1,结果为0;当操作数为NULL时,结果为NULL |
XOR | 逻辑异或,双目运算符,操作数逻辑相反,结果为1;操作逻辑相同,结果为0;当一个操作数为NULL时,NULL XOR 1和NULL XOR 0的值都是NULL |
使用BETWEEN…AND运算符
WHERE 表达式 [NOT] BETWEEN 初始值 AND 终止值
限制查询数据的范围
使用IN运算符
WHERE 表达式 [NOT] IN (值1,值2,值3,...值n)
限制查询数据的范围
使用LIKE运算符
WHERE 表达式 [NOT] LIKE '字符串常量' [ESCAPE '转移字符']
实现字符串的模糊查询
与LIKE运算符同时使用的字符称为通配符,ESCAPE关键字用于指定转义字符,默认转义字符为“/”
通配符 | 说明 | 示例 |
---|---|---|
% | 任意字符串 | s%:表示查询s开头的任意字符串 %s:表示查询以s结尾的任意字符串 %s%:表示查询包含s的任意字符串 |
_ | 任何单个字符 | _s :表示查询以s结尾且长度为2的字符串s_ :标示查询以s开头且长度为2的字符串 |
使用REGEXP运算符
WHERE 列名 REGEXP '模式串'
进行正则表达式匹配
查看表结构
使用DESCRIBE语句来查看表结构
DESCRIBE 表名;
DESCRIBE 可以缩写成 DESC
使用SHOW COLUMNS FROM语句查看表结构
SHOW [FULL] COLUMNS FROM 表名;
若使用FULL关键字,则除显示基本结构以外,还会显示权限和注释字段;当不使用FULL关键字时,结果显示与DESCRIBE语句查看表的结果相同
使用SHOW CREATE TABLE语句查看表结构
SHOW CREATE TABLE 表名;
复制数据表
复制表结构及数据到新表
CREATE TABLE 新表名 SELECT * FROM 源表名;
新表名表示复制的目标表名称,新表名不能同数据库中已有的表名相同,源表名则为待复制数据表名称,SELECT * FROM
则表示查询符合条件的数据
CREATE TABLE 新表名 SELECT 源表中的字段 FROM 源表名;
将源表中某字段复制到新表中,复制多个字段的时候,字段之间用,
分隔开
只复制表结构到新表
CREATE TABLE 新表名 SELECT * FROM 源表名 WHERE FALSE;
新表名表示复制的目标表名称,新表名不能同数据库中已有的表名相同,源表名则为待复制数据表名称,SELECT * FROM
则表示查询符合条件的数据
CREATE TABLE 新表名 LIKE 源表名;
使用LIKE
关键字复制表结构时会将源表的约束一起复制到新表中
当源表和新表属于不同的数据库时,需要在源表名前面加上数据库名,格式为“数据库名.源表名”
备份恢复数据库
备份数据库(注意:在DOS执行)
mysqldump -u 用户名 -p -B 数据库1 数据库2 数据库n > 文件名.sql
恢复数据库(进入MySQL命令行再执行)
Source 文件名.sql
删除数据表
DROP TABLE 表名;
若想同时删除多张数据表,只需要在DROP TABLE
语句中列出多个表名,表名之间用半角逗号分割
在删除数据表时,需要确保该数据表中的字段未被其他数据表关联。若有关联,则需要先删除关联表。否则删除数据表的操作将会失效
TRUNCATE TABLE 表名;
删除表中的所有数据
DCL-用户管理
查询用户
USE mysql;
SELECT * FROM `user`;
创建用户
CREATE USER '用户名' @'主机名' IDENTIFIED BY '密码';
如果将主机名换成%就可以做到在任意主机登录
修改用户密码
ALTER USER'用户名'@'主机名'IDENTIFIED WITH mysql_native_password BY'新密码;
删除用户
DROP USER'用户名'@'主机名';
DCL-权限控制
数据库常用权限
权限 | 说明 |
---|---|
ALL,ALL PRIVILEGES | 所有权限 |
SELECT | 查询数据 |
INSERT | 插入数据 |
UPSATE | 修改数据 |
DELETE | 删除数据 |
ALTER | 修改表 |
DROP | 删除数据库/表/视图 |
CREATE | 创建数据库 |
查询权限
SHOW GRANTS FOR'用户名'@'主机名';
授予权限
GRANT 权限列表 ON 数据库.表名 TO '用户名'@'主机名';
撤销权限
REVOKE 限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
函数
函数是指一段可以直接被另一段程序调用的程序或代码。
聚合函数
合计函数count
SELECT COUNT(*)|COUNT(列名) FROM 表名 [WHERE 条件表达式];
返回行的总数
COUNT(*)返回满足条件的记录的行数
COUNT(列数)统计满足条件的某列有多少个,但是会排除NULL
合计函数SUM
SELECT SUM(列名) FROM 表名 [WHERE 条件表达式];
返回满足WHERE条件的行的和
sum仅对数值有作用
合计函数AVG
SELECT AVG(列名) FROM 表名 [WHERE 条件表达式]
返回满足WHERE条件的一列的平均值
合计函数MAX/MIN
SELECT MAX(列名) FROM 表名 [WHERE 条件表达式];
MAX/MIN函数返回满足WHERE条件的一列的最大值/最小值
字符串函数
常用的字符串函数
函数 | 功能 |
---|---|
CONCAT(S1,S2,S3…Sn) | 字符串拼接,将s1,s2,s3…sn拼接成一个字符串 |
LOWER(STR) | 将字符串str全部转为小写 |
UPPER(STR) | 将字符串str全部转为大写 |
LPAD(str,n,pad) | 左填充,用字符串pad对st的左边进行填充,达到n个字符串长度 |
RPAD(str,n,pad) | 右填充,用字符串pad对st的右边进行填充,达到n个字符串长度 |
TRIM(StD) | 去掉字符串头部和尾部的空格 |
SUBSTRING(str,start,len) | 返回从字符串str从start位置起的len个长度的字符串 |
数值函数
常用的数值函数
函数 | 功能 |
---|---|
CEIL(x) | 向上取整 |
FLOOR(x) | 向下取整 |
MOD(xy) | 返回x/y的模 |
RAND() | 返回0~1内的随机数 |
ROUND(x,y) | 求参数x的四舍五入的值,保留y位小数 |
日期函数
函数 | 功能 |
---|---|
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前日期和时间 |
YEAR(date) | 获取指定date的年份 |
MONTH(date) | 获取指定date的月份 |
DAY(date) | 获取指定date的日期 |
DATE_ADD(date,INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔expr后的时间值 |
DATEDIFF(date1,date2) | 返回起始时间date1和结束时间date2之间的天数 |
流程函数
常用的流程控制函数
函数 | 功能 |
---|---|
IF(value,t,f) | 如果value为true,则返回t,否则返回f |
IFNULL(value1,value2) | 如果value1不为空,返回value1,否则返回value2 |
CASE WHEN val1 THEN [res1]…ELSE default END | 如果vall为true,返回resl,否则返回default默认值 |
CASE expr WHEN vall THEN [res1]…ELSE default END | 如果expr的值等于vall,返回resl,.否则返回default默认值 |
约束
概述
概念: 约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的: 保证数据库中数据的正确、有效性和完整性。
分类:
约束 | 描述 | 关键字 |
---|---|---|
非空约束 | 限制该字段的数据不能为nul | NOT NULL |
唯一约束 | 保证该字段的所有数据都是唯一、不重复的 | UNIQUE |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
检查约束(8.0.16版本之后) | 保证字段值满足某一个条件 | CHECK |
外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 | FOREIGN KEY |
注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
外键约束
外键 :用来让两张表的数据之间建立联系,从而保证数据的一致性和完整性
语法
添加外键
CREATE TABLE 表名(
字段名 数据类型,
...
[CONSTRAINT][外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名)
)
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(住表列名);
删除外键
alter table 表明 drop foreign key 外键名称;
外键约束
行为 | 说明 |
---|---|
NO ACTION | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与RESTRICT一致) |
RETRICT | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与NO ACTION一致) |
CASCADE | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除更新外键在子表中的记录。 |
SET NULL | 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null). |
SET DEFAULT | 父表有变更时,子表将外键列设置成一个默认的值(Innodb:不支持) |
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段) REFERENCES 主表名(主表字段名) ON UPDATE CASCADE ON DELETE CASCADE:
多表查询
多表关系
项目开发中,在进行数据库结构设计时,会根据业务需求及业务模块之间的关系。分析并设计表结构,由于业务之间相互关联,所以各个表架构之间也存在各种联系,基本分为以下三种:
- 一对多(多对一)
- 多对多
- 一对一
一对多
- 案例:部门 与 员工的关系
- 关系: 一个部门对应多个员工,一个员工对应一个部门
- 实现: 在多个的一方建立外键,指向一的一方的主键
多对多
- 案例: 学生 与 课程的关系
- 关系: 一个学生可以选修多门课程,一门课程也可以供多个学生选择
- 实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
一对一
- 案例: 用户 与 用户详情的关系
- 关系: 一对一的关系,多用于单表的拆分,将一张表的基础字段放到一张表中,其他详情字段放在另一张表中,以提升操作效率
- 实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的
多表查询分类
连接查询
- 内连接:相当于查询A,B交集部分数据
- 外连接:
- 左外连接:查询左表所有数据,以及两张表交集部分数据
- 右外连接:查询右表所有数据,以及两张表交集部分数据
- 自连接:当前表与自身的连接查询,自连接必须使用表别名
子查询
内连接
内连接查询的是两张表交集的部分数据
内连接的语法分为两种:隐式内连接,显式内连接
隐式内连接
SELECT 字段列表 FROM 表1,表2 WHERE 条件;
显式内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件;
外连接
外连接分为左外连接和右外连接
左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
相当于查询表1(左表)的所有数据包含表1和表2交集部分的数据
右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
相当于查询表2(右表)的所有数据包含表1和表2交集部分的数据
自连接
自连接查询语法:
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件;
自连接查询,可以是内连接查询,也可以是外连接查询。
联合查询-union,union all
对于uion查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。
SELECT 字段列表 FROM 表A
UNION [ALL]
SELECT 字段列表 FROM 表B...;
- 对于联合查询的多张表的列数必须保持一致,字段类型也需要一致
- union all会将全部的数据直接合并在一起,union会对合并之后的数据去重
子查询
概述
概念
SQL语句中嵌套SELECT语句,成为嵌套查询,又称为子查询
SELECT * FROM t1 WHERE column1 =(SELECT column1 FROM t2);
子查询外部的语句可以是INSERT/UPDATE/DELETE/SELECT中的任何一个
分类
-
根据子查询结果不同,分为:
- 标量子查询(子查询结果为单个值)
- 列子查询(子查询结果为一列
- 行子查询(子查询结果为一行)
- 表子查询(子查询结果为多行多列
-
根据子查询位置,分为:WHERE之后、FROM之后、SELECT之后。
标量子查询
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询成为标量子查询。
常用的运算符:= <> >= > < <=
列子查询
子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。
常用的操作符:IN、NOT IN、ANY、SOME、ALL
操作符 | 描述 |
---|---|
IN | 在指定的集合范围之内,多选一 |
NOT IN | 不在指定的集合之内 |
ANY | 子查询返回列表中,有任意一个满足即可 |
SOME | 与ANY等同,使用SOME的地方都可以满足使用ANY |
ALL | 子查询返回列表中的所有值必须满足 |
行子查询
子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。
常用的操作符:=、<>、IN、NOT IN
表子查询
子查询返回的结果是多行多列,这种子查询称为表子查询。
常用的操作符:IN
事务
事务简介
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。
事务操作
控制事务一
查看/设置事物提交方式
SELECT @@autocommit;
SET @@autocommit=0;
如果@@autocommit的参数是1则为自动提交
如果@@autocommit的参数是0则为手动提交
提交事务
COMMIT;
回滚事务
ROLLBACK;
注意:上述的这种方式,我们只是修改了事务的自动提交方式,把默认的自动提交修改为了手动提交,此时我们必须执行的DML语言都不会提交,需要手动的执行COMMIT进行提交
如果事务执行后出现异常应当直接回滚事务,来保证数据的安全性
控制事务二
开启事务
START TRANSACTION;
或者
BEGIN;
提交事务
COMMIT;
回滚事务
ROLLBACK;·
事务四大特征
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
并发事务问题
问题 | 描述 |
---|---|
脏读 | 一个事务读到另外一个事务还没有提交的数据。 |
不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。 |
幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 幻影”。 |
事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted | 不可解决 | 不可解决 | 不可解决 |
Read committed | 可解决 | 不可解决 | 不可解决 |
Repeatable Read(默认) | 可解决 | 可解决 | 不可解决 |
Serializable | 可解决 | 可解决 | 可解决 |
查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别
SET [SESSION|GLOBAL]TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE}
注意:事务隔离级别越高,数据越安全,但是性能越低
|
| ---------- | ------------------------------------------------------------ |
| 脏读 | 一个事务读到另外一个事务还没有提交的数据。 |
| 不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。 |
| 幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 幻影”。 |
事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted | 不可解决 | 不可解决 | 不可解决 |
Read committed | 可解决 | 不可解决 | 不可解决 |
Repeatable Read(默认) | 可解决 | 可解决 | 不可解决 |
Serializable | 可解决 | 可解决 | 可解决 |
查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别
SET [SESSION|GLOBAL]TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE}
注意:事务隔离级别越高,数据越安全,但是性能越低