如有侵权立马删除!!!!!!! 38f29e1c35664563bdd42937aea43a80.png
一、课程介绍 e9dc84f289784c20988abcbaf9a9aa4f.png
78260b299a0e4f9e966d4b6c35ef98b9.png
二、基础篇(MySQL概述) cfcc6c4713054ad1bf39ba0e7a3f5d16.png
6f70539bf74047649952541edfbcd1ea.png
三、MsSQL安装及启动 2f244ed4b82b4176ac72253d736a782b.png
注:安装后在安装的时候,我们一般会设置开机自启
7fb3f7133d464341aed1950c4dbded4e.png
f440919729ab4e1b9d03c39f835c05a3.png
swdwdwadwadwdwdwawsss
74376f106d6443bfab25cc48b9e67574.png
四、MySQL数据模型 841a89811b214c0b85d0ac55242afb0b.png
如果不通过表结构存储数据的数据库,我们就称之为非 关系型数据库
f5b7260b318b4c1ab286981f0a711129.png
五、基础篇(SQL)通用语法及分类 327589fef5d34dcb97cac91708a5edc5.png
eadfc654bb944529acbde434ee68c62e.png
6d58d5ba3d654e1598b21bd34fc5d249.png
六、DDL语句 数据库操作(数据库定义语言) cc3ea1b8e59444cfa2b6b823bad7181b.png
七、DDL语句 表操作 -创建查询 b67900d8a3b444bebaa410b39bb07e55.png
03c4c8f9ae884af79732f8ede7018615.png
7232903012ad4716b6a5f4a205f96522.png
八、DDL 数据类型及案例 1.1 数值类型 3985f6b2e61c48dea2486c5b389780be.png
1.2 字符串类型 11d4518a5fe0403aa7bd984301b71207.png
1.3 日期时间类型
a531c55533ee466793502f3e035a307b.png
九、DDL 表操作 修改删除 9.1添加字段 c0e7d4133a56418095cfdf6fa7c4f802.png
584565f15a8648d99dabc08c66fe8d50.png
9.2修改数据类型 891f5b0f70334091956ae5c34c7cbf8e.png
05ac69471eef4234a3c3068bd0d1b9f4.png
9.3删除字段 4c4256071c8f431da54e4b04f1029258.png
2b8b8809f8fb4b9087d36536d0eb90f4.png
9.4修改表名 2ce2d375e5f44a87b76168105e8c4642.png
74ca3a92b02c404a967068a0f902d2c4.png
9.5删除表操作 132cffb6972a4e1c97ba2d5e42bb9e5a.png
注意:在删除表时,表中的全部数据也会被删除。
9e7cd316d6a14f78974f653849c69f6f.png
十、DDL语句小结 2d5954bb9e7d4e3e9bfe54cc758fe869.png
十一、MySQL图形化界面工具 DataGrip。比前两个功能更加强大。
d40f690c2cb1461b861c9e93911d3080.png
我们下载DataGrip进行使用
93e510c7187a4b1ab3d86212f5ead8f7.png
十二、DML语句 插入/增加数据(数据操作语言) 9198e879f4244624beab006b93ab3cf8.png
insert into employee(id, workNum, name, gender, age, idCard, entryDate) values (1,'1','李四','男',10,123456789012345678,'2001-12-8');ac727657217a45c286f69edab87fa94e.png
827431a991294fdbbf5ad4518e9d9090.png
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
update employee set name = '李大大',gender = '女' where id = 1;cedb48d94bfc4657aed0a1cc7b919901.png
13.2删除 fa49c47fb842484cb4a91e81492218a4.png
7557300662664a3b9e0108a7b8fc46ee.png
十四、DML语句小结 4276fb8a7b7d4631b7c95adb465b009a.png
十五、DQL语句 基础查询(数据库查询语言) 606a8ebe59f24bd9b4f37d00cb005a07.png
548e3b63f58349fdb865c5dc56c315e4.png
查询指定字段,和查询所有字段
fee942d8ee174a05be30c9d16ae68f9d.png
as(起别名)
。as可以省略
bc1942d75f43492480bdd4e52f56f12f.png
distinct(去重)
关键字用来去除重复的。
400d7501b7ca452ca937cc471bb4b10a.png
十六、DQL语句 条件查询 ce1af981d6794c998ec5041bd27501a9.png
in 列表中的值,只要能满足其一就可以。
2fb9123ad1aa477e98032726a9c5308d.png
08bcedfb4a724218a8c78c1498c5f755.png
d0c0241a04034ab9b2b630834b2f7a19.png
793731870f5d40979f1901deff9ac9f0.png
2492dccaee9f41f3b076a666267badd0.png
0ad6f0abe1054f01a9323b9afd39bdff.png
十七、 DQL语句 聚合函数 6b5cf5c4e8ac4947b02a415afe16d788.png
注意:所有的 null的运算 值不参与所有聚合函数
7430989b126e4fc886845e435ac36d16.png
查到这张表的总数据量。
也可以用id来查。此时就统计id字段的总数量。
9900522d9d474fcdadbb1313ba2e3532.png
总共是16条数据。由于有一位员工 idcard 为null。因此不被统计,就是15条。
161a154860b040efba3853c25d82fb21.png
先试试查询在西安的员工。
2793173577c14da181e7b9c8d7a896fd.png
查询西安地区员工年龄之和。返回135
7dd334e18b0b43d5b147cc51c3379fd9.png
十八、分组查询 9d4ecba4b38646b297f01b1a45b288aa.png
注意看注意:
1.分组之后,查询的字段一般为聚合函数和分组字段。查询其他字段无任何意义。
a4d73bf3043a416ea83b45b0d039ec07.png
83c49372752643228e89bf9b70e2f501.png
对于第三个,先查年龄小于45的员工,并根据工作地址进行分组。并且统计员工数量 。
40d8a73832ba40959b1f118104b46aad.png
再从这个统计数量,筛选出员工 数量 ≥ 3的工作地址
最终结果,我们还给count(*)起了个别名叫做address_count
22c0085b307e48489c3cc81a7bfe1b63.png
十九、排序查询 2909600940104d39bbf64df2fe06e168.png
asc是可以省略的,因为升序是默认值
51497b3998b64c20953a49b4ad2bd87f.png
如果年龄相同,再按照入职时间升序或者降序排序
9aaffea287e943d7b04a8c8d0da690f8.png
二十、分页查询 6f6ebce78b1c40b7a9e37fd807a153ac.png
8938355396814352892b087438e2e830.png
二十一、DQL案例练习 b01f0e6d3ad9493186d7f07c0ee0885e.png
12a4c159192f498eb64380fc6293be0e.png
9ea90e3a8f4440f699464fbd6aae6a3d.png
注:limilt在最后。order by 在limit之前
二十二、DQL-执行顺序 f3afd72a1024436293e10ac20820c97a.png
1.先执行from。因此给emp起别名。where条件语句,和select查询语句
order by 排序语句 就可以使用表的别名。
2.order by 排序语句 和 limit分页语句 是在select 之后执行。因此给字段起别名。也能被这两个语句用到。
55a75dbe79f847949fdee3c51d0d1303.png
二十三、DQL语句 小结 cde372fbab764463b01d1614ed422b02.png
二十四、DCL 用户管理(数据控制语言) 6b75bbf1454a45ae90506fdb3478299f.png
85b390e568f14c8f83d61a1b50156a6e.png
38ad337b2b434c809689db1871ebcfd6.png
找到 mysql 数据库。找到里面的 user 表,我们就能知道当前电脑数据库用户了
host 指的是主机。
通过用户名 和 主机地址才能完整的定位一个 mysql 用户。
主机地址 代表当前用户只能在哪一个主机上访问当前msql 服务器。
localhost 代表只能在本机访问,不能远程访问。
% 代表可以远程访问。
1.查询MySQL用户 查询mysql中的用户的用户名
cef5409c1a9840d4bdfca43e136d201e.png
查询mysql中的用户的主机名(主机地址)
538f761d8c9b4377af68ef23e3f460f2.png
也可以直接找到mysql数据库,里面有一个user表。点开看看
如图这是我给150.158..主机上面的mysql创建的用户。
ae7b001b627f43ca8122558065b45c91.png
2.创建用户 (新创的用户只能访问information_schema这一个数据库) 要想查询到所有数据库,需要这个用户授权
创建用户,只能在本机访问
create user '用户名'@'localhost' identified by '123456';并设置密码为123456
935a4a86d6104812b6600101d4b2ca15.png
创建用户,能在任意主机访问该数据库。(远程访问)
create user 'root'@'%' identified by '123456';并设置密码为123456
8344581200604af9bb4a5634a4beb184.png
c83ec5ec536a464da2ff8f8031f25aea.png
14fbb8f1183f471aae38ee3b781b36f7.png
3.修改用户密码 修改用户 root 的密码 为 123456
alter user 'root'@'localhost' identified with mysql_native_password by '123456';4.删除用户 删除 hehuanshu @localhost用户
drop user 'hehuanshu'@'localhost';5.注:在创建密码/修改密码不成功 这是由于mysql当中提供了 密码策略 相关功能。在某些等级下,如果密码设置过于简单,就会出现创建/修改密码不成功的问题。
解决办法:
1.设置更为复杂的密码,比如拥有大小写字母、数字、特殊符号的密码,并且密码长度大于8位。这样就可以满足
2.修改密码策略等级
密码策略等级
validate_password_policy有三个等级:
LOW(低) :主要看密码长度(由validate_password_length决定),对复杂性没强制要求,适用于测试或开发环境。MEDIUM(中) :要求密码长度达标,且至少包含数字、小写字母和大写字母中的两种,适用于一般生产环境。STRONG(强) :要求密码长度达标,且必须包含数字、小写字母、大写字母和特殊字符,用于高安全级别的系统。
查询密码策略等级
SHOW VARIABLES LIKE 'validate_password%';bd20118fb4514c84bd1dcb25e865e9b0.png
上面是我的数据库密码策略等级。我的等级是低级。并且长度最少是6位。
validate_password_policy=LOW
validate_password_length=6修改密码长度/密码策略等级 SET GLOBAL validate_password_policy = LOW;
SET GLOBAL validate_password_length = 6; 注:等级LOW、MEDIUM、STRONG 设置的时候,必须填大写字母。
二十五、DCL权限控制语句 a585ef9a744a49958713e67430121700.png
2d4de45d2ec04a4e8abbbb601c1ae982.png
1.查询权限 show grants for 'heima'@'%';我们看到了这个用户的权限是 usage 。没有其他权限仅仅能够连接并登录上mysql而已
c004c9faa79548709e1dbe2d4bb9be40.png
6c1481d02e8e4f9e8a9268fbf37cd84f.png
2.授予权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';这个语句是授予所有权限给 'root'@'%' 这个用户。
grant all on spring_blog.* to 'root'@'%';这个语句是授予 'root'@'%' 这个用户 操作 spring_blog这个数据库 所有权限。
2c3a20b2cf3c46e69f3538500666a570.png
再次查看'heima'@'%'这个用户的权限
e5ce67e00315400584fa00d56f4b1c8d.png
发现它多了一个权限,就是操作 itcast 这个数据库的所有权限
3.撤销权限
假如撤销 'heima'@'%'这个用户 对数据库 itcast 的所有权限。
revoke all on itcast.* from 'heima'@'%';9ddf17c6425143d3a3acf7191c16a8ac.png
再次查询这个用户的权限,发现它已经没有对 itcast 这个数据库的操作权限了。
9b0d6b2b34264aafb4f963c094451bb9.png
二十六、DCL语句小结 e8d16552db0148dbb39256cbc3677268.png
二十七、基础(函数) 字符串函数 e5038a31ee83431a8e4bc96ba6117c7e.png
a2e0e5cc32a04813a0333cdccf5127ea.png
0f76c670ea9a478b937668a3e41e1e9e.png
这里讲解几个相对比较常用的字符串函数。
字符串函数
464ef5be2f7e4b9580c87db9560af7c1.png
concat 字符串拼接
2f7cd3f65f504756bb529ea2597becb7.png
lower 全部字符转小写
7742f08d156a4d99b22a5616675caf1e.png
upper 全部字符转大写
3cc29e95976e430786c9041e18facfe2.png
lpad 左填充
2cba1642ecc94831861a637528b88f09.png
rpad 右填充
dee970f97d9d422c92c58d4622024214.png
trim 去除空格。前面和后面的空格就已经不在了
6323e76629df449a9f4aae9064945c34.png
substring 字符串截取
00c596da4c4747a48ae32b37584bf098.png
案例: e06f0c7e41ea4c508e029e0587739fa6.png
5eec678530344309949fc82dffce4990.png
二十八、数值函数 05a58cf105d1463d863ccb40ed75d8ee.png
10ad7dc859b64a54b4d7711f9264798c.png
答案:
2
1
3
select rand(); 0~1之间的随机数
774e6360c0264680ae2d19ca96e2fb20.png
round 保留小数位数。四舍五入
49e89bc1840e435ba6111f409a51292c.png
案例: 0b5d983483084348ad5dc21624f65257.png
二十九、日期函数 27d95da42b204635808be9f7934584e3.png
当前日期 年月日
9ca702059f81470bb136b74c81a71bc6.png
4244e7f8cf034c1db75c08422bfdbeda.png
当前时间 时分秒
5a03e9a1e936449c89b6d3acfe68def2.png
771ee94f920346e7bfc862d8cfc6b020.png
当前时间 : 年月日+时分秒
80928f33d97d4105afec333b6fe9970a.png
c043d689497c4889b0ee586a714cdd8e.png
year month day 获取 日期中的年/月/日。
410d229584c44e33883d5f7dc9732866.png
date_add把时间往后退..
year month day 代表时间单位
7b90fa2257f24f9ab83d9ad880638d15.png
datediff 相差几天
第一个时间 减去 第二个时间
3da63ac0b7694508bdfbb44daab03720.png
案例: 99ea3e342d5f43a0848cda934585da7f.png
三十、流程控制函数 4553db018c5c47289174c9d910e7dd47.png
e916bdf432c94a8692ae55e83124b4f0.png
如上图。
if 语句 如value 为 true 返回 ok 为 false 返回 default
ifnull 如果 value1为 null 返回 value2。 不为null 返回 value1
9f5d39e38b2a4e36bf34fb245a9a1694.png
ea949a38e2f147f48defd618c4dceeb1.png
案例: 3480551c8f8a4dc3add5452ab8965526.png
1936dec341c24a01861e011185ff26ca.png
三十一、函数-小结 0a7797c9c0af4c57bc5a3d9eaa890b89.png
5a71619c7a104448ad0c4913b3610e52.png
三十二、约束 概述(约束) c2bbbdcacba044a3a36649b18dbfb3d4.png
28ea49efa7fb4214b7db54f5a6ac6cfd.png
三十三、约束演示 9df0b4c9004e4c549a98dbd0af64a67b.png
fee182bcd1bd44aba5ef40da90ca7f20.png
黄色小钥匙代表 Id 是主键
2d507eed4d404e3090b2ba2077d82d64.png
user 表 中 已经 有 Tom3 了 重复了。我们设置name是唯一的属性
4dfa879a784142abb82f7feaa6c55c20.png
即便刚才报错 ,插入失败, 但是已经向数据库申请到了主键4了。因此后面再插入主键就是5
be9cc92530e54e58bf0f4d265e1f22c5.png
通过图形化界面创建表
43cd2931751d44f4a540cd05d6ce9cef.png
三十四、约束-外键约束 55f0d352d4304c9797a22d3e1121b98c.png
这两张表只是逻辑上存在关联。并没有物理上关联。如果一号部门删了。但是员工表还关联了这么多1号部门的员工。这就无法保证数据的一致性和完整性。
因此在创建表的时候,我们需要去进行外检约束。语法如下:
2cb4ef344b7a44a98fb52e5cf762b1ac.png
90f2f1eebcac44e29ca3e9aac779160a.png
37ec5f6b533141c4a09c7d9df25ae535.png
c6ea34fb9589494e9c209305a1a0a532.png
43bc17fc56654483bd87019e07d7a641.png
执行外检约束 SQL 之后 ,钥匙变蓝色。就说明已经是外键了。
此时就可以保证数据的 完整性和 一致性。
2be6416f5bea49d1821d4a6bdec6dcfa.png
此时再删除研发部。会发现报错了。告诉我们不能删除或更新一个父表的记录。
因为存在这个外键关联
6addac2652df41f39a3795d4baeb0c1a.png
2914dc0731e94066b3e0639388f84b8e.png
删除外键
06e418f6f70d4c5fb25bb0470a4c0575.png
三十五、约束-外键删除 更新行为 b1a7da8f4ca948038a7471c38084edea.png
NO ACTION(no action)无行为 这是外键约束的默认行为
RESTRICT (restrickt ) 限制
CASCADE (cascade) 级联,串联
SET NULL (set null) 设置为null
SET DEFAULT (set default)
我们如何在创建外键的时候,来指定他们删除或更新的规则呢?
如上图。我们设置 在 删除 和 更新 都设置了 cascade。
597040327fde43bdbe6d0c3f9e96e61c.png
图形化界面
b79e1056dc8645b39b012bbd3144edbc.png
三十六、约束-小结 e5ed0803e8fe4181b426252335030d7f.png
三十七、多表查询-多表关系介绍(多表查询) 161a46208fa347cbbfccf8ccdd245be4.png
78ee64d4a9e74a028fe23b3fe63e8978.png
88aaa0e51d60457c99db8e729e2e37b5.png
多对对关系。
707420e7eef54674a21dfeb0df097716.png
6998b3ba21f2405ba2c44ab673cd54f6.png
2e072a5ae2fa4d52bb462306d7ffa506.png
f39d61b6ed5642049da951b9c4256f75.png
以可视化界面形式展示多表之间的关系
75c402e7877c4a9e8ba1db54d290c8fd.png
fcf54bea9b3747328f02afba5e0d4ff3.png
一对一关系
d54cb5f9477847fe8ec994904c8677e9.png
b28935306a564aa8a9fdcf4639d39e69.png
b3b2fe297d064c31b77d62d3df87627e.png
d012b05905c547d3837e448d0f24be48.png
cb6543c2d9d3401fb9db441327a40705.png
c4c4cebeda9542058d90f43e4533cc20.png
三十八、多表查询-概述 a631658fcb014fb0b3be18fa14f3bad8.png
37d94045a6df4d31b4795f5897358fd3.png
f0138a70d0d9445cb11537d3eb6c3e00.png
66eca0a376ea4f2880ebb25d737bbf0e.png
笛卡尔积
消除无效 笛卡尔积 令dept_id = dept.id
如下第二张图。
数据从102条 变成了 16条。
那么明明一共有17个员工。最后一个员工去哪里了?
因为最后一个员工是新入职的。还没有分配部门。因此不满足我们的查询条件。
b3897af841dd485c86bb82b1eae37f13.png
653435baf1f842c5a45ce56736857470.png
三十九、-内连接 50040eba577f4acfa310dc5dc347b43a.png
1.隐式内连接。
一共17个员工,只得到16条数据。因为通过内连接。查询到的是两张表交集的部分。
因此由于有一个员工没有部门。部门id 为null。因此不会查询到他的数据。
当 表名比较长的时候。不方便看,我们也可以给表起一个别名。
99d83b94871b4c6aa074686bfa3182c0.png
2.显示内连接
94aa90d4511c4ebf942c947ff19e6c63.png
四十、-外连接 b0969a01aaba49b5b1b3822fa683fce3.png
352994c10d8c4410a14d13cc49981fe6.png
左外连接(常用)右外连接可以写成左外连接的形式。
98915822057844db87bd215351e3b22d.png
64517e47554a4d829e4a4595065cab69.png
如上图。因为左连接查询到的是 员工表所有的信息 + 员工表和部门表交集的信息
即使没有部门的 id 。也能查到这个员工的信息。返回17条数据。
右外连接不常用,也因为右外连接其实可以用左外连接的形式写出来。
只需要 在SQL 中 把两张表 的位置互换就行了。
查询的数据是一样的。
7f3d350a99fd4ff6aa63e38e3d213ad3.png
四十一、-自连接
自连接查询语法:
select 字段列表 from 表A 别名A join 表A 别名B on 条件...;自连接查询,可以是内连接查询,也可以是外连接查询。
一张表自己连接自己。
a6a917ca3d5c4183946fa00b8e2d476c.png
62137b9ab2034eb5a22e9a0f161c4f79.png
1.查询员工 及其 所属领导的名字
我们发现员工表中并没有所属领导的名字。不过有所属领导id,也就是managerid。
此时就可以进行自连接查询了
a8d474b1ad884803b64d8f19b7b47e8b.png
查询效果如下
48ee2b4daee74478bdf0572d5ccc19cb.png
6a3dcd5e485b41b18fe5615af9503026.png
2.由于没有领导也要查询出来。因此我们要进行外连接查询。采用左连接的方式,如下。
73e6ee341e6446bc96f8b1549b69cc67.png
四十二、-联合查询union(重点) 8febeaca26554555a996ee6b86f9c962.png
b701690b20924e1ebe96f578f9706966.png
38851a3b2b2b4447b74b06a882075239.png
734d1f07258243419d5af3bc47f9160a.png
5c1034165cd843ec8398b278c77a91b3.png
合并起来 答案如下:
有一个员工是重复的。如果想合并后再去重 可以把 all 这个关键字去掉
d89393f961ac49e18ddb500c67089d91.png
26f47bfa3b1841f19e7c44a2d2fbdae3.png
四十三、-子查询介绍 3f69ab3b77ae476eb0438b8538a3650f.png
四十四、-标量子查询 59e8a714ea264f0b8bda48ccd9009055.png
由于嵌套内部结果是单个值。因此我们叫做 标量子查询。
有两张表,第一张表是员工表。第二张表是部门表。
查询“销售部”的所有员工信息。
aac97a7004c54450b5bce999d03f2e1b.png
从好理解的角度。我们把这个问题拆分为两个部分。
1. 查询销售部门Id
2.根据这个id查询员工信息
18d74c5ce5044c2cb50d3390841100b3.png
这两个语句可以合为一个SQL语句。采用嵌套的方式。
f7640bbc08b1408882e866fe6f2f732e.png
查询“方东白” 入职之后的员工信息
32f44d394e014da7a700c97bd7d1f9c2.png
四十五、-列子查询 a75a5c5974584184b8c8b905b3891fa3.png
案例:
f69c7719b01c4cd09fd4e8b46b04d30f.png
1.
8ec7d7da5540455aa8bdbed7dbb908f1.png
6cc768a946624585afe66a774f31ee9d.png
2.查询比 财务部 所有人工资都高的员工信息。
07f7e52283bf44fdb08bad66a3d8047e.png
c2df4f7c78424156bdb932add075430f.png
57ef6a2f13794179b1cb0e4cbc3c839b.png
下面是这个问题的 答案。嵌套了两层。
all的用法
子查询返回的结果都需要满足 用all。就是比财务部最高的工资的人的工资还要高
4e9dceb5833a46d09b7ce9b0d433af37.png
3.
any的用法(some效果一样)
满足子查询返回的任意一个返回结果就行了
c5de823daa904390a3c4b49ae2f7557a.png
191c4fe9f0354fd2a655a91c5580d8dc.png
baf4383e90974f9da2276a71d7697328.png
四十六-行子查询 636a9433394e4d949996ce7ffa6e7ad5.png
查询与“张无忌”的薪资及直属领导相同的员工信息。
拆分:
8ce68f5405cb459bbc39bc670a37793c.png
其实b. 还有一种写法,如下。
9c4eab9a65304224a53a57d16a89ed13.png
合并:
答案如下。
c5f973f7410b499ea29e161d9b9fa478.png
四十七、-表子查询 c4deb87c57c24b9f8a2774bda704d5df.png
d3174affb1004f8d93e21f93332892cd.png
6b77aafcdc06490b92c2cb508bffee1e.png
2.查询入职时间是‘2006-01-01’ 之后的员工信息。及其部门。
我们需要把a.查出来的信息。作为一个表。再去左连接查询。因为没有部门的员工也要被查询出来。因此用左连接。
ab319a16e3a143e6bf12fcf30ee27caa.png
09f72f35e59e4f269bb3dc0078f26617.png
四十八、多表查询-练习一 d6dadc42110c4a2ba3dc9c8348c2076f.png
1.查询员工的姓名、年龄、职位、部门信息(交集隐式 内连接)
表:emp , dept
内连接
连接条件:emp.dept_id = dept.id
select e.name,e.age,e.job,d.name from emp e,dept d where e.dept_id = d.id;12308622aca54a11b29268c2d58006af.png
2.查询年龄小于30岁的员工的姓名、年龄、职位、部门信息
表:emp、dept
内连接
连接条件:emp.dept_id = dept.id;
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
3.查询拥有 员工 的部门 id 部门名称
表:dept
内连接
连接条件:emp.dept_id = dept.id;
5dbcdd4dd4d045a2aa5e6bf75e21f9f2.png
4.查询所有年龄大于40岁的员工,及其归属的部门,如果员工没有分配部门,也要展示出来
表: emp、dept
外连接
连接条件:emp.dept_id = dept.id;
47894d828d9148aa948717d51b9f2e34.png
5.查询所有员工的工资等级。
表:emp、salgrade
连接条件:emp.salary >= salgrade.losal and emp.salary <= salgrade.hisal;
092528a31b2e4668b1556d6ee22017c8.png
6.查询“研发部” 所有员工的信息及工资等级
表:emp salgrade dept
69ce1bb48b2e44228af144bccd381147.png
格式化SQL语句 951aa17b4bb941abb9d149a085be0264.png
7.查询“研发部”所有员工的平均工资
326778b3dad94427b183e151f9da8b68.png
8. 查询工资比“灭绝”高的员工信息
cbad11ce950f431080d237da31aac98e.png
9.查询比平均工资高的员工信息
f9128d6fea5f4d8a9ad81b6686c94270.png
10、查询低于本部门平均工资的员工信息
这个问题比较难,先拆分一下 --
a.查询指定部门的平均薪资
select avg(e1.salary) from emp e1 where e1.dept_id = 1;我们将a作为一个子查询条件
select *
from emp e2
where e2.salary < (select avg(e1.salary) from emp e1 where e1.dept_id = e2.dept_id);37d5082b06a84f4d9a55a85096615ab7.png
验证 :我们将子查询作为一个字段 并起别名‘当前部门平均薪资’
ccd4f26415744bf9b63ea87799479765.png
11.查询所有的部门信息,并统计部门的员工人数
拆分一下
a.查询所有部门的信息 :
b.查询某个部门的人数
select count(*) from emp e where e.dept_id = 1;合起来就是
select *,(select count(*) from emp e where e.dept_id = d.id) '部门员工人数'
from dept d;5269d19b8a364964b40ecae1a0d72823.png
12.查询所有学生的选课情况,展示出学生名称,学号,课程名称
表: student , course, student_course
连接条件:
student.id = student_course.studentid,
coursstudent_coursee.id = .courseid,
2beb42e1356b4f5cb762c6766f67c3f0.png
d458d4fe33da49c9848e93d0988a9fb3.png
四十九、多表查询-练习二 五十、多表查询-小结 5b30ffc2ef6e461fa4d56b141e3cba45.png
五十一、事务-简介 88e360aa6900426c9006b1a8c2b6c701.png
b968ff77b55341beb28db7bb93fd82e6.png
假如张三给李四转账一千元。正常来讲,
张三账户减少一千
李四账户增加一千。
若张三减少后,抛出异常,李四的没有增加。那么就会出现大问题。
因此我们引出了事务。
若抛出异常,则会进行回滚。从而来保证数据的完整性和一致性。
对于mysql数据库,事务是默认自动提交。 因此我们若想把若干操作放在事务内,需要手动开启事务。
5f67162a64b141f8a28cc0124eb44d9d.png
五十二、事务的操作
正常情况下
最初账户
261d75e9d4cc4f65ae254c7fdc7d2623.png
89847d4641d54f56bb523c5a5aadff24.png
9ca2e5f849ff4b37883feb6b5c76fcd7.png
异常情况下 ,张三账户减少一千。李四的没有增加一千。
因此我们需要把转账操作控制在一个事务范围内。
现在也有事务,对于当前来说,每一条SQL语句都是一个事务。
6d314171c6644a1fb8a108c4c9dddd86.png
80655dd8d4f94a159ba0d562effd0801.png
事务操作(方式一:修改事务提交方式) 修改 @@autocommit 的值
1:自动提交
0:手动提交
ececf5598db0482bb7e1979231e4ec4e.png
select @@autocommit
若是 @@autocommit 为 1。代表事务是自动提交的。
我们修改为0,那么就会变成手动提交。
正常情况下
e699815373994bf98c65c2825162280d.png
设置为手动提交,此时执行SQL语句之后,只是临时修改了表中的数据,并没有提交到数据库。因此发现数据库表中的值没有改变。因为我们还没有执行提交事务的操作。
要把这个临时的操作提交到数据库,需要执行 commit 指令
b3f9c5c52b37470aac3172ae80aacc14.png
再次打开数据库表。刷新一下就发现数值改变了。事务执行完成
异常情况下
bd430e3e968d4de2861a97f4599bb4e5.png
da0bce8d3224420d8441a07181d94c9b.png
再次执行这个转账操作。执行完毕之后。会发现报了异常。
此时我们就不能再执行提交事务。
而是执行回滚事务。
fb165e29f913489bbaccb83e4d0360d4.png
再次打开数据库表,会发现,数据库没有变化。张三的前没有少一千。李四自然也没多一千
这样事务就控制了
如果执行事务操作正常,我们会执行commit; 事务提交操作
如果执行事务操作出现异常,我们会执行 rollback; 事务回滚操作
事务操作(方式二:开启事务)
ab9681b7b5d64476ab8ea5f81a0883f2.png
我们首先把事务提交方式改为自动提交也就是@@autocommit 为 1。 不需要改为0。
但我们需要执行
或
然后再执行一下这个异常转账操作
抛出了异常,报错了。此时表中的数据不会发生变化。
一单有异常,我们要做的是 执行回滚事务rollback。 而不是commit提交。
只要没提交,数据库的数据就不会发生变化。
7174dea476f34e6b8e4bfd0ed7c50cc9.png
五十三、事务的四大特性 ACID
原子性: 事务是不可分割的最小操作单元,要么全部执行成功,要么全部失败。
一致性: 事务完成时,所有数据都必须保持一致状态。多多少少加起来必须恒定
隔离性: 依赖数据库提供的隔离机制。保证事务不受外部并发操作的影响。
持久性: 事务一旦提交或回滚,对数据库的改变都是永久的(存储在磁盘(文件中))
27d051d692ea431dbfd9a71fe96b508e.png
4db37c813cc14684b15f63639db42249.png
4d8537fb9da24f7d858d534befed12ab.png
五十四、 并发事务问题 脏读: B事务读取到了A事务还没有提交的数据
1a2454ff533140e4a6adfb969ca5469d.png
A事务 查询了 id = 1 的数据。
B事务同时修改了 id = 1 的数据
A事务又一次查询了 id = 1 的数据
两次读取到的数据不同。称之为不可重复读。
4ff40bcbc68c48b79badea15ba40eae9.png
A事务在查询的时候没有 Id = 1 的数据。然后准备插入这个数据
但是B事务同时插入了id = 1 的数据。
因为 id 是自增主键。是唯一的。
导致A事务。插入不成功。
这就是幻读。对于A事务来说,查询时没有对应数据,但是插入时又发现这个数据已经存在
112e1db69cdd454482ba3398791b1301.png
五十五、事务的隔离级别 从上到下隔离级别越高。不过性能也会越差。
默认级别是mysql的。
oracle默认级别是 read committed
Read uncommitted (读未提交 的隔离级别)
Read committed (读已提交 的隔离级别)
Repeatable Read(默认) (可重复读 的隔离级别)
Serializable (串行化 隔离级别) 串行化指的是在进行并发事务操作。只允许一次一个事务来操作。只有等A事务提交完成之后。B事务才能操作。
我们一般使用默认的事务隔离级别,不去修改。
5fbeb27c2ad44464abe1cbc2139d792a.png
查看事务隔离级别。
af7a36d0baa74cd0b01a7a859301fc31.png
设置事务隔离级别
672555a7e8b64f71b332caa471c5359e.png
脏读 演示:
将事务隔离级别修改为 read uncommitted
A事务读取到了B事务未提交的数据
7bf417f2cd314ab4a4e6f24a4ee8dc3f.png
不可重复读 演示:
将事务隔离级别修改为 Read Committed
同一个SQL查询。在一个事务中查询的结果不一样。就是不可重复读
3bf74423ef2f4383b23f621c440e831b.png
将事务隔离级别修改为 Repeatable Read
如下图。会发现解决了不可重复读问题。
变得可重复读了。最后当我们提交事务之后。
再次查询,此时就可以查到最新的数据了
88ff46d5f7994b54b3ac89c1e79541b0.png
幻读 演示 :
A事务本身没查到数据,准备添加的时候。发现数据又已经存在。再查,还是没有
3d7dc18870374c1bbf1b77d36d1bd45e.png
要想解决幻读问题,
此时就需要修改事务隔离级别为 Serializable
此时当我们事务 A 查询 where id = 4 之后。当事务B再想插入的时候就会发现插入不成功,被阻塞了。只有等事务 A 操作完了。事务 A添加完了,添加成功之后。提交之后。事务B此时不再阻塞。而是报错提示 数据已经存在了。
50654e94c0a34b86ab67e55c810d0917.png
五十六、事务-小结 f0e7c7888bbd4af99f7a25c7aa137136.png
五十七、基础篇总结 574612c5385740d2a7130e55cf389710.png
只有到运维篇你也掌握了。MySQL 才算真正毕业了!!!!!!!!!!!!