高级前端开发在线培训,广州网站优化服务,松江团购做网站,网页制作专业要求云原生学习路线导航页#xff08;持续更新中#xff09; 本文是 通用开发技能系列 文章#xff0c;主要对编程通用技能 SQL基础 进行学习 1.数据库简介
1.1.数据库中的一些名称
DataBase#xff1a;数据库 程序员只负责怎么维护存取数据#xff0c;不管数据库是什么 DBA…云原生学习路线导航页持续更新中 本文是 通用开发技能系列 文章主要对编程通用技能 SQL基础 进行学习 1.数据库简介
1.1.数据库中的一些名称
DataBase数据库 程序员只负责怎么维护存取数据不管数据库是什么 DBA数据库管理员DBMS数据库管理系统 操纵管理数据的那个软件真正存数据的东西是硬盘我们普通业务程序员学习的其实就是DBMS 常见的DBMS操作起来大同小异都是使用SQL语言 中型MySql大型MS SQL Server、DB2、Oracle小型Access、SqLite文件型的小型数据库、SyBase 数据库最高权限 数据库最高权限所有者一般是Administrator登录名sa即为SQLServer Administrator最高权限所有者 SQL SQL 指结构化查询语言全称是 Structured Query Language。SQL 让您可以访问和处理 数据库管理系统DBMS包括数据插入、查询、更新和删除。SQL 在1986年成为 ANSIAmerican National Standards Institute 美国国家标准化组织的一项标准在 1987 年成为国际标准化组织ISO标准。除了 SQL 标准之外大部分 SQL 数据库程序都拥有它们自己的专有扩展因此不同的DBMSSQL查询语法可能略有不同
1.2.数据库的发展 文件管理数据把数据存到像word等一样的文档里。不方便 层次、网状数据库系统 关系型数据库大部分都是很多时候要关系转对象 面向对象数据库
1.3.数据库中的概念
不同类的数据应该放到不同的数据库中。 原因 便于对各个数据类别进行个性化管理。避免命名冲突。安全性更高。不同类别的数据应该有不同的安全性保护。 表Table关系数据库中的关系就是表。 行Row每一行称为一个记录。列Column字段Field每个单元格就是一个字段。 主键PrimaryKey 主键是一个数据行的唯一标识。一个表可以没有主键但不易维护。主键有两种选用策略 业务主键有意义的给用户看的。逻辑主键无意义的给程序、程序员看的。 因为很难保证业务主键完全不重复因此我们主要使用逻辑主键。 外键ForeignKey 外键一定是另一张表的主键
1.4.使用数据库的好处
便于维护、便于增删改查可以使用快捷的搜索算法来获取数据数据格式的变化容易并发处理封装起来了解决了并发程序可能带来的问题。安全处理可以给不同类别的用户分配不同的权限。数据的完整性与正确性可以给某列添加条件进行约束。
1.6.数据库管理系统DBMS的工作原理 DBMS查询数据过程如上图
我们使用DBMS管理数据编辑操作数据的代码。但DBMS仅仅是提供一个可视化界面它并不执行语句而是使用TCP/IP协议与数据库服务通信将语句传给计算机的数据库服务因此我们要将计算机的SQL服务启动。计算机的数据库服务就是一个操作系统提供的一个应用程序包括三部分查询分析器、查询优化器、查询执行器。当数据库服务拿到一条SQL语句后 先用查询分析器分析语法及正确性再用查询优化器匹配优秀的查询算法最后用查询执行器执行 数据库服务应用程序执行完SQL语句后缓存管理器首先会向数据库缓存在内存中中查找有没有所需数据。 有的话直接返回给数据库服务应用程序没有的话就读取硬盘中的mdf文件并且先将之放到数据库缓存中再返回给数据库服务应用程序。数据库服务应用程序拿到数据后返回给DBMS显示给用户。
2.SQL基础学习 下面介绍SQL基础语法如果有特异语法部分将按照MySQL的使用语法介绍 2.1.通用语法及分类
SQL语言根据用途可以分成4类 DDL: 数据定义语言用来定义数据库对象数据库、表、字段DML: 数据操作语言用来对数据库表中的数据进行增删改DQL: 数据查询语言用来查询数据库中表的记录DCL: 数据控制语言用来创建数据库用户、控制数据库的控制权限
2.2.DDL数据定义语言
2.1.1.数据库操作
查询所有数据库 SHOW DATABASES; 查询当前数据库 SELECT DATABASE(); 创建数据库 CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ DEFAULT CHARSET 字符集] [COLLATE 排序规则 ]; 删除数据库 DROP DATABASE [ IF EXISTS ] 数据库名; 使用数据库 USE 数据库名; 注意事项UTF8字符集长度为3字节有些符号占4字节所以推荐用utf8mb4字符集 2.1.2.数据表操作
查询当前数据库所有表 SHOW TABLES; 查询表结构 DESC 表名; 查询指定表的建表语句 SHOW CREATE TABLE 表名; 创建表CREATE TABLE 表名(字段1 字段1类型 [COMMENT 字段1注释],字段2 字段2类型 [COMMENT 字段2注释],字段3 字段3类型 [COMMENT 字段3注释],...字段n 字段n类型 [COMMENT 字段n注释]
)[ COMMENT 表注释 ];注意事项最后一个字段后面没有逗号 添加字段 ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];例ALTER TABLE emp ADD nickname varchar(20) COMMENT 昵称; 修改数据类型 ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度); 修改字段名和字段类型 ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];例将emp表的nickname字段修改为username类型为varchar(30) ALTER TABLE emp CHANGE nickname username varchar(30) COMMENT 昵称; 删除字段 ALTER TABLE 表名 DROP 字段名; 修改表名 ALTER TABLE 表名 RENAME TO 新表名 删除表 DROP TABLE [IF EXISTS] 表名; 删除表并重新创建该表 TRUNCATE TABLE 表名;
2.3.DML数据操作语言
2.3.1.添加数据
指定字段 INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...); 全部字段 INSERT INTO 表名 VALUES (值1, 值2, ...); 批量添加数据 INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...);INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...); 注意事项 字符串和日期类型数据应该包含在引号中插入的数据大小应该在字段的规定范围内 2.3.2.更新和删除数据
修改数据 UPDATE 表名 SET 字段名1 值1, 字段名2 值2, ... [ WHERE 条件 ];例UPDATE emp SET name Jack WHERE id 1; 删除数据 -DELETE FROM 表名 [ WHERE 条件 ];
2.4.DQL数据查询语言
完整语法SELECT
DISTINCT字段列表
FROM表名字段
WHERE条件列表
GROUP BY分组字段列表
HAVING分组后的条件列表
ORDER BY排序字段列表
LIMIT分页参数2.4.1.基础查询 查询多个字段 SELECT 字段1, 字段2, 字段3, ... FROM 表名;SELECT * FROM 表名; 设置别名 SELECT 字段1 [ AS 别名1 ], 字段2 [ AS 别名2 ], 字段3 [ AS 别名3 ], ... FROM 表名;SELECT 字段1 [ 别名1 ], 字段2 [ 别名2 ], 字段3 [ 别名3 ], ... FROM 表名; 去除重复记录 SELECT DISTINCT 字段列表 FROM 表名; 转义 SELECT * FROM 表名 WHERE name LIKE /_张三 ESCAPE // 之后的_不作为通配符
2.4.2.条件查询 语法 SELECT 字段列表 FROM 表名 WHERE 条件列表; 条件 比较运算符功能大于大于等于小于小于等于等于 或 !不等于BETWEEN … AND …在某个范围内含最小、最大值IN(…)在in之后的列表中的值多选一LIKE 占位符模糊匹配_匹配单个字符%匹配任意个字符IS NULL是NULL 逻辑运算符功能AND 或 并且多个条件同时成立OR 或 ||或者多个条件任意一个成立NOT 或 !非不是 例子 -- 年龄等于30
select * from employee where age 30;
-- 年龄小于30
select * from employee where age 30;
-- 小于等于
select * from employee where age 30;
-- 没有身份证
select * from employee where idcard is null or idcard ;
-- 有身份证
select * from employee where idcard;
select * from employee where idcard is not null;
-- 不等于
select * from employee where age ! 30;
-- 年龄在20到30之间
select * from employee where age between 20 and 30;
select * from employee where age 20 and age 30;
-- 下面语句不报错但查不到任何信息
select * from employee where age between 30 and 20;
-- 性别为女且年龄小于30
select * from employee where age 30 and gender 女;
-- 年龄等于25或30或35
select * from employee where age 25 or age 30 or age 35;
select * from employee where age in (25, 30, 35);
-- 姓名为两个字
select * from employee where name like __;
-- 身份证最后为X
select * from employee where idcard like %X;2.4.3.聚合查询聚合函数 常见聚合函数 函数功能count统计数量max最大值min最小值avg平均值sum求和 语法 SELECT 聚合函数(字段列表) FROM 表名;例SELECT count(id) from employee where workaddress 广东省;
2.4.4.分组查询 语法 SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后的过滤条件 ]; where 和 having 的区别 执行时机不同where是分组之前进行过滤不满足where条件不参与分组having是分组后对结果进行过滤。判断条件不同where不能对聚合函数进行判断而having可以。 例子 -- 根据性别分组统计男性和女性数量只显示分组数量不显示哪个是男哪个是女
select count(*) from employee group by gender;
-- 根据性别分组统计男性和女性数量
select gender, count(*) from employee group by gender;
-- 根据性别分组统计男性和女性的平均年龄
select gender, avg(age) from employee group by gender;
-- 年龄小于45并根据工作地址分组
select workaddress, count(*) from employee where age 45 group by workaddress;
-- 年龄小于45并根据工作地址分组获取员工数量大于等于3的工作地址
select workaddress, count(*) address_count from employee where age 45 group by workaddress having address_count 3;注意事项 执行顺序where 聚合函数 having分组之后查询的字段一般为聚合函数和分组字段查询其他字段无任何意义 2.4.5.排序查询
语法 SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2; 排序方式 ASC: 升序默认DESC: 降序 例子-- 根据年龄升序排序
SELECT * FROM employee ORDER BY age ASC;
SELECT * FROM employee ORDER BY age;
-- 两字段排序根据年龄升序排序入职时间降序排序
SELECT * FROM employee ORDER BY age ASC, entrydate DESC;注意事项 如果是多字段排序当第一个字段值相同时才会根据第二个字段进行排序 2.4.6.分页查询
语法 SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数; 例子-- 查询第一页数据展示10条
SELECT * FROM employee LIMIT 0, 10;
-- 查询第二页
SELECT * FROM employee LIMIT 10, 10;注意事项 起始索引从0开始起始索引 查询页码 - 1 * 每页显示记录数分页查询是数据库的方言不同数据库有不同实现MySQL是LIMIT如果查询的是第一页数据起始索引可以省略直接简写 LIMIT 10 2.4.7.DQL执行顺序
FROM - WHERE - GROUP BY - SELECT - ORDER BY - LIMIT
2.5.DCL
2.5.1.管理用户 查询用户 USE mysql;
SELECT * FROM user;创建用户: CREATE USER 用户名主机名 IDENTIFIED BY 密码; 修改用户密码 ALTER USER 用户名主机名 IDENTIFIED WITH mysql_native_password BY 新密码; 删除用户 DROP USER 用户名主机名; 例子 -- 创建用户test只能在当前主机localhost访问
create user testlocalhost identified by 123456;
-- 创建用户test能在任意主机访问
create user test% identified by 123456;
create user test identified by 123456;
-- 修改密码
alter user testlocalhost identified with mysql_native_password by 1234;
-- 删除用户
drop user testlocalhost;注意事项 主机名可以使用 % 通配 2.5.2.权限控制 常用权限更多权限请看权限一览表 权限说明ALL, ALL PRIVILEGES所有权限SELECT查询数据INSERT插入数据UPDATE修改数据DELETE删除数据ALTER修改表DROP删除数据库/表/视图CREATE创建数据库/表 查询权限 SHOW GRANTS FOR 用户名主机名; 授予权限 GRANT 权限列表 ON 数据库名.表名 TO 用户名主机名; 撤销权限 REVOKE 权限列表 ON 数据库名.表名 FROM 用户名主机名; 注意事项 多个权限用逗号分隔授权时数据库名和表名可以用 * 进行通配代表所有 2.6.函数
字符串函数数值函数日期函数流程函数
2.6.1.字符串函数 常用函数 函数功能CONCAT(s1, s2, …, sn)字符串拼接将s1, s2, …, sn拼接成一个字符串LOWER(str)将字符串全部转为小写UPPER(str)将字符串全部转为大写LPAD(str, n, pad)左填充用字符串pad对str的左边进行填充达到n个字符串长度RPAD(str, n, pad)右填充用字符串pad对str的右边进行填充达到n个字符串长度TRIM(str)去掉字符串头部和尾部的空格SUBSTRING(str, start, len)返回从字符串str从start位置起的len个长度的字符串REPLACE(column, source, replace)替换字符串 使用示例 -- 拼接
SELECT CONCAT(Hello, World);
-- 小写
SELECT LOWER(Hello);
-- 大写
SELECT UPPER(Hello);
-- 左填充
SELECT LPAD(01, 5, -);
-- 右填充
SELECT RPAD(01, 5, -);
-- 去除空格
SELECT TRIM( Hello World );
-- 切片起始索引为1
SELECT SUBSTRING(Hello World, 1, 5);2.6.2.数值函数 常见函数 函数功能CEIL(x)向上取整FLOOR(x)向下取整MOD(x, y)返回x/y的模RAND()返回0~1内的随机数ROUND(x, y)求参数x的四舍五入值保留y位小数
2.6.3.日期函数 常用函数 函数功能CURDATE()返回当前日期CURTIME()返回当前时间NOW()返回当前日期和时间YEAR(date)获取指定date的年份MONTH(date)获取指定date的月份DAY(date)获取指定date的日期DATE_ADD(date, INTERVAL expr type)返回一个日期/时间值加上一个时间间隔expr后的时间值DATEDIFF(date1, date2)返回起始时间date1和结束时间date2之间的天数 例子 -- DATE_ADD
SELECT DATE_ADD(NOW(), INTERVAL 70 YEAR);2.6.4.流程函数 常用函数 函数功能IF(value, t, f)如果value为true则返回t否则返回fIFNULL(value1, value2)如果value1不为空返回value1否则返回value2CASE WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END如果val1为true返回res1… 否则返回default默认值CASE [ expr ] WHEN [ val1 ] THEN [ res1 ] … ELSE [ default ] END如果expr的值等于val1返回res1… 否则返回default默认值 例子 selectname,(case when age 30 then 中年 else 青年 end)
from employee;selectname,(case workaddress when 北京市 then 一线城市 when 上海市 then 一线城市 else 二线城市 end) as 工作地址
from employee;2.7.约束 分类 约束描述关键字非空约束限制该字段的数据不能为nullNOT NULL唯一约束保证该字段的所有数据都是唯一、不重复的UNIQUE主键约束主键是一行数据的唯一标识要求非空且唯一PRIMARY KEY默认约束保存数据时如果未指定该字段的值则采用默认值DEFAULT检查约束mysql8.0.1版本后保证字段值满足某一个条件CHECK外键约束用来让两张图的数据之间建立连接保证数据的一致性和完整性FOREIGN KEY 约束是作用于表中字段上的可以再创建表/修改表的时候添加约束。
2.7.1.常用约束
约束条件关键字主键PRIMARY KEY自动增长AUTO_INCREMENT不为空NOT NULL唯一UNIQUE逻辑条件CHECK默认值DEFAULT 例子 create table user(id int primary key auto_increment,name varchar(10) not null unique,age int check(age 0 and age 120),status char(1) default 1,gender char(1)
);2.7.2.外键约束
添加外键CREATE TABLE 表名(字段名 字段类型,...[CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名)
);ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名);-- 例子
alter table emp add constraint fk_emp_dept_id foreign key(dept_id) references dept(id);删除外键 ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
2.7.3.外键 删除/更新 的行为
行为说明NO ACTION当在父表中删除/更新对应记录时首先检查该记录是否有对应外键如果有则不允许删除/更新与RESTRICT一致RESTRICT当在父表中删除/更新对应记录时首先检查该记录是否有对应外键如果有则不允许删除/更新与NO ACTION一致CASCADE当在父表中删除/更新对应记录时首先检查该记录是否有对应外键如果有则也删除/更新外键在子表中的记录SET NULL当在父表中删除/更新对应记录时首先检查该记录是否有对应外键如果有则设置子表中该外键值为null要求该外键允许为nullSET DEFAULT父表有变更时子表将外键设为一个默认值Innodb不支持
更改删除/更新行为 ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名(主表字段名) ON UPDATE 行为 ON DELETE 行为;
2.8.多表查询
2.8.1.多表关系
多表关系有三种 一对多多对一多对多一对一 一对多 案例部门与员工关系一个部门对应多个员工一个员工对应一个部门实现在多的一方建立外键指向一的一方的主键 多对多 案例学生与课程关系一个学生可以选多门课程一门课程也可以供多个学生选修实现建立第三张中间表中间表至少包含两个外键分别关联两方主键 一对一 案例用户与用户详情关系一对一关系多用于单表拆分将一张表的基础字段放在一张表中其他详情字段放在另一张表中以提升操作效率实现在任意一方加入外键关联另外一方的主键并且设置外键为唯一的UNIQUE
2.8.2.查询
合并查询笛卡尔积会展示所有组合结果 select * from employee, dept; 笛卡尔积两个集合A集合和B集合的所有组合情况在多表查询时需要消除无效的笛卡尔积 消除无效笛卡尔积 select * from employee, dept where employee.dept dept.id;
2.8.3.内连接查询
内连接查询的是两张表交集的部分隐式内连接 SELECT 字段列表 FROM 表1, 表2 WHERE 条件 ...; 显式内连接 SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ...; 显式性能比隐式高例子-- 查询员工姓名及关联的部门的名称
-- 隐式
select e.name, d.name from employee as e, dept as d where e.dept d.id;
-- 显式
select e.name, d.name from employee as e inner join dept as d on e.dept d.id;2.8.4.外连接查询
全外连接、左外连接和右外连接区别含举例
左外连接 查询左表所有数据以及两张表交集部分数据SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ...; 右外连接 查询右表所有数据以及两张表交集部分数据SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ...; 例子-- 左
select e.*, d.name from employee as e left outer join dept as d on e.dept d.id;
select d.name, e.* from dept d left outer join emp e on e.dept d.id; -- 这条语句与下面的语句效果一样
-- 右
select d.name, e.* from employee as e right outer join dept as d on e.dept d.id;左连接可以查询到没有dept的employee右连接可以查询到没有employee的dept
2.8.5.自连接查询 当前表与自身的连接查询自连接必须使用表别名 语法 SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...; 自连接查询可以是内连接查询也可以是外连接查询 例子 -- 查询员工及其所属领导的名字
select a.name, b.name from employee a, employee b where a.manager b.id;
-- 没有领导的也查询出来
select a.name, b.name from employee a left join employee b on a.manager b.id;2.8.6.联合查询 union, union all
把多次查询的结果合并形成一个新的查询集语法SELECT 字段列表 FROM 表A ...
UNION [ALL]
SELECT 字段列表 FROM 表B ...注意事项 UNION ALL 会有重复结果UNION 不会联合查询比使用or效率高不会使索引失效 2.8.7.子查询
SQL语句中嵌套SELECT语句称谓嵌套查询又称子查询。SELECT * FROM t1 WHERE column1 ( SELECT column1 FROM t2);子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个根据子查询结果可以分为 标量子查询子查询结果为单个值列子查询子查询结果为一列行子查询子查询结果为一行表子查询子查询结果为多行多列 根据子查询位置可分为 WHERE 之后FROM 之后SELECT 之后
2.8.7.1.标量子查询
子查询返回的结果是单个值数字、字符串、日期等。常用操作符- 例子-- 查询销售部所有员工
select id from dept where name 销售部;
-- 根据销售部部门ID查询员工信息
select * from employee where dept 4;
-- 合并子查询
select * from employee where dept (select id from dept where name 销售部);-- 查询xxx入职之后的员工信息
select * from employee where entrydate (select entrydate from employee where name xxx);2.8.7.2.列子查询 返回的结果是一列可以是多行。 常用操作符 操作符描述IN在指定的集合范围内多选一NOT IN不在指定的集合范围内ANY子查询返回列表中有任意一个满足即可SOME与ANY等同使用SOME的地方都可以使用ANYALL子查询返回列表的所有值都必须满足 例子 -- 查询销售部和市场部的所有员工信息
select * from employee where dept in (select id from dept where name 销售部 or name 市场部);
-- 查询比财务部所有人工资都高的员工信息
select * from employee where salary all(select salary from employee where dept (select id from dept where name 财务部));
-- 查询比研发部任意一人工资高的员工信息
select * from employee where salary any (select salary from employee where dept (select id from dept where name 研发部));2.8.7.3.行子查询
返回的结果是一行可以是多列。 常用操作符, , , IN, NOT IN例子-- 查询与xxx的薪资及直属领导相同的员工信息
select * from employee where (salary, manager) (12500, 1);
select * from employee where (salary, manager) (select salary, manager from employee where name xxx);2.8.7.4.表子查询
返回的结果是多行多列常用操作符IN例子-- 查询与xxx1xxx2的职位和薪资相同的员工
select * from employee where (job, salary) in (select job, salary from employee where name xxx1 or name xxx2);
-- 查询入职日期是2006-01-01之后的员工及其部门信息
select e.*, d.* from (select * from employee where entrydate 2006-01-01) as e left join dept as d on e.dept d.id;2.9.事务 事务是一组操作的集合事务会把所有操作作为一个整体一起向系统提交或撤销操作请求即这些操作要么同时成功要么同时失败。 基本操作 -- 1. 查询张三账户余额
select * from account where name 张三;
-- 2. 将张三账户余额-1000
update account set money money - 1000 where name 张三;
-- 此语句出错后张三钱减少但是李四钱没有增加
模拟sql语句错误
-- 3. 将李四账户余额1000
update account set money money 1000 where name 李四;-- 查看事务提交方式
SELECT AUTOCOMMIT;
-- 设置事务提交方式1为自动提交0为手动提交该设置只对当前会话有效
SET AUTOCOMMIT 0;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;-- 设置手动提交后上面代码改为
select * from account where name 张三;
update account set money money - 1000 where name 张三;
update account set money money 1000 where name 李四;
commit;操作方式二 开启事务 START TRANSACTION 或 BEGIN TRANSACTION; 提交事务 COMMIT; 回滚事务 ROLLBACK; 操作实例 start transaction;
select * from account where name 张三;
update account set money money - 1000 where name 张三;
update account set money money 1000 where name 李四;
commit;2.9.1.四大特性ACID
原子性(Atomicity)事务是不可分割的最小操作单元要么全部成功要么全部失败一致性(Consistency)事务完成时必须使所有数据都保持一致状态隔离性(Isolation)数据库系统提供的隔离机制保证事务在不受外部并发操作影响的独立环境下运行持久性(Durability)事务一旦提交或回滚它对数据库中的数据的改变就是永久的
2.9.2.并发事务
2.9.2.1.并发事务可能发生的问题
问题描述脏读一个事务读到另一个事务还没提交的数据不可重复读一个事务先后读取同一条记录但两次读取的数据不同幻读一个事务按照条件查询数据时没有对应的数据行但是再插入数据时又发现这行数据已经存在 这三个问题的详细演示https://www.bilibili.com/video/BV1Kr4y1i7ru?p55cd 2.9.2.2.并发事务隔离级别
隔离级别脏读不可重复读幻读Read uncommitted√√√Read committed×√√Repeatable Read(默认)××√Serializable×××
√表示在当前隔离级别下该问题会出现Serializable 性能最低Read uncommitted 性能最高数据安全性最差查看事务隔离级别 SELECT TRANSACTION_ISOLATION; 设置事务隔离级别 SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }; SESSION 是会话级别表示只针对当前会话有效GLOBAL 表示对所有会话有效