首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySQL 数据库入门到精通(基础篇①)

MySQL 数据库入门到精通(基础篇①)

作者头像
用户11288958
发布于 2025-01-17 14:07:52
发布于 2025-01-17 14:07:52
1.5K0
举报
文章被收录于专栏:学习学习

如有侵权立马删除!!!!!!! 

38f29e1c35664563bdd42937aea43a80.png
38f29e1c35664563bdd42937aea43a80.png

一、课程介绍

e9dc84f289784c20988abcbaf9a9aa4f.png
e9dc84f289784c20988abcbaf9a9aa4f.png
78260b299a0e4f9e966d4b6c35ef98b9.png
78260b299a0e4f9e966d4b6c35ef98b9.png

二、基础篇(MySQL概述)

cfcc6c4713054ad1bf39ba0e7a3f5d16.png
cfcc6c4713054ad1bf39ba0e7a3f5d16.png
6f70539bf74047649952541edfbcd1ea.png
6f70539bf74047649952541edfbcd1ea.png

三、MsSQL安装及启动

2f244ed4b82b4176ac72253d736a782b.png
2f244ed4b82b4176ac72253d736a782b.png

注:安装后在安装的时候,我们一般会设置开机自启 

7fb3f7133d464341aed1950c4dbded4e.png
7fb3f7133d464341aed1950c4dbded4e.png
f440919729ab4e1b9d03c39f835c05a3.png
f440919729ab4e1b9d03c39f835c05a3.png

 swdwdwadwadwdwdwawsss

74376f106d6443bfab25cc48b9e67574.png
74376f106d6443bfab25cc48b9e67574.png

四、MySQL数据模型 

841a89811b214c0b85d0ac55242afb0b.png
841a89811b214c0b85d0ac55242afb0b.png

如果不通过表结构存储数据的数据库,我们就称之为非关系型数据库

f5b7260b318b4c1ab286981f0a711129.png
f5b7260b318b4c1ab286981f0a711129.png

五、基础篇(SQL)通用语法及分类

327589fef5d34dcb97cac91708a5edc5.png
327589fef5d34dcb97cac91708a5edc5.png
eadfc654bb944529acbde434ee68c62e.png
eadfc654bb944529acbde434ee68c62e.png
6d58d5ba3d654e1598b21bd34fc5d249.png
6d58d5ba3d654e1598b21bd34fc5d249.png

六、DDL语句 数据库操作(数据库定义语言)

cc3ea1b8e59444cfa2b6b823bad7181b.png
cc3ea1b8e59444cfa2b6b823bad7181b.png

七、DDL语句 表操作 -创建查询

b67900d8a3b444bebaa410b39bb07e55.png
b67900d8a3b444bebaa410b39bb07e55.png
03c4c8f9ae884af79732f8ede7018615.png
03c4c8f9ae884af79732f8ede7018615.png
7232903012ad4716b6a5f4a205f96522.png
7232903012ad4716b6a5f4a205f96522.png

八、DDL 数据类型及案例

1.1 数值类型

3985f6b2e61c48dea2486c5b389780be.png
3985f6b2e61c48dea2486c5b389780be.png

1.2 字符串类型

11d4518a5fe0403aa7bd984301b71207.png
11d4518a5fe0403aa7bd984301b71207.png

 1.3 日期时间类型

a531c55533ee466793502f3e035a307b.png
a531c55533ee466793502f3e035a307b.png

 九、DDL 表操作 修改删除

9.1添加字段

c0e7d4133a56418095cfdf6fa7c4f802.png
c0e7d4133a56418095cfdf6fa7c4f802.png
584565f15a8648d99dabc08c66fe8d50.png
584565f15a8648d99dabc08c66fe8d50.png

9.2修改数据类型 

891f5b0f70334091956ae5c34c7cbf8e.png
891f5b0f70334091956ae5c34c7cbf8e.png
05ac69471eef4234a3c3068bd0d1b9f4.png
05ac69471eef4234a3c3068bd0d1b9f4.png

 9.3删除字段

4c4256071c8f431da54e4b04f1029258.png
4c4256071c8f431da54e4b04f1029258.png
2b8b8809f8fb4b9087d36536d0eb90f4.png
2b8b8809f8fb4b9087d36536d0eb90f4.png

9.4修改表名

2ce2d375e5f44a87b76168105e8c4642.png
2ce2d375e5f44a87b76168105e8c4642.png
74ca3a92b02c404a967068a0f902d2c4.png
74ca3a92b02c404a967068a0f902d2c4.png

9.5删除表操作

132cffb6972a4e1c97ba2d5e42bb9e5a.png
132cffb6972a4e1c97ba2d5e42bb9e5a.png

注意:在删除表时,表中的全部数据也会被删除。 

9e7cd316d6a14f78974f653849c69f6f.png
9e7cd316d6a14f78974f653849c69f6f.png

十、DDL语句小结

2d5954bb9e7d4e3e9bfe54cc758fe869.png
2d5954bb9e7d4e3e9bfe54cc758fe869.png

十一、MySQL图形化界面工具

DataGrip。比前两个功能更加强大。

d40f690c2cb1461b861c9e93911d3080.png
d40f690c2cb1461b861c9e93911d3080.png

我们下载DataGrip进行使用

93e510c7187a4b1ab3d86212f5ead8f7.png
93e510c7187a4b1ab3d86212f5ead8f7.png

十二、DML语句  插入/增加数据(数据操作语言)

9198e879f4244624beab006b93ab3cf8.png
9198e879f4244624beab006b93ab3cf8.png

代码语言:javascript
复制
insert into employee(id, workNum, name, gender, age, idCard, entryDate) values (1,'1','李四','男',10,123456789012345678,'2001-12-8');
ac727657217a45c286f69edab87fa94e.png
ac727657217a45c286f69edab87fa94e.png
827431a991294fdbbf5ad4518e9d9090.png
827431a991294fdbbf5ad4518e9d9090.png
代码语言:javascript
复制
INSERT INTO employee (id, workNum, name, gender, age, idCard, entryDate)VALUES (1, '1', '李大', '男', 10, 123456789012345678, '2001-12-8');
insert into employee values (2,'2','李二','男',10,123456789012345678,'2001-12-8');
insert into employee values (3,'3','李三','男',10,123456789012345678,'2001-12-8'),(4,'4','李四','男',10,123456789012345678,'2001-12-8');

十三、 DML语句 更新和删除

13.1更新

108a4cacf4634d3b8db7a6ecb489bbe5.png
108a4cacf4634d3b8db7a6ecb489bbe5.png
代码语言:javascript
复制
update employee set name = '李大大',gender = '女' where id = 1;
cedb48d94bfc4657aed0a1cc7b919901.png
cedb48d94bfc4657aed0a1cc7b919901.png

 13.2删除

fa49c47fb842484cb4a91e81492218a4.png
fa49c47fb842484cb4a91e81492218a4.png
7557300662664a3b9e0108a7b8fc46ee.png
7557300662664a3b9e0108a7b8fc46ee.png

