1. 笛卡尔积(同一个表则为自连接)
两表关联,把左表的列和右表的列通过笛卡尔积的形式表达出来,就类似于排列组合,列出所有情况。
1 | SELECT * FROM a, b; |
1 | SELECT * FROM a join b; |
1 | SELECT * FROM a inner join b; |
效果相同。
2. 内连接
在笛卡尔积的基础上加上连接条件,即变为内连接,只留下两个表中交集的记录。
这里我使用了菜鸟教程提供的数据库文件——MySQL连接的使用数据库——菜鸟教程
以author信息作为连接标准(通过关键字ON连接)
1 | SELECT * FROM runoob_tbl AS a INNER JOIN tcount_tbl AS b ON a.runoob_author=b.runoob_author; |
可以看到查询结果为笛卡尔积的基础上留下两表的交集。
3. 左连接
查询左表的全部数据,右表无对应数据填为null。
1 | SELECT * FROM runoob_tbl AS a LEFT JOIN tcount_tbl AS b ON a.runoob_author=b.runoob_author; |
4. 右连接
查询右表的全部数据,左表无对应数据填为null。
1 | SELECT * FROM runoob_tbl AS a RIGHT JOIN tcount_tbl AS b ON a.runoob_author=b.runoob_author; |
5. 左表独有
筛选左表独有的数据。
使用WHERE进行条件筛选,选择右表中为null的数据即为左表独有的数据。
1 | SELECT * FROM runoob_tbl AS a LEFT JOIN tcount_tbl AS b ON a.runoob_author=b.runoob_author WHERE b.runoob_author is null; |
这里还涉及到了MySQL对null值的处理,使用is null或is not null来判断当列的值是否为null,不要使用等号=🤔
6. 右表独有
同理,筛选右表独有的数据。
1 | SELECT * FROM runoob_tbl AS a RIGHT JOIN tcount_tbl AS b ON a.runoob_author=b.runoob_author WHERE a.runoob_author is null; |
7. 全连接
两表关联,查询其中所有数据。
使用union操作符完成。
通过左连接和右连接获取左表和右表完整的数据,通过union连接,重复的部分union会自动去重。
1 | SELECT * FROM runoob_tbl AS a LEFT JOIN tcount_tbl AS b ON a.runoob_author=b.runoob_author |
UNION操作符用于连接两个以上的SELECT语句的结果组合到一个结果集合中。多个SELECT语句会删除重复的数据。UNION ALL则不会删除重复的数据。
8. 并集取交集
两表关联,取并集然后取交集。
可以通过查询左表独有和右表独有,使用UNION操作符连接起来。
1 | SELECT * FROM runoob_tbl AS a LEFT JOIN tcount_tbl AS b ON a.runoob_author=b.runoob_author WHERE b.runoob_author is null |
9. 自然连接
MySQL自己判断完成连接过程,不需要指定连接条件,MySQL会使用表内相同的字段作为连接条件。
9.1 自然内连接
1 | SELECT * FROM runoob_tbl AS a NATURAL JOIN tcount_tbl AS b; |
9.2 自然左连接
1 | SELECT * FROM runoob_tbl AS a NATURAL LEFT JOIN tcount_tbl AS b; |
9.2 自然右连接
1 | SELECT * FROM runoob_tbl AS a NATURAL RIGHT JOIN tcount_tbl AS b; |
注意:如果两个表没有相同字段,或者有多个相同字段,则自然连接返回为空。