数据库
1、数据库基础
1.1 数据库简介
数据库(Database,DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种 用户或应用共享的数据集合。
1.2 常见数据库管理系统
1.2.1 关系型数据库
- Oracle数据库
- Mysql数据库
- Sql Server数据库
1.2.2 关键字数据库
- Redis数据库
- Amazon DynamoDB
1.2.3 文件数据库
- MongoDB
1.3 三大范式
什么是三大范式:
第一范式:无重复的列。当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一 范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的 关系模式中实现不了。
第二范式:属性完全依赖于主键 [ 消除部分子函数依赖 ]。如果关系模式R满足第一范式,并且R得所有 非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。第二范式(2NF)是 在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第 二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上 一个列,以存储各个实例的唯一标识。这个唯一属性列被称为主关键字或主键、主码。
第三范式:属性不依赖于其它非主属性 [ 消除传递依赖 ]。设R是一个满足第一范式条件的关系模式,X 是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF. 满足 第三范式(3NF)必须先满足第二范式(2NF)。第三范式(3NF)要求一个数据库表中不包含已在其 它表中已包含的非主关键字信息。 (比如学生表中有主键:学生编号;非主键:学生姓名,地址。课程表不允许出现非主键属性)
注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于,2NF:非主键列是 否完全依赖于主键,还是依赖于主键的一部分;3NF:非主键列是直接依赖于主键,还是直接依赖于非 主键列。
2、 SQL语言
2.1 概述
SQL :Structure Query Language(结构化查询语言),SQL被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。
各数据库厂商都支持ISO的SQL标准相当于普通话
各数据库厂商在标准的基础上做了自己的扩展相当于方言
SQL 是一种标准化的语言,它允许你在数据库上执行操作,如创建项目,查询内容,更新内容, 并删除条目等操作。
Create, Read, Update, and Delete 通常称为CRUD操作。(别当一个crud仔)
2.2 SQL语句分类
-
DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等。
-
DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据)增删改。
-
DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别。
-
DQL(Data Query Language):数据查询语言,用来查询记录(数据)查询。
2.3 DDL操作数据库
2.3.1 创建数据库
create database 用于创建新的数据库
编码方式:gb2312,utf-8,gbk,iso-8859-1
#create database 数据库名
CREATE DATABASE mydb1;
#create database 数据库名 character set 编码方式
CREATE DATABASE mydb2 character SET GBK;
#create database 数据库名 set 编码方式 collate 排序规则
CREATE DATABASE mydb3 character SET GBK COLLATE gbk_chinese_ci;
2.3.2 查看数据库
#查看当前数据库服务器中所有的数据
show database;
#查看前面创建的mydb2数据库的定义信息
show create database mydb2;
#查看当前使用的数据库
select database
2.3.3 修改数据库
#格式
alter database mydb2 character set 编码方式
#查看服务器中的数据库,并将mydb2字符集修改为utf8;
alter database mydb2 character set utf8;
2.3.4 删除数据库
#格式
drop database mydb3;
2.3.5 其他语句
#切换数据库
use 数据库名
2.4 DDL操作表
2.4.1 创建数据表
#语法格式
create table 表名(
列名1 数据类型 [约束],
列名2 数据类型 [约束],
列名3 数据类型 [约束],
);
PS: 表名与列名自定义,[ ]内可写可不写,多列之间要用逗号隔开,最后一列不能写。
常用数据类型:
- int:整型
- double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为 999.99;默认支持四舍五入
- char:固定长度字符串类型; char(10) 占10位
- varchar:可变长度字符串类型; varchar(10)
- text:字符串类型,比如小说信息;
- blob:字节类型,保存文件信息(视频,音频,图片);
- date:日期类型,格式为:yyyy-MM-dd;
- time:时间类型,格式为:hh:mm:ss
- timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss 会自动赋值
- datetime:日期时间类型 yyyy-MM-dd hh:mm:ss
2.4.2 查看数据表
#查看当前数据库中所有表
show tables;
#查看表的字段信息
desc 表名;
#查看表创建细节
show create table 表名;
2.4.3 修改数据表
#添加列
alter table 表名 add 列名 数据类型 [约束];
#修改列
alter table 表名 modify 列名 数据类型 [约束];
alter table 表名 change 旧列名 新列名 数据类型 [约束];
#删除列
alter table 表名 drop 列名;
#修改表名
alter table 旧表名 rename 新表名;
#修改表的字符集
alter table 表名 character set 编码方式
2.4.4 删除数据表
#删除表
drop table 表名;
2.5 DML操作表
DML是对表中的数据进行增、删、改的操作
主要包括:INSERT 、UPDATE、 DELETE 小知识: 在Mysql中,字符串类型和日期类型都要用单引号括起来。
空值:null
2.5.1 插入操作:INSERT
#格式
insert into 表名(列名1,列名2,...) values(数据值);
#示例
insert into teacher(tid,tname) values(1,'张三')
PS:
- 多列和多个列值之间使用逗号隔开
- 列名要和列值一一对应
- 非数值的列值两侧需要加单引号
- 添加数据的时候可以将列名省略->当给所有列添加数据的时候 。此时 时列值的顺序按照数据表中列的顺序执行
- 插入空值用null
- 日期和字符一样,都使用单引号括起来
同时添加多行
insert into student(tid,tname)values(1,'张三1'),
(2,'张三2'),
(3,'张三3'),
(4,'张三4');
2.5.2 修改操作:UPDATE
#格式
update 表名 set 列名1=列值1,列名2=列值2,列名3=列值3 where 列名=值
#多表更新
update 表1,表2 set 列名=列值 where 表1.列名=表2.列名 and 其他限定条件
update 表1 inner join 表2 on 表1.列名=表2.列名 set 列名=列值where 限定条件
2.5.3 删除操作 :DELETE
#格式
delete from 表名 [where 列名=列值]
#多表删除
delete 被删除数据的表 from 删除操作中使用的表 where 限定条件
- DELETE 删除表中的数据,表结构还在;删除后的数据可以找回
- TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。 删除的数据不能找回。执行速度比DELETE快。
2.6 DCL 控制权限安全
2.6.1 创建用户
#格式
create user 用户名@指定ip identified by 密码;
#示例
create user test123@localhost IDENTIFIED by 'test123';
#create user 用户名@客户端ip identified by 密码; 指定IP才能登陆
create user test456@10.4.10.18 IDENTIFIED by 'test456';
#create user 用户名@‘% ’ identified by 密码 任意IP均可登陆
create user test7@'%' IDENTIFIED by 'test7';
2.6.2 用户授权
#格式
#grant 权限1,权限2,........,权限n on
#数据库名.* to 用户名@IP; 给指定用户授予指定指定数据库指定权限
#示例
grant select,insert,update,delete,create on
chaoshi.* to 'test456'@'127.0.0.1';
#grant all on . to 用户名@IP 给指定用户授予所有数据库所有权限
grant all n *.* to 'test456'@'127.0.0.1';
2.6.3 用户权限查询
#show grants for 用户名@IP;
show grants for 'root'@'%';
2.6.4 撤销用户权限
#revoke 权限1,权限2,........,权限n on 数据库名.* from 用户名@IP;
REVOKE SELECT ON *.* FROM 'root'@'%' ;
2.6.5 删除用户
#drop user 用户名@IP;
drop user test123@localhost;
2.7 DQL数据查询(重要)
数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。 查询返回的结果集是一张虚拟表。
查询关键字:SELECT
语法:
SELECT 列名 FROM 表名 【WHERE --> BROUP BY-->HAVING--> ORDER BY】
* 表示所有列
2.7.1 简单查询
#查询所有列
SELECT * FROM 表名;
#查询指定列
SELECT 列名1, 列名2, 列名3 FROM 表名;
2.7.2 条件查询
条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字: =、!=、<>、<、<=、>、>=; BETWEEN…AND; IN(set); IS NULL; AND;OR; NOT;
2.7.3 模糊查询
当想查询姓名中包含a字母的学生时就需要使用模糊查询了。模糊查询需要使用关键字LIKE。 语法: 列名 like ‘表达式’ //表达式必须是字符串 通配符: _(下划线): 任意一个字符 %:任意0~n个字符,'张%
2.7.4 字段控制查询
(1)去除重复记录 去除重复记录(两行或两行以上记录中系列的上的数据都相同需要使用 DISTINCT:
SELECT DISTINCT 重复的列名 FROM 表名;
(2)查看雇员的月薪与佣金之和 因为sal和comm两列的类型都是数值类型,所以可以做加运算。如果sal或comm中有一个字段不 是数值类型,那么会出错。
SELECT *,sal+comm FROM emp;
comm列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出 现NULL。下面使用了把NULL转换成数值0的函数IFNULL:
SELECT *,sal+IFNULL(comm,0) FROM emp;
(3)给列名添加别名 在上面查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出一个别名,为 total:
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
AS关键字可省略不写
2.7.5 排序
#语法: order by 列名 asc/desc
//asc 升序 desc 降序 默认不写的话是升序
#示例
# 查询所有学生记录,按年龄升序排序
select * from student oreder by asc;
select * from student oreder by
# 查询所有学生记录,按年龄降序排序
select * from student oreder by desc;
#多列排序:当前面的列的值相同的时候,才会按照后面的列值进行排序
SELECT * FROM emp
ORDER BY sal DESC,empno ASC;
2.7.6 聚合函数
聚合函数是用来做纵向运算的函数:
COUNT(列名):统计指定列不为NULL的记录行数;
MAX(列名):计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN(列名):计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM(列名):计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG(列名):计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
(1) COUNT 当需要纵向统计时可以使用COUNT()。 查询emp表中记录数:
SELECT COUNT(*) AS cnt FROM emp;
(2) SUM和AVG 当需要纵向求和时使用sum()函数。
#示例
#查询所有雇员月薪和:
SELECT SUM(sal) FROM emp;
#计所有员工平均工资:
SELECT AVG(sal) FROM emp;
(3) MAX和MIN
#示例
# 查询最高工资和最低工资:
SELECT MAX(sal), MIN(sal) FROM emp;
2.7.7 分组查询
当需要分组查询时需要使用GROUP BY子句
1、 查询每个部门的部门编号和每个部门的工资和
SELECT deptno, SUM(sal) FROM emp GROUP BY deptno;
2、HAVING子句
查询工资总和大于9000的部门编号以及工资和:
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;
PS:
having与where的区别:
1.having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
2.having后面可以使用分组函数(统计函数)
where后面不可以使用分组函数。
WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分 组;而HAVING是对分组后数据的约束。
补充: 多列分组 – 统计出stu表中每个班级的男女生各多少人
select gradename,gender ,count(*) from stu group by gradename,gender
分组查询select后面只能跟聚合函数或者分组列
2.7.8 LIMIT
LIMIT用来限定查询结果的起始行,以及总行数。
limit 开始下标,显示条数;
开始下标从0开始 limit 显示条数;
表示默认从0开始获取数据
1.普通限定查询
#查询5行记录,起始行从0开始
SELECT * FROM emp LIMIT 0, 5;
2.分页查询
如果一页记录为10条,希望查看第3页记录应该怎么查呢?
- 第一页记录起始行为0,一共查询10行; limit 0,10
- 第二页记录起始行为10,一共查询10行;limit 10,10
- 第三页记录起始行为20,一共查询10行; limit 20,10
pageIndex 页码值 pageSize 每页显示条数
limit (pageindex-1)*pagesize,pagesize;
查询语句书写顺序:select – from- where- group by- having- order by-limit
查询语句执行顺序:from - where -group by -having - select - order by-limit
2.7.9 日期运算函数
now() 获得当前系统时间
year(日期值) 获得日期值中的年份
date_add(日期,interval 计算值 计算的字段);
注:计算值大于0表示往后推日期,小于0表示往前推日期 示例:
date_add(now(),interval -40 year);#40年前的日期
3、数据完整性
3.1 数据库的完整性
用来保证存放到数据库中的数据是有效的,即数据的有效性和准确性
确保数据的完整性 = 在创建表时给表中添加约束
完整性的分类:
-
实体完整性(行完整性):
-
域完整性(列完整性):
-
引用完整性(关联表完整性):
- 主键约束:primary key
- 唯一约束:unique [key]
- 非空约束:not null
- 默认约束:default
- 自动增长:auto_increment
- 外键约束: foreign key
建议这些约束应该在创建表的时候设置
多个约束条件之间使用空格间隔
3.2 实体完整性
实体:即表中的一行(一条记录)代表一个实体(entity)
实体完整性的作用:标识每一行数据不重复。
约束类型:
- 主键约束(primary key)
- 唯一约束(unique)
- 自动增长列(auto_increment)
3.2.1 主键约束(primary key)
注:每个表中要有一个主键。 特点:数据唯一,且不能为null
三种添加方式
#1、创建表时添加
create table student(id int primary key ,name varchar(20));
#2、此方式添加优势在于可以创建联合主键
create table student(id int ,name varchar(20),primary key(id));
create table subject(id int ,classid int ,name varchar(20),primary key(id,classid));
#3、后创建主键
create table student(id int,name varchar(20));
alter table student add primary key(id);
3.2.2 唯一约束(unique)
特点:数据不能重复。
create table student(id int primary key,name varchar(20) unique);
3.2.3 自动增长列(auto_increment)
sqlserver数据库 (identity-标识列)
oracle数据库(sequence-序列)
给主键添加自动增长的数值,列只能是整数类型
create table student(id int primary key auto_increment,name varchar(20));
3.3 域完整性
域完整性的作用:限制此单元格的数据正确,不对照此列的其它单元格比较
域代表当前单元格
域完整性约束:数据类型 非空约束(not null) 默认值约束(default)
check约束(mysql不支持)check(sex=‘男’ or sex=‘女’)
3.3.1 非空约束 :not null
create table student(id int not null primary key,name varchar(20));
3.3.2 默认值约束 :default
create table student(id int primary key,name varchar(20),sex char(2) default '男')
3.4 引用完整性 : FOREIGN KEY
两种添加外键约束方式
#1 constraint自定义外键名称 foreign key(外键列名)references 主键表名(主键列名)
create table score(id int primary key,score int ,sid int,
constraint fk_score_id foreign key(sid) references student(id));
#2
alter table socre add constraint fk_score_id foregin key(sid) references student(id);
# 外键列的数据类型一定要与主键的类型一致
4、多表查询
4.1 多表的关系
4.1.1 一对多/多对一关系
一对多建表原则:在多的一方创建一个字段,字段作为外键指向一的一方的主键
4.1.2 多对多关系
多对多关系建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一 方的主键.
4.1.3一对一关系
在实际的开发中应用不多.因为一对一可以创建成一张表.
两种建表原则:
唯一外键对应:假设一对一是一个一对多的关系,在多的一方创建一个外键指向一的一方的主键,将外 键设置为unique.
主键对应:让一对一的双方的主键进行建立关系.
4.2 多表查询
多表查询有如下几种:
-
合并结果集:UNION 、 UNION ALL
-
连接查询
2.1内连接 [INNER] JOIN ON
2.2外连接 OUTER JOIN ON
-左外连接 LEFT [OUTER] JOIN
-右外连接 RIGHT [OUTER] JOIN
全外连接(Mysql不支持)FULL JOIN
2.3 自然连接 NATURAL JOIN
3.子查询
4.2.1 合并结果集
作用:合并结果集就是把两个select语句的查询结果合并到一起!
UNION:去除重复记录,
例如:
SELECT * FROM t1 UNION SELECT * FROM t2;
UNION ALL:不去除重复记录
例如:
SELECT * FROM t1 UNION ALL SELECT * FROM t2;
PS: 被合并的两个结果:列数、列类型必须相同
4.2.2 连接查询
连接查询就是求出多个表的乘积,例如t1连接t2,那么查询出的结果就是t1*t2。
连接查询会产生笛卡尔积,假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1), (a,2),(b,0),(b,1),(b,2)}。可以扩展到多个集合的情况。 那么多表查询产生这样的结果并不是我们想要的,那么怎么去除重复的,不想要的记录呢,当然是通过 条件过滤。通常要查询的多个表之间都存在关联关系,那么就通过关联关系去除笛卡尔积。
-
使用主外键关系做为条件来去除无用信息
-
内连接
#语法 select 列名 from 表1 inner join 表2 on 表1.列名=表2.列名 //外键列的关系 where..... #等价与 select 列名 from 表1,表2 where 表1.列名=表2.列名 and ...(其他条件)
PS:
1、表1和表2的顺序可以互换
2、找两张表的等值关系时,找表示相同含义的列作为等值关系。
3、点操作符表示“的”,格式:表名.列名
4、可以使用as,给表名起别名,注意定义别名之后,统一使用别名 -
外连接
包括左外连接和右外连接,外连接的特点:查询出的结果存在不满足条件的可能。
-
左外连接
select 列名 from 主表 left join 次表 on 主表.列名=次表.列名
–1.主表数据全部显示,次表数据匹配显示,能匹配到的显示数据,匹配不成功的显示null
– 2.主表和次表不能随意调换位置
使用场景:一般会作为子查询的语句使用
-
右外连接
select 列名 from 次表 right join 主表 on 主表.列名=次表.列名
-
-
自然连接
自然连接(NATURAL INNER JOIN):自然连接是一种特殊的等值连接,他要求两个关系表中进行连 接的必须是相同的属性列(名字相同),无须添加连接条件,并且在结果中消除重复的属性列。
select * from emp e natural join dept d;
-
4.2.3 子查询
一个select语句中包含另一个完整的select语句。
子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么 就是子查询语句了。
–子查询出现的位置:
a. where后,作为条为被查询的一条件的一部分;
b. from后,作表;
–当子查询出现在where后作为条件时,还可以使用如下关键字:
a. any
b. all
–子查询结果集的形式:
a. 单行单列(用于条件)
b. 单行多列(用于条件)
c. 多行单列(用于条件)
d. 多行多列(用于表)
5、数据库优化
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫 描,如:
select id from t where num is null
最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库.
备注、描述、评论之类的可以设置为 NULL,其他的,最好不要使用NULL。
3.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则引擎将放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致 引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or Name = 'admin'
可以这样查询:
select id from t where num = 10
union all
select id from t where Name = 'admin'
-
in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
很多时候用 exists 代替 in 是一个好的选择
6、事务
事务(Transaction)是由一系列对系统中数据进⾏访问与更新的操作所组成的⼀个程序执行逻辑单元。
6.1 事务的语法
- start transaction; begin;
- commit; 使得当前的修改确认
- rollback; 使得当前的修改被放弃
6.2 事务的ACID特性
-
原⼦性(Atomicity)
事务的原⼦性是指事务必须是⼀个原子的操作序列单元。事务中包含的各项操作在⼀次执⾏过程中,只 允许出现两种状态之一。
(1)全部执行成功
(2)全部执行失败
事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执⾏过程中出错, 会回滚到事务开始前的状态,所有的操作就像没有发⽣一样。也就是说事务是⼀个不可分割的整体,就 像化学中学过的原子,是物质构成的基本单位。
-
⼀致性(Consistency)
事务的一致性是指事务的执⾏不能破坏数据库数据的完整性和一致性,一个事务在执⾏之前和执行之 后,数据库都必须处以⼀致性状态。
比如:如果从A账户转账到B账户,不可能因为A账户扣了钱,⽽B账户没有加钱。
-
隔离性(Isolation)
事务的隔离性是指在并发环境中,并发的事务是互相隔离的。也就是说,不同的事务并发操作相同的数 据时,每个事务都有各自完整的数据空间。 ⼀个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的。 隔离性分4个级别,下面会介绍。
-
持久性(Duration)
事务的持久性是指事务⼀旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服 务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态
6.3 事务的并发问题
脏读:读取到了没有提交的数据, 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的 数据是脏数据。
不可重复读:同⼀条命令返回不同的结果集(更新).事务 A 多次读取同一数据,事务 B 在事务A 多次读取的 过程中,对数据做了更新并提交,导致事务A多次读取同一数据时,结果不一致。
幻读:重复查询的过程中,数据就发⽣了量的变化(insert, delete)。
6.4 事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(READ_UNCOMMITTED) | 允许 | 允许 | 允许 |
读已提交(READ_COMMITTED) | 禁止 | 允许 | 允许 |
可重复读(REPEATABLE_READ) | 禁止 | 禁止 | 允许 |
顺序读(SERIALIZABLE) | 禁止 | 禁止 | 禁止 |
4种事务隔离级别从上往下,级别越高,并发性越差,安全性就越来越高。 ⼀般数据默认级别是 :读以提交或可重复读
查看当前会话中事务的隔离级别
select @@tx_isolation
设置当前会话中的事务隔离级别
set session transaction isolation level read uncommitted;
-
读未提交(READ_UNCOMMITTED) 读未提交,该隔离级别允许脏读取,其隔离级别是最低的。换句话说,如果一个事务正在处理理某一数 据,并对其进⾏了更新,但同时尚未完成事务,因此还没有提交事务;而以此同时,允许另一个事务也 能够访问该数据。
-
读已提交(READ_COMMITTED) 读已提交是不同的事务执行的时候只能获取到已经提交的数据。 这样就不会出现上面的脏读的情况了。 但是在同一个事务中执行同一个读取,结果不一致
-
可重复读(REPEATABLE_READ) 可重复读就是保证在事务处理理过程中,多次读取同一个数据时,该数据的值和事务开始时刻是一致的。 因此该事务级别限制了不可重复读和脏读,但是有可能出现幻读的数据。
-
顺序读(SERIALIZABLE) 顺序读是最严格的事务隔离级别。它要求所有的事务排队顺序执⾏行行,即事务只能一个接一个地处理,不 能并发。
6.5 不同的隔离级别的锁的情况
-
读未提交(RU): 有行级的锁,没有间隙锁。它与RC的区别是能够查询到未提交的数据。
-
读已提交(RC):有行级的锁,没有间隙锁,读不到没有提交的数据。
-
可重复读(RR):有行级的锁,也有间隙锁,每次读取的数据都是一样的,并且没有幻读的情况。
-
序列化(S):有行级锁,也有间隙锁,读表的时候,就已经上锁了
6.6 隐式提交
DQL:查询语句句
DML:写操作(添加,删除,修改)
DDL:定义语句句(建库,建表,修改表,索引操作,存储过程,视图)
DCL: 控制语⾔言(给⽤用户授权,或删除授权)
都是隐式提交。 隐式提交:执⾏这种语句相当于执⾏commit;