十四、DML语句小结

4276fb8a7b7d4631b7c95adb465b009a.png
4276fb8a7b7d4631b7c95adb465b009a.png

 十五、DQL语句 基础查询(数据库查询语言)

606a8ebe59f24bd9b4f37d00cb005a07.png
606a8ebe59f24bd9b4f37d00cb005a07.png
548e3b63f58349fdb865c5dc56c315e4.png
548e3b63f58349fdb865c5dc56c315e4.png

 查询指定字段,和查询所有字段

fee942d8ee174a05be30c9d16ae68f9d.png
fee942d8ee174a05be30c9d16ae68f9d.png

 as(起别名) 。as可以省略

bc1942d75f43492480bdd4e52f56f12f.png
bc1942d75f43492480bdd4e52f56f12f.png

distinct(去重) 关键字用来去除重复的。

400d7501b7ca452ca937cc471bb4b10a.png
400d7501b7ca452ca937cc471bb4b10a.png

十六、DQL语句 条件查询

ce1af981d6794c998ec5041bd27501a9.png
ce1af981d6794c998ec5041bd27501a9.png

in 列表中的值,只要能满足其一就可以。 

2fb9123ad1aa477e98032726a9c5308d.png
2fb9123ad1aa477e98032726a9c5308d.png
08bcedfb4a724218a8c78c1498c5f755.png
08bcedfb4a724218a8c78c1498c5f755.png
d0c0241a04034ab9b2b630834b2f7a19.png
d0c0241a04034ab9b2b630834b2f7a19.png
793731870f5d40979f1901deff9ac9f0.png
793731870f5d40979f1901deff9ac9f0.png
2492dccaee9f41f3b076a666267badd0.png
2492dccaee9f41f3b076a666267badd0.png
0ad6f0abe1054f01a9323b9afd39bdff.png
0ad6f0abe1054f01a9323b9afd39bdff.png

十七、 DQL语句 聚合函数

6b5cf5c4e8ac4947b02a415afe16d788.png
6b5cf5c4e8ac4947b02a415afe16d788.png

注意:所有的 null的运算  值不参与所有聚合函数

7430989b126e4fc886845e435ac36d16.png
7430989b126e4fc886845e435ac36d16.png

查到这张表的总数据量。 

也可以用id来查。此时就统计id字段的总数量。

9900522d9d474fcdadbb1313ba2e3532.png
9900522d9d474fcdadbb1313ba2e3532.png

 总共是16条数据。由于有一位员工 idcard 为null。因此不被统计,就是15条。

161a154860b040efba3853c25d82fb21.png
161a154860b040efba3853c25d82fb21.png

 先试试查询在西安的员工。

2793173577c14da181e7b9c8d7a896fd.png
2793173577c14da181e7b9c8d7a896fd.png

查询西安地区员工年龄之和。返回135 

7dd334e18b0b43d5b147cc51c3379fd9.png
7dd334e18b0b43d5b147cc51c3379fd9.png

十八、分组查询

9d4ecba4b38646b297f01b1a45b288aa.png
9d4ecba4b38646b297f01b1a45b288aa.png

 注意看注意: 1.分组之后,查询的字段一般为聚合函数和分组字段。查询其他字段无任何意义。

a4d73bf3043a416ea83b45b0d039ec07.png
a4d73bf3043a416ea83b45b0d039ec07.png
83c49372752643228e89bf9b70e2f501.png
83c49372752643228e89bf9b70e2f501.png

对于第三个,先查年龄小于45的员工,并根据工作地址进行分组。并且统计员工数量 。

40d8a73832ba40959b1f118104b46aad.png
40d8a73832ba40959b1f118104b46aad.png

再从这个统计数量,筛选出员工 数量 ≥ 3的工作地址

最终结果,我们还给count(*)起了个别名叫做address_count

22c0085b307e48489c3cc81a7bfe1b63.png
22c0085b307e48489c3cc81a7bfe1b63.png

十九、排序查询

2909600940104d39bbf64df2fe06e168.png
2909600940104d39bbf64df2fe06e168.png

 asc是可以省略的,因为升序是默认值

51497b3998b64c20953a49b4ad2bd87f.png
51497b3998b64c20953a49b4ad2bd87f.png

如果年龄相同,再按照入职时间升序或者降序排序

9aaffea287e943d7b04a8c8d0da690f8.png
9aaffea287e943d7b04a8c8d0da690f8.png

二十、分页查询

6f6ebce78b1c40b7a9e37fd807a153ac.png
6f6ebce78b1c40b7a9e37fd807a153ac.png
8938355396814352892b087438e2e830.png
8938355396814352892b087438e2e830.png

二十一、DQL案例练习

b01f0e6d3ad9493186d7f07c0ee0885e.png
b01f0e6d3ad9493186d7f07c0ee0885e.png
12a4c159192f498eb64380fc6293be0e.png
12a4c159192f498eb64380fc6293be0e.png
9ea90e3a8f4440f699464fbd6aae6a3d.png
9ea90e3a8f4440f699464fbd6aae6a3d.png

注:limilt在最后。order by 在limit之前

二十二、DQL-执行顺序

f3afd72a1024436293e10ac20820c97a.png
f3afd72a1024436293e10ac20820c97a.png

1.先执行from。因此给emp起别名。where条件语句,和select查询语句 order by 排序语句 就可以使用表的别名。 2.order by 排序语句 和 limit分页语句 是在select 之后执行。因此给字段起别名。也能被这两个语句用到。

55a75dbe79f847949fdee3c51d0d1303.png
55a75dbe79f847949fdee3c51d0d1303.png

二十三、DQL语句 小结

cde372fbab764463b01d1614ed422b02.png
cde372fbab764463b01d1614ed422b02.png

二十四、DCL 用户管理(数据控制语言) 

6b75bbf1454a45ae90506fdb3478299f.png
6b75bbf1454a45ae90506fdb3478299f.png
85b390e568f14c8f83d61a1b50156a6e.png
85b390e568f14c8f83d61a1b50156a6e.png
38ad337b2b434c809689db1871ebcfd6.png
38ad337b2b434c809689db1871ebcfd6.png

找到 mysql 数据库。找到里面的 user 表,我们就能知道当前电脑数据库用户了 host 指的是主机。 通过用户名 和 主机地址才能完整的定位一个 mysql 用户。 主机地址 代表当前用户只能在哪一个主机上访问当前msql 服务器。 localhost 代表只能在本机访问,不能远程访问。 % 代表可以远程访问。

1.查询MySQL用户 

查询mysql中的用户的用户名

cef5409c1a9840d4bdfca43e136d201e.png
cef5409c1a9840d4bdfca43e136d201e.png

 查询mysql中的用户的主机名(主机地址)

538f761d8c9b4377af68ef23e3f460f2.png
538f761d8c9b4377af68ef23e3f460f2.png

也可以直接找到mysql数据库,里面有一个user表。点开看看 如图这是我给150.158..主机上面的mysql创建的用户。

ae7b001b627f43ca8122558065b45c91.png
ae7b001b627f43ca8122558065b45c91.png

2.创建用户 (新创的用户只能访问information_schema这一个数据库)

要想查询到所有数据库,需要这个用户授权

创建用户,只能在本机访问 

代码语言:javascript
复制
create user '用户名'@'localhost' identified by '123456';

并设置密码为123456

935a4a86d6104812b6600101d4b2ca15.png
935a4a86d6104812b6600101d4b2ca15.png

创建用户,能在任意主机访问该数据库。(远程访问)

代码语言:javascript
复制
create user 'root'@'%' identified by '123456';

并设置密码为123456

8344581200604af9bb4a5634a4beb184.png
8344581200604af9bb4a5634a4beb184.png
c83ec5ec536a464da2ff8f8031f25aea.png
c83ec5ec536a464da2ff8f8031f25aea.png
14fbb8f1183f471aae38ee3b781b36f7.png
14fbb8f1183f471aae38ee3b781b36f7.png

3.修改用户密码 

修改用户 root 的密码 为 123456

代码语言:javascript
复制
alter user 'root'@'localhost' identified with mysql_native_password by '123456';

4.删除用户 

删除 hehuanshu @localhost用户

代码语言:javascript
复制
drop user 'hehuanshu'@'localhost';

5.注:在创建密码/修改密码不成功 

这是由于mysql当中提供了 密码策略 相关功能。在某些等级下,如果密码设置过于简单,就会出现创建/修改密码不成功的问题。 解决办法: 1.设置更为复杂的密码,比如拥有大小写字母、数字、特殊符号的密码,并且密码长度大于8位。这样就可以满足 2.修改密码策略等级

密码策略等级 validate_password_policy有三个等级:

  • LOW(低):主要看密码长度(由validate_password_length决定),对复杂性没强制要求,适用于测试或开发环境。
  • MEDIUM(中):要求密码长度达标,且至少包含数字、小写字母和大写字母中的两种,适用于一般生产环境。
  • STRONG(强):要求密码长度达标,且必须包含数字、小写字母、大写字母和特殊字符,用于高安全级别的系统。

查询密码策略等级

代码语言:javascript
复制
SHOW VARIABLES LIKE 'validate_password%';
bd20118fb4514c84bd1dcb25e865e9b0.png
bd20118fb4514c84bd1dcb25e865e9b0.png

上面是我的数据库密码策略等级。我的等级是低级。并且长度最少是6位。

代码语言:javascript
复制
validate_password_policy=LOW
validate_password_length=6

修改密码长度/密码策略等级 

代码语言:javascript
复制
SET GLOBAL validate_password_policy = LOW;
SET GLOBAL validate_password_length = 6;

注:等级LOW、MEDIUM、STRONG设置的时候,必须填大写字母。

二十五、DCL权限控制语句

a585ef9a744a49958713e67430121700.png
a585ef9a744a49958713e67430121700.png
2d4de45d2ec04a4e8abbbb601c1ae982.png
2d4de45d2ec04a4e8abbbb601c1ae982.png

1.查询权限

代码语言:javascript
复制
show grants for 'heima'@'%';

我们看到了这个用户的权限是 usage 。没有其他权限仅仅能够连接并登录上mysql而已

c004c9faa79548709e1dbe2d4bb9be40.png
c004c9faa79548709e1dbe2d4bb9be40.png
6c1481d02e8e4f9e8a9268fbf37cd84f.png
6c1481d02e8e4f9e8a9268fbf37cd84f.png

2.授予权限

代码语言:javascript
复制
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';

这个语句是授予所有权限给 'root'@'%' 这个用户。

代码语言:javascript
复制
grant all on spring_blog.* to 'root'@'%';

这个语句是授予 'root'@'%' 这个用户 操作 spring_blog这个数据库 所有权限。

2c3a20b2cf3c46e69f3538500666a570.png
2c3a20b2cf3c46e69f3538500666a570.png

再次查看'heima'@'%'这个用户的权限 

e5ce67e00315400584fa00d56f4b1c8d.png
e5ce67e00315400584fa00d56f4b1c8d.png

 发现它多了一个权限,就是操作 itcast 这个数据库的所有权限

3.撤销权限

假如撤销 'heima'@'%'这个用户 对数据库 itcast 的所有权限。

代码语言:javascript
复制
revoke all on itcast.* from 'heima'@'%';
9ddf17c6425143d3a3acf7191c16a8ac.png
9ddf17c6425143d3a3acf7191c16a8ac.png

 再次查询这个用户的权限,发现它已经没有对 itcast 这个数据库的操作权限了。

9b0d6b2b34264aafb4f963c094451bb9.png
9b0d6b2b34264aafb4f963c094451bb9.png

 二十六、DCL语句小结

e8d16552db0148dbb39256cbc3677268.png
e8d16552db0148dbb39256cbc3677268.png

 二十七、基础(函数) 字符串函数

e5038a31ee83431a8e4bc96ba6117c7e.png
e5038a31ee83431a8e4bc96ba6117c7e.png
a2e0e5cc32a04813a0333cdccf5127ea.png
a2e0e5cc32a04813a0333cdccf5127ea.png
0f76c670ea9a478b937668a3e41e1e9e.png
0f76c670ea9a478b937668a3e41e1e9e.png

这里讲解几个相对比较常用的字符串函数。 字符串函数

464ef5be2f7e4b9580c87db9560af7c1.png
464ef5be2f7e4b9580c87db9560af7c1.png

concat 字符串拼接 

2f7cd3f65f504756bb529ea2597becb7.png
2f7cd3f65f504756bb529ea2597becb7.png

lower 全部字符转小写

7742f08d156a4d99b22a5616675caf1e.png
7742f08d156a4d99b22a5616675caf1e.png

upper 全部字符转大写 

3cc29e95976e430786c9041e18facfe2.png
3cc29e95976e430786c9041e18facfe2.png

lpad 左填充

2cba1642ecc94831861a637528b88f09.png
2cba1642ecc94831861a637528b88f09.png

rpad 右填充

dee970f97d9d422c92c58d4622024214.png
dee970f97d9d422c92c58d4622024214.png

trim 去除空格。前面和后面的空格就已经不在了

6323e76629df449a9f4aae9064945c34.png
6323e76629df449a9f4aae9064945c34.png

substring 字符串截取

00c596da4c4747a48ae32b37584bf098.png
00c596da4c4747a48ae32b37584bf098.png

案例:

e06f0c7e41ea4c508e029e0587739fa6.png
e06f0c7e41ea4c508e029e0587739fa6.png
5eec678530344309949fc82dffce4990.png
5eec678530344309949fc82dffce4990.png

二十八、数值函数

05a58cf105d1463d863ccb40ed75d8ee.png
05a58cf105d1463d863ccb40ed75d8ee.png
10ad7dc859b64a54b4d7711f9264798c.png
10ad7dc859b64a54b4d7711f9264798c.png

答案: 2 1 3 

select rand();   0~1之间的随机数

774e6360c0264680ae2d19ca96e2fb20.png
774e6360c0264680ae2d19ca96e2fb20.png

round 保留小数位数。四舍五入 

49e89bc1840e435ba6111f409a51292c.png
49e89bc1840e435ba6111f409a51292c.png

案例:

0b5d983483084348ad5dc21624f65257.png
0b5d983483084348ad5dc21624f65257.png

二十九、日期函数

27d95da42b204635808be9f7934584e3.png
27d95da42b204635808be9f7934584e3.png

当前日期  年月日

9ca702059f81470bb136b74c81a71bc6.png
9ca702059f81470bb136b74c81a71bc6.png
4244e7f8cf034c1db75c08422bfdbeda.png
4244e7f8cf034c1db75c08422bfdbeda.png

当前时间 时分秒

5a03e9a1e936449c89b6d3acfe68def2.png
5a03e9a1e936449c89b6d3acfe68def2.png
771ee94f920346e7bfc862d8cfc6b020.png
771ee94f920346e7bfc862d8cfc6b020.png

当前时间 : 年月日+时分秒 

80928f33d97d4105afec333b6fe9970a.png
80928f33d97d4105afec333b6fe9970a.png
c043d689497c4889b0ee586a714cdd8e.png
c043d689497c4889b0ee586a714cdd8e.png

year month day 获取 日期中的年/月/日。 

410d229584c44e33883d5f7dc9732866.png
410d229584c44e33883d5f7dc9732866.png

date_add把时间往后退.. year month day 代表时间单位

7b90fa2257f24f9ab83d9ad880638d15.png
7b90fa2257f24f9ab83d9ad880638d15.png

datediff 相差几天 第一个时间 减去 第二个时间

3da63ac0b7694508bdfbb44daab03720.png
3da63ac0b7694508bdfbb44daab03720.png

 案例:

99ea3e342d5f43a0848cda934585da7f.png
99ea3e342d5f43a0848cda934585da7f.png

三十、流程控制函数

4553db018c5c47289174c9d910e7dd47.png
4553db018c5c47289174c9d910e7dd47.png
e916bdf432c94a8692ae55e83124b4f0.png
e916bdf432c94a8692ae55e83124b4f0.png

 如上图。  if 语句 如value 为 true 返回 ok  为 false 返回 default ifnull 如果 value1为 null 返回 value2。    不为null 返回 value1

9f5d39e38b2a4e36bf34fb245a9a1694.png
9f5d39e38b2a4e36bf34fb245a9a1694.png
ea949a38e2f147f48defd618c4dceeb1.png
ea949a38e2f147f48defd618c4dceeb1.png

案例:

3480551c8f8a4dc3add5452ab8965526.png
3480551c8f8a4dc3add5452ab8965526.png
1936dec341c24a01861e011185ff26ca.png
1936dec341c24a01861e011185ff26ca.png

三十一、函数-小结

0a7797c9c0af4c57bc5a3d9eaa890b89.png
0a7797c9c0af4c57bc5a3d9eaa890b89.png
5a71619c7a104448ad0c4913b3610e52.png
5a71619c7a104448ad0c4913b3610e52.png

三十二、约束 概述(约束)

c2bbbdcacba044a3a36649b18dbfb3d4.png
c2bbbdcacba044a3a36649b18dbfb3d4.png
28ea49efa7fb4214b7db54f5a6ac6cfd.png
28ea49efa7fb4214b7db54f5a6ac6cfd.png

三十三、约束演示

9df0b4c9004e4c549a98dbd0af64a67b.png
9df0b4c9004e4c549a98dbd0af64a67b.png
fee182bcd1bd44aba5ef40da90ca7f20.png
fee182bcd1bd44aba5ef40da90ca7f20.png

黄色小钥匙代表 Id 是主键 

2d507eed4d404e3090b2ba2077d82d64.png
2d507eed4d404e3090b2ba2077d82d64.png

user 表 中 已经 有 Tom3 了 重复了。我们设置name是唯一的属性

4dfa879a784142abb82f7feaa6c55c20.png
4dfa879a784142abb82f7feaa6c55c20.png

即便刚才报错 ,插入失败, 但是已经向数据库申请到了主键4了。因此后面再插入主键就是5

be9cc92530e54e58bf0f4d265e1f22c5.png
be9cc92530e54e58bf0f4d265e1f22c5.png

通过图形化界面创建表

43cd2931751d44f4a540cd05d6ce9cef.png
43cd2931751d44f4a540cd05d6ce9cef.png

三十四、约束-外键约束

55f0d352d4304c9797a22d3e1121b98c.png
55f0d352d4304c9797a22d3e1121b98c.png

 这两张表只是逻辑上存在关联。并没有物理上关联。如果一号部门删了。但是员工表还关联了这么多1号部门的员工。这就无法保证数据的一致性和完整性。 因此在创建表的时候,我们需要去进行外检约束。语法如下:

2cb4ef344b7a44a98fb52e5cf762b1ac.png
2cb4ef344b7a44a98fb52e5cf762b1ac.png
90f2f1eebcac44e29ca3e9aac779160a.png
90f2f1eebcac44e29ca3e9aac779160a.png
37ec5f6b533141c4a09c7d9df25ae535.png
37ec5f6b533141c4a09c7d9df25ae535.png
c6ea34fb9589494e9c209305a1a0a532.png
c6ea34fb9589494e9c209305a1a0a532.png
43bc17fc56654483bd87019e07d7a641.png
43bc17fc56654483bd87019e07d7a641.png

执行外检约束 SQL 之后 ,钥匙变蓝色。就说明已经是外键了。 此时就可以保证数据的 完整性和 一致性。

2be6416f5bea49d1821d4a6bdec6dcfa.png
2be6416f5bea49d1821d4a6bdec6dcfa.png

此时再删除研发部。会发现报错了。告诉我们不能删除或更新一个父表的记录。 因为存在这个外键关联 

6addac2652df41f39a3795d4baeb0c1a.png
6addac2652df41f39a3795d4baeb0c1a.png
2914dc0731e94066b3e0639388f84b8e.png
2914dc0731e94066b3e0639388f84b8e.png

删除外键 

06e418f6f70d4c5fb25bb0470a4c0575.png
06e418f6f70d4c5fb25bb0470a4c0575.png

三十五、约束-外键删除 更新行为

b1a7da8f4ca948038a7471c38084edea.png
b1a7da8f4ca948038a7471c38084edea.png

NO ACTION(no action)无行为      这是外键约束的默认行为   RESTRICT  (restrickt )  限制 CASCADE  (cascade) 级联,串联 SET NULL   (set null)  设置为null    SET DEFAULT (set default)  我们如何在创建外键的时候,来指定他们删除或更新的规则呢? 如上图。我们设置 在 删除 和 更新 都设置了 cascade。

597040327fde43bdbe6d0c3f9e96e61c.png
597040327fde43bdbe6d0c3f9e96e61c.png

图形化界面

b79e1056dc8645b39b012bbd3144edbc.png
b79e1056dc8645b39b012bbd3144edbc.png

三十六、约束-小结

e5ed0803e8fe4181b426252335030d7f.png
e5ed0803e8fe4181b426252335030d7f.png

三十七、多表查询-多表关系介绍(多表查询)

161a46208fa347cbbfccf8ccdd245be4.png
161a46208fa347cbbfccf8ccdd245be4.png
78ee64d4a9e74a028fe23b3fe63e8978.png
78ee64d4a9e74a028fe23b3fe63e8978.png
88aaa0e51d60457c99db8e729e2e37b5.png
88aaa0e51d60457c99db8e729e2e37b5.png

多对对关系。 

707420e7eef54674a21dfeb0df097716.png
707420e7eef54674a21dfeb0df097716.png
6998b3ba21f2405ba2c44ab673cd54f6.png
6998b3ba21f2405ba2c44ab673cd54f6.png
2e072a5ae2fa4d52bb462306d7ffa506.png
2e072a5ae2fa4d52bb462306d7ffa506.png
f39d61b6ed5642049da951b9c4256f75.png
f39d61b6ed5642049da951b9c4256f75.png

以可视化界面形式展示多表之间的关系 

75c402e7877c4a9e8ba1db54d290c8fd.png
75c402e7877c4a9e8ba1db54d290c8fd.png
fcf54bea9b3747328f02afba5e0d4ff3.png
fcf54bea9b3747328f02afba5e0d4ff3.png

 一对一关系

d54cb5f9477847fe8ec994904c8677e9.png
d54cb5f9477847fe8ec994904c8677e9.png
b28935306a564aa8a9fdcf4639d39e69.png
b28935306a564aa8a9fdcf4639d39e69.png
b3b2fe297d064c31b77d62d3df87627e.png
b3b2fe297d064c31b77d62d3df87627e.png
d012b05905c547d3837e448d0f24be48.png
d012b05905c547d3837e448d0f24be48.png
cb6543c2d9d3401fb9db441327a40705.png
cb6543c2d9d3401fb9db441327a40705.png
c4c4cebeda9542058d90f43e4533cc20.png
c4c4cebeda9542058d90f43e4533cc20.png

三十八、多表查询-概述

a631658fcb014fb0b3be18fa14f3bad8.png
a631658fcb014fb0b3be18fa14f3bad8.png
37d94045a6df4d31b4795f5897358fd3.png
37d94045a6df4d31b4795f5897358fd3.png
f0138a70d0d9445cb11537d3eb6c3e00.png
f0138a70d0d9445cb11537d3eb6c3e00.png
66eca0a376ea4f2880ebb25d737bbf0e.png
66eca0a376ea4f2880ebb25d737bbf0e.png

笛卡尔积  消除无效 笛卡尔积 令dept_id = dept.id 如下第二张图。 数据从102条 变成了 16条。 那么明明一共有17个员工。最后一个员工去哪里了? 因为最后一个员工是新入职的。还没有分配部门。因此不满足我们的查询条件。

b3897af841dd485c86bb82b1eae37f13.png
b3897af841dd485c86bb82b1eae37f13.png
653435baf1f842c5a45ce56736857470.png
653435baf1f842c5a45ce56736857470.png

三十九、-内连接

50040eba577f4acfa310dc5dc347b43a.png
50040eba577f4acfa310dc5dc347b43a.png

1.隐式内连接。 一共17个员工,只得到16条数据。因为通过内连接。查询到的是两张表交集的部分。 因此由于有一个员工没有部门。部门id 为null。因此不会查询到他的数据。  当 表名比较长的时候。不方便看,我们也可以给表起一个别名。

99d83b94871b4c6aa074686bfa3182c0.png
99d83b94871b4c6aa074686bfa3182c0.png

2.显示内连接 

94aa90d4511c4ebf942c947ff19e6c63.png
94aa90d4511c4ebf942c947ff19e6c63.png

四十、-外连接

b0969a01aaba49b5b1b3822fa683fce3.png
b0969a01aaba49b5b1b3822fa683fce3.png
352994c10d8c4410a14d13cc49981fe6.png
352994c10d8c4410a14d13cc49981fe6.png

左外连接(常用)右外连接可以写成左外连接的形式。 

98915822057844db87bd215351e3b22d.png
98915822057844db87bd215351e3b22d.png
64517e47554a4d829e4a4595065cab69.png
64517e47554a4d829e4a4595065cab69.png

如上图。因为左连接查询到的是 员工表所有的信息 + 员工表和部门表交集的信息 即使没有部门的 id 。也能查到这个员工的信息。返回17条数据。 

右外连接不常用,也因为右外连接其实可以用左外连接的形式写出来。 只需要 在SQL 中 把两张表 的位置互换就行了。 查询的数据是一样的。

7f3d350a99fd4ff6aa63e38e3d213ad3.png
7f3d350a99fd4ff6aa63e38e3d213ad3.png

四十一、-自连接

自连接查询语法:

代码语言:javascript
复制
select 字段列表 from 表A 别名A join 表A 别名B on 条件...;

自连接查询,可以是内连接查询,也可以是外连接查询。

一张表自己连接自己。

a6a917ca3d5c4183946fa00b8e2d476c.png
a6a917ca3d5c4183946fa00b8e2d476c.png
62137b9ab2034eb5a22e9a0f161c4f79.png
62137b9ab2034eb5a22e9a0f161c4f79.png

1.查询员工 及其 所属领导的名字 

我们发现员工表中并没有所属领导的名字。不过有所属领导id,也就是managerid。  此时就可以进行自连接查询了

a8d474b1ad884803b64d8f19b7b47e8b.png
a8d474b1ad884803b64d8f19b7b47e8b.png

查询效果如下

48ee2b4daee74478bdf0572d5ccc19cb.png
48ee2b4daee74478bdf0572d5ccc19cb.png
6a3dcd5e485b41b18fe5615af9503026.png
6a3dcd5e485b41b18fe5615af9503026.png

 2.由于没有领导也要查询出来。因此我们要进行外连接查询。采用左连接的方式,如下。

73e6ee341e6446bc96f8b1549b69cc67.png
73e6ee341e6446bc96f8b1549b69cc67.png

四十二、-联合查询union(重点)

8febeaca26554555a996ee6b86f9c962.png
8febeaca26554555a996ee6b86f9c962.png
b701690b20924e1ebe96f578f9706966.png
b701690b20924e1ebe96f578f9706966.png
38851a3b2b2b4447b74b06a882075239.png
38851a3b2b2b4447b74b06a882075239.png
734d1f07258243419d5af3bc47f9160a.png
734d1f07258243419d5af3bc47f9160a.png
5c1034165cd843ec8398b278c77a91b3.png
5c1034165cd843ec8398b278c77a91b3.png

 合并起来 答案如下: 有一个员工是重复的。如果想合并后再去重 可以把 all 这个关键字去掉

d89393f961ac49e18ddb500c67089d91.png
d89393f961ac49e18ddb500c67089d91.png
26f47bfa3b1841f19e7c44a2d2fbdae3.png
26f47bfa3b1841f19e7c44a2d2fbdae3.png

四十三、-子查询介绍

3f69ab3b77ae476eb0438b8538a3650f.png
3f69ab3b77ae476eb0438b8538a3650f.png

四十四、-标量子查询

59e8a714ea264f0b8bda48ccd9009055.png
59e8a714ea264f0b8bda48ccd9009055.png

由于嵌套内部结果是单个值。因此我们叫做 标量子查询。 

有两张表,第一张表是员工表。第二张表是部门表。 查询“销售部”的所有员工信息。

aac97a7004c54450b5bce999d03f2e1b.png
aac97a7004c54450b5bce999d03f2e1b.png

从好理解的角度。我们把这个问题拆分为两个部分。 1. 查询销售部门Id 2.根据这个id查询员工信息 

18d74c5ce5044c2cb50d3390841100b3.png
18d74c5ce5044c2cb50d3390841100b3.png

这两个语句可以合为一个SQL语句。采用嵌套的方式。

f7640bbc08b1408882e866fe6f2f732e.png
f7640bbc08b1408882e866fe6f2f732e.png

 查询“方东白” 入职之后的员工信息

32f44d394e014da7a700c97bd7d1f9c2.png
32f44d394e014da7a700c97bd7d1f9c2.png

四十五、-列子查询

a75a5c5974584184b8c8b905b3891fa3.png
a75a5c5974584184b8c8b905b3891fa3.png

案例:

f69c7719b01c4cd09fd4e8b46b04d30f.png
f69c7719b01c4cd09fd4e8b46b04d30f.png

1. 

8ec7d7da5540455aa8bdbed7dbb908f1.png
8ec7d7da5540455aa8bdbed7dbb908f1.png
6cc768a946624585afe66a774f31ee9d.png
6cc768a946624585afe66a774f31ee9d.png

2.查询比 财务部 所有人工资都高的员工信息。

07f7e52283bf44fdb08bad66a3d8047e.png
07f7e52283bf44fdb08bad66a3d8047e.png
c2df4f7c78424156bdb932add075430f.png
c2df4f7c78424156bdb932add075430f.png
57ef6a2f13794179b1cb0e4cbc3c839b.png
57ef6a2f13794179b1cb0e4cbc3c839b.png

下面是这个问题的 答案。嵌套了两层。 all的用法  子查询返回的结果都需要满足 用all。就是比财务部最高的工资的人的工资还要高

4e9dceb5833a46d09b7ce9b0d433af37.png
4e9dceb5833a46d09b7ce9b0d433af37.png

3. any的用法(some效果一样) 满足子查询返回的任意一个返回结果就行了

c5de823daa904390a3c4b49ae2f7557a.png
c5de823daa904390a3c4b49ae2f7557a.png
191c4fe9f0354fd2a655a91c5580d8dc.png
191c4fe9f0354fd2a655a91c5580d8dc.png
baf4383e90974f9da2276a71d7697328.png
baf4383e90974f9da2276a71d7697328.png

四十六-行子查询

636a9433394e4d949996ce7ffa6e7ad5.png
636a9433394e4d949996ce7ffa6e7ad5.png

查询与“张无忌”的薪资及直属领导相同的员工信息。 

拆分:

8ce68f5405cb459bbc39bc670a37793c.png
8ce68f5405cb459bbc39bc670a37793c.png

 其实b. 还有一种写法,如下。

9c4eab9a65304224a53a57d16a89ed13.png
9c4eab9a65304224a53a57d16a89ed13.png

合并: 答案如下。

c5f973f7410b499ea29e161d9b9fa478.png
c5f973f7410b499ea29e161d9b9fa478.png

四十七、-表子查询

c4deb87c57c24b9f8a2774bda704d5df.png
c4deb87c57c24b9f8a2774bda704d5df.png
d3174affb1004f8d93e21f93332892cd.png
d3174affb1004f8d93e21f93332892cd.png
6b77aafcdc06490b92c2cb508bffee1e.png
6b77aafcdc06490b92c2cb508bffee1e.png

2.查询入职时间是‘2006-01-01’ 之后的员工信息。及其部门。 我们需要把a.查出来的信息。作为一个表。再去左连接查询。因为没有部门的员工也要被查询出来。因此用左连接。

ab319a16e3a143e6bf12fcf30ee27caa.png
ab319a16e3a143e6bf12fcf30ee27caa.png
09f72f35e59e4f269bb3dc0078f26617.png
09f72f35e59e4f269bb3dc0078f26617.png

四十八、多表查询-练习一

d6dadc42110c4a2ba3dc9c8348c2076f.png
d6dadc42110c4a2ba3dc9c8348c2076f.png

1.查询员工的姓名、年龄、职位、部门信息(交集隐式 内连接)    表:emp , dept    内连接    连接条件:emp.dept_id = dept.id

代码语言:javascript
复制
select e.name,e.age,e.job,d.name from emp e,dept d where e.dept_id = d.id;
12308622aca54a11b29268c2d58006af.png
12308622aca54a11b29268c2d58006af.png

2.查询年龄小于30岁的员工的姓名、年龄、职位、部门信息     表:emp、dept    内连接    连接条件:emp.dept_id = dept.id;

代码语言:javascript
复制
select e.name,e.age,e.job,d.name from emp e inner join dept d on d.id = e.dept_id where age < 30;
e1eaf167b5124717bc92516ad5a5e60a.png
e1eaf167b5124717bc92516ad5a5e60a.png

3.查询拥有 员工 的部门 id 部门名称    表:dept    内连接    连接条件:emp.dept_id = dept.id;

5dbcdd4dd4d045a2aa5e6bf75e21f9f2.png
5dbcdd4dd4d045a2aa5e6bf75e21f9f2.png

 4.查询所有年龄大于40岁的员工,及其归属的部门,如果员工没有分配部门,也要展示出来  表: emp、dept  外连接  连接条件:emp.dept_id = dept.id;

47894d828d9148aa948717d51b9f2e34.png
47894d828d9148aa948717d51b9f2e34.png

5.查询所有员工的工资等级。  表:emp、salgrade 连接条件:emp.salary >= salgrade.losal and emp.salary <= salgrade.hisal;

092528a31b2e4668b1556d6ee22017c8.png
092528a31b2e4668b1556d6ee22017c8.png

6.查询“研发部” 所有员工的信息及工资等级  表:emp salgrade dept

69ce1bb48b2e44228af144bccd381147.png
69ce1bb48b2e44228af144bccd381147.png

格式化SQL语句 

951aa17b4bb941abb9d149a085be0264.png
951aa17b4bb941abb9d149a085be0264.png

 7.查询“研发部”所有员工的平均工资

326778b3dad94427b183e151f9da8b68.png
326778b3dad94427b183e151f9da8b68.png

8. 查询工资比“灭绝”高的员工信息

cbad11ce950f431080d237da31aac98e.png
cbad11ce950f431080d237da31aac98e.png

9.查询比平均工资高的员工信息 

f9128d6fea5f4d8a9ad81b6686c94270.png
f9128d6fea5f4d8a9ad81b6686c94270.png

10、查询低于本部门平均工资的员工信息 

这个问题比较难,先拆分一下 --

a.查询指定部门的平均薪资

代码语言:javascript
复制
select avg(e1.salary) from emp e1 where e1.dept_id = 1;

我们将a作为一个子查询条件

代码语言:javascript
复制
select *
from emp e2
where e2.salary < (select avg(e1.salary) from emp e1 where e1.dept_id = e2.dept_id);
37d5082b06a84f4d9a55a85096615ab7.png
37d5082b06a84f4d9a55a85096615ab7.png

验证 :我们将子查询作为一个字段 并起别名‘当前部门平均薪资’

ccd4f26415744bf9b63ea87799479765.png
ccd4f26415744bf9b63ea87799479765.png

11.查询所有的部门信息,并统计部门的员工人数 

拆分一下

a.查询所有部门的信息 :

代码语言:javascript
复制
 select * from dept;

b.查询某个部门的人数

代码语言:javascript
复制
select count(*) from emp e where e.dept_id = 1;

合起来就是

代码语言:javascript
复制
select *,(select count(*) from emp e where e.dept_id = d.id) '部门员工人数' 
from dept d;
5269d19b8a364964b40ecae1a0d72823.png
5269d19b8a364964b40ecae1a0d72823.png

12.查询所有学生的选课情况,展示出学生名称,学号,课程名称    表:student  ,  course,  student_course   连接条件: student.id = student_course.studentid, coursstudent_coursee.id = .courseid,

2beb42e1356b4f5cb762c6766f67c3f0.png
2beb42e1356b4f5cb762c6766f67c3f0.png
d458d4fe33da49c9848e93d0988a9fb3.png
d458d4fe33da49c9848e93d0988a9fb3.png

四十九、多表查询-练习二

五十、多表查询-小结

5b30ffc2ef6e461fa4d56b141e3cba45.png
5b30ffc2ef6e461fa4d56b141e3cba45.png

五十一、事务-简介

88e360aa6900426c9006b1a8c2b6c701.png
88e360aa6900426c9006b1a8c2b6c701.png
b968ff77b55341beb28db7bb93fd82e6.png
b968ff77b55341beb28db7bb93fd82e6.png

假如张三给李四转账一千元。正常来讲, 张三账户减少一千  李四账户增加一千。 若张三减少后,抛出异常,李四的没有增加。那么就会出现大问题。 因此我们引出了事务。 若抛出异常,则会进行回滚。从而来保证数据的完整性和一致性。 对于mysql数据库,事务是默认自动提交。因此我们若想把若干操作放在事务内,需要手动开启事务。

5f67162a64b141f8a28cc0124eb44d9d.png
5f67162a64b141f8a28cc0124eb44d9d.png

 五十二、事务的操作

正常情况下 最初账户

261d75e9d4cc4f65ae254c7fdc7d2623.png
261d75e9d4cc4f65ae254c7fdc7d2623.png
89847d4641d54f56bb523c5a5aadff24.png
89847d4641d54f56bb523c5a5aadff24.png
9ca2e5f849ff4b37883feb6b5c76fcd7.png
9ca2e5f849ff4b37883feb6b5c76fcd7.png

异常情况下 ,张三账户减少一千。李四的没有增加一千。 因此我们需要把转账操作控制在一个事务范围内。 现在也有事务,对于当前来说,每一条SQL语句都是一个事务。

6d314171c6644a1fb8a108c4c9dddd86.png
6d314171c6644a1fb8a108c4c9dddd86.png
80655dd8d4f94a159ba0d562effd0801.png
80655dd8d4f94a159ba0d562effd0801.png

 事务操作(方式一:修改事务提交方式)

修改 @@autocommit 的值 1:自动提交 0:手动提交

ececf5598db0482bb7e1979231e4ec4e.png
ececf5598db0482bb7e1979231e4ec4e.png

select @@autocommit 若是 @@autocommit 为 1。代表事务是自动提交的。 我们修改为0,那么就会变成手动提交。

正常情况下 

e699815373994bf98c65c2825162280d.png
e699815373994bf98c65c2825162280d.png

设置为手动提交,此时执行SQL语句之后,只是临时修改了表中的数据,并没有提交到数据库。因此发现数据库表中的值没有改变。因为我们还没有执行提交事务的操作。 要把这个临时的操作提交到数据库,需要执行 commit 指令

b3f9c5c52b37470aac3172ae80aacc14.png
b3f9c5c52b37470aac3172ae80aacc14.png

再次打开数据库表。刷新一下就发现数值改变了。事务执行完成

异常情况下

bd430e3e968d4de2861a97f4599bb4e5.png
bd430e3e968d4de2861a97f4599bb4e5.png
da0bce8d3224420d8441a07181d94c9b.png
da0bce8d3224420d8441a07181d94c9b.png

再次执行这个转账操作。执行完毕之后。会发现报了异常。 此时我们就不能再执行提交事务。 而是执行回滚事务。

fb165e29f913489bbaccb83e4d0360d4.png
fb165e29f913489bbaccb83e4d0360d4.png

再次打开数据库表,会发现,数据库没有变化。张三的前没有少一千。李四自然也没多一千

这样事务就控制了 如果执行事务操作正常,我们会执行commit; 事务提交操作 如果执行事务操作出现异常,我们会执行 rollback; 事务回滚操作

事务操作(方式二:开启事务)

代码语言:javascript
复制
start transaction;

代码语言:javascript
复制
begin;
ab9681b7b5d64476ab8ea5f81a0883f2.png
ab9681b7b5d64476ab8ea5f81a0883f2.png

我们首先把事务提交方式改为自动提交也就是@@autocommit 为 1。 不需要改为0。

但我们需要执行

代码语言:javascript
复制
start transaction;

或

代码语言:javascript
复制
begin;

然后再执行一下这个异常转账操作

抛出了异常,报错了。此时表中的数据不会发生变化。

一单有异常,我们要做的是 执行回滚事务rollback。   而不是commit提交。

只要没提交,数据库的数据就不会发生变化。

7174dea476f34e6b8e4bfd0ed7c50cc9.png
7174dea476f34e6b8e4bfd0ed7c50cc9.png

  五十三、事务的四大特性

ACID  原子性:事务是不可分割的最小操作单元,要么全部执行成功,要么全部失败。 一致性: 事务完成时,所有数据都必须保持一致状态。多多少少加起来必须恒定 隔离性:依赖数据库提供的隔离机制。保证事务不受外部并发操作的影响。 持久性:事务一旦提交或回滚,对数据库的改变都是永久的(存储在磁盘(文件中))

27d051d692ea431dbfd9a71fe96b508e.png
27d051d692ea431dbfd9a71fe96b508e.png
4db37c813cc14684b15f63639db42249.png
4db37c813cc14684b15f63639db42249.png
4d8537fb9da24f7d858d534befed12ab.png
4d8537fb9da24f7d858d534befed12ab.png

五十四、 并发事务问题

脏读: B事务读取到了A事务还没有提交的数据

1a2454ff533140e4a6adfb969ca5469d.png
1a2454ff533140e4a6adfb969ca5469d.png

A事务 查询了 id = 1 的数据。 B事务同时修改了 id = 1 的数据 A事务又一次查询了 id = 1 的数据 两次读取到的数据不同。称之为不可重复读。

4ff40bcbc68c48b79badea15ba40eae9.png
4ff40bcbc68c48b79badea15ba40eae9.png

 A事务在查询的时候没有 Id = 1 的数据。然后准备插入这个数据 但是B事务同时插入了id = 1 的数据。 因为 id 是自增主键。是唯一的。 导致A事务。插入不成功。 这就是幻读。对于A事务来说,查询时没有对应数据,但是插入时又发现这个数据已经存在

112e1db69cdd454482ba3398791b1301.png
112e1db69cdd454482ba3398791b1301.png

五十五、事务的隔离级别

从上到下隔离级别越高。不过性能也会越差。 默认级别是mysql的。 oracle默认级别是 read committed 

Read uncommitted               (读未提交 的隔离级别)  Read committed                   (读已提交 的隔离级别) Repeatable Read(默认)   (可重复读 的隔离级别) Serializable                          (串行化 隔离级别) 串行化指的是在进行并发事务操作。只允许一次一个事务来操作。只有等A事务提交完成之后。B事务才能操作。 我们一般使用默认的事务隔离级别,不去修改。

5fbeb27c2ad44464abe1cbc2139d792a.png
5fbeb27c2ad44464abe1cbc2139d792a.png

查看事务隔离级别。

af7a36d0baa74cd0b01a7a859301fc31.png
af7a36d0baa74cd0b01a7a859301fc31.png

设置事务隔离级别

672555a7e8b64f71b332caa471c5359e.png
672555a7e8b64f71b332caa471c5359e.png

脏读 演示: 将事务隔离级别修改为 read uncommitted A事务读取到了B事务未提交的数据

7bf417f2cd314ab4a4e6f24a4ee8dc3f.png
7bf417f2cd314ab4a4e6f24a4ee8dc3f.png

不可重复读 演示: 将事务隔离级别修改为 Read Committed 同一个SQL查询。在一个事务中查询的结果不一样。就是不可重复读

3bf74423ef2f4383b23f621c440e831b.png
3bf74423ef2f4383b23f621c440e831b.png

将事务隔离级别修改为 Repeatable Read 如下图。会发现解决了不可重复读问题。 变得可重复读了。最后当我们提交事务之后。 再次查询,此时就可以查到最新的数据了

88ff46d5f7994b54b3ac89c1e79541b0.png
88ff46d5f7994b54b3ac89c1e79541b0.png

幻读 演示 : A事务本身没查到数据,准备添加的时候。发现数据又已经存在。再查,还是没有

3d7dc18870374c1bbf1b77d36d1bd45e.png
3d7dc18870374c1bbf1b77d36d1bd45e.png

 要想解决幻读问题, 此时就需要修改事务隔离级别为 Serializable 此时当我们事务 A 查询 where id = 4 之后。当事务B再想插入的时候就会发现插入不成功,被阻塞了。只有等事务 A 操作完了。事务 A添加完了,添加成功之后。提交之后。事务B此时不再阻塞。而是报错提示 数据已经存在了。

50654e94c0a34b86ab67e55c810d0917.png
50654e94c0a34b86ab67e55c810d0917.png

五十六、事务-小结

f0e7c7888bbd4af99f7a25c7aa137136.png
f0e7c7888bbd4af99f7a25c7aa137136.png

五十七、基础篇总结

574612c5385740d2a7130e55cf389710.png
574612c5385740d2a7130e55cf389710.png

只有到运维篇你也掌握了。MySQL 才算真正毕业了!!!!!!!!!!!! 

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 如有侵权立马删除!!!!!!! 
  • 一、课程介绍
  • 二、基础篇(MySQL概述)
  • 三、MsSQL安装及启动
  • 四、MySQL数据模型 
  • 五、基础篇(SQL)通用语法及分类
  • 六、DDL语句 数据库操作(数据库定义语言)
  • 七、DDL语句 表操作 -创建查询
  • 八、DDL 数据类型及案例
    • 1.1 数值类型
    • 1.2 字符串类型
  •  九、DDL 表操作 修改删除
    • 9.1添加字段
    • 9.2修改数据类型 
    •  9.3删除字段
    • 9.4修改表名
    • 9.5删除表操作
  • 十、DDL语句小结
  • 十一、MySQL图形化界面工具
  • 十二、DML语句  插入/增加数据(数据操作语言)
  • 十三、 DML语句 更新和删除
    • 13.1更新
    •  13.2删除
  • 十四、DML语句小结
  •  十五、DQL语句 基础查询(数据库查询语言)
  • 十六、DQL语句 条件查询
  • 十七、 DQL语句 聚合函数
  • 十八、分组查询
  • 十九、排序查询
  • 二十、分页查询
  • 二十一、DQL案例练习
  • 二十二、DQL-执行顺序
  • 二十三、DQL语句 小结
  • 二十四、DCL 用户管理(数据控制语言) 
    • 1.查询MySQL用户 
    • 2.创建用户 (新创的用户只能访问information_schema这一个数据库)
    • 3.修改用户密码 
    • 4.删除用户 
    • 5.注:在创建密码/修改密码不成功 
    • 修改密码长度/密码策略等级 
  • 二十五、DCL权限控制语句
    • 1.查询权限
    • 2.授予权限
    • 3.撤销权限
  •  二十六、DCL语句小结
  •  二十七、基础(函数) 字符串函数
    • 案例:
  • 二十八、数值函数
    • 案例:
  • 二十九、日期函数
    •  案例:
  • 三十、流程控制函数
    • 案例:
  • 三十一、函数-小结
  • 三十二、约束 概述(约束)
  • 三十三、约束演示
  • 三十四、约束-外键约束
  • 三十五、约束-外键删除 更新行为
  • 三十六、约束-小结
  • 三十七、多表查询-多表关系介绍(多表查询)
  • 三十八、多表查询-概述
  • 三十九、-内连接
  • 四十、-外连接
  • 四十一、-自连接
  • 四十二、-联合查询union(重点)
  • 四十三、-子查询介绍
  • 四十四、-标量子查询
  • 四十五、-列子查询
  • 四十六-行子查询
  • 四十七、-表子查询
  • 四十八、多表查询-练习一
    • 格式化SQL语句 
  • 四十九、多表查询-练习二
  • 五十、多表查询-小结
  • 五十一、事务-简介
    •  事务操作(方式一:修改事务提交方式)
    • 事务操作(方式二:开启事务)
  •   五十三、事务的四大特性
  • 五十四、 并发事务问题
  • 五十五、事务的隔离级别
  • 五十六、事务-小结
  • 五十七、基础篇总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档