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
2
3
SELECT * FROM runoob_tbl AS a LEFT JOIN tcount_tbl AS b ON a.runoob_author=b.runoob_author
UNION
SELECT * FROM runoob_tbl AS a RIGHT JOIN tcount_tbl AS b ON a.runoob_author=b.runoob_author;

UNION操作符用于连接两个以上的SELECT语句的结果组合到一个结果集合中。多个SELECT语句会删除重复的数据。UNION ALL则不会删除重复的数据。

8. 并集取交集

两表关联,取并集然后取交集。

可以通过查询左表独有和右表独有,使用UNION操作符连接起来。

1
2
3
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
union
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;

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;

注意:如果两个表没有相同字段,或者有多个相同字段,则自然连接返回为空。

10. 参考