先放一张文氏图
现有数据如下
mysql> select * from user;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
| 4 | zhaoliu |
+----+----------+
mysql> select * from user_info;
+----+------+
| id | age |
+----+------+
| 1 | 20 |
| 2 | 21 |
| 3 | 23 |
+----+------+
复制
1.首先谈一种笛卡尔积,即没有连接条件
mysql> select * from user, user_info;
+----+----------+----+------+
| id | name | id | age |
+----+----------+----+------+
| 1 | zhangsan | 1 | 20 |
| 2 | lisi | 1 | 20 |
| 4 | zhaoliu | 1 | 20 |
| 1 | zhangsan | 2 | 21 |
| 2 | lisi | 2 | 21 |
| 4 | zhaoliu | 2 | 21 |
| 1 | zhangsan | 3 | 23 |
| 2 | lisi | 3 | 23 |
| 4 | zhaoliu | 3 | 23 |
+----+----------+----+------+
# 可以看出两张表每一行都各自与另一张表的每一行组合
复制
2.内连接,即取交集,可以写inner join 或 直接写join。即默认的Join就是inner join
mysql> select * from user join user_info on user.id = user_info.id;
+----+----------+----+------+
| id | name | id | age |
+----+----------+----+------+
| 1 | zhangsan | 1 | 20 |
| 2 | lisi | 2 | 21 |
+----+----------+----+------+
复制
3.左外连接,这应该是关系型数据库用的最多的情况,即外键一对多,对左表数据进行扩充
mysql> select * from user left join user_info on user.id = user_info.id;
+----+----------+------+------+
| id | name | id | age |
+----+----------+------+------+
| 1 | zhangsan | 1 | 20 |
| 2 | lisi | 2 | 21 |
| 4 | zhaoliu | NULL | NULL |
+----+----------+------+------+
# 可以看出,当赵六没有年龄,就被置空了。
复制
4.左内连接,去掉交集的部分,在左外连接的情况下,不要右表的任何数据
select * from user left join user_info on user.id = user_info.id where user_info.id is null;
+----+---------+------+------+
| id | name | id | age |
+----+---------+------+------+
| 4 | zhaoliu | NULL | NULL |
+----+---------+------+------+
# 可以看出,我要的就是右表为空的数据
复制
5.右外连接,以右表为标准,即扩充右表
mysql> select * from user right join user_info on user.id = user_info.id;
+------+----------+----+------+
| id | name | id | age |
+------+----------+----+------+
| 1 | zhangsan | 1 | 20 |
| 2 | lisi | 2 | 21 |
| NULL | NULL | 3 | 23 |
+------+----------+----+------+
# 结合左外就很容易理解
复制
6.右内连接,同理就是不要左表的数据
mysql> select * from user right join user_info on user.id = user_info.id where user.id is null;
+------+------+----+------+
| id | name | id | age |
+------+------+----+------+
| NULL | NULL | 3 | 23 |
+------+------+----+------+
复制
7.全外连接,full outer join,即选择所有数据,但要注意交集的部分去重
select * from user left join user_info on user.id = user_info.id
-> union
-> select * from user right join user_info on user.id = user_info.id;
+------+----------+------+------+
| id | name | id | age |
+------+----------+------+------+
| 1 | zhangsan | 1 | 20 |
| 2 | lisi | 2 | 21 |
| 4 | zhaoliu | NULL | NULL |
| NULL | NULL | 3 | 23 |
+------+----------+------+------+
# 可以看出的是使用了union进行了去重
复制
8.全内连接(名字不准确...), 即只要差集的部分
select * from user left join user_info on user.id = user_info.id where user_info.id is null
-> union
-> select * from user right join user_info on user.id = user_info.id where user.id is null;
+------+---------+------+------+
| id | name | id | age |
+------+---------+------+------+
| 4 | zhaoliu | NULL | NULL |
| NULL | NULL | 3 | 23 |
+------+---------+------+------+
复制
文章转载自胡聊前端,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1322次阅读
2025-03-13 11:40:53
MySQL8.0统计信息总结
闫建(Rock Yan)
493次阅读
2025-03-17 16:04:03
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
465次阅读
2025-03-13 14:38:19
SQL优化 - explain查看SQL执行计划(一)
金同学
394次阅读
2025-03-13 16:04:22
MySQL突然崩溃?教你用gdb解剖core文件,快速锁定“元凶”!
szrsu
368次阅读
2025-03-13 00:29:43
MySQL生产实战优化(利用Index skip scan优化性能提升257倍)
chengang
328次阅读
2025-03-17 10:36:40
MySQL数据库当前和历史事务分析
听见风的声音
294次阅读
2025-04-01 08:47:17
一键装库脚本3分钟极速部署,传统耗时砍掉95%!
IT邦德
239次阅读
2025-03-10 07:58:44
MySQL 生产实践-Update 二级索引导致的性能问题排查
chengang
233次阅读
2025-03-28 16:28:31
MySQL8.0直方图功能简介
Rock Yan
232次阅读
2025-03-21 15:30:53