五分钟搞懂 MySQL 七种 JOIN 联结

0. 表内容

表tab1内容

表tab2内容


  • SQL 联结给我的感觉就是用来替换 SQL 子查询的,因为子查询效率一般比较低,而且不容易理解。
  • LEFT OUTER JOIN 中的 OUTER(与 INNER 相对)关键词可省略。
  • 除自然联结外,其它联结返回的总的列数是两个表的列数之和。其实感觉自然联结好像也一样,实际上还是两表列数之和,只不过不将重复列显示出来罢了,不知道自己这样理解对不对。
  • 自联结就是自己跟自己玩,由于表名相同,所以为了进行区分和引用表中的列值,必须起不同的别名,别名 AS 关键字也可省略为空格,而且表名的别名也可以在定义别名前面的 select 语句中使用,如 SELECT a.xxx, b.yyy FROM table1 a, table2 b;

1. 等值联结(与内部联结等价):返回两表行的交集

# 等值联结(与内部联结等价):返回两表行的交集
SELECT
	* 
FROM
	tab1,
	tab2 
WHERE
	tab1.col1 = tab2.col3;

2. 内部联结(与等值连接等价):返回两表行的交集

# 内部联结(与等值连接等价):返回两表行的交集
SELECT
	* 
FROM
	tab1
	INNER JOIN tab2 ON tab1.col1 = tab2.col3;

3. 左联结:返回左表所有的行,如果右表中没有对应的行,则显示为NULL

# 左联结:返回左表所有的行,如果右表中没有对应的行,则显示为NULL
SELECT
	* 
FROM
	tab1
	LEFT JOIN tab2 ON tab1.col1 = tab2.col3;

4. 右联结:返回右表所有的行,如果左表中没有对应的行,则显示为NULL

# 右联结:返回右表所有的行,如果左表中没有对应的行,则显示为NULL
SELECT
	* 
FROM
	tab1
	RIGHT JOIN tab2 ON tab1.col1 = tab2.col3;

5. 去重左联结:仅返回左表独有的行

# 去重左联结:仅返回左表独有的行
SELECT
	* 
FROM
	tab1
	LEFT JOIN tab2 ON tab1.col1 = tab2.col3 
WHERE
	tab2.col3 IS NULL;

6. 去重右联结:仅返回右表独有的行

# 去重右联结:仅返回右表独有的行
SELECT
	* 
FROM
	tab1
	RIGHT JOIN tab2 ON tab1.col1 = tab2.col3 
WHERE
	tab1.col1 IS NULL;

7. 全联结:返回左表行与右表行的并集

# 全联结:返回左表行与右表行的并集
SELECT
	* 
FROM
	tab1
	LEFT JOIN tab2 ON tab1.col1 = tab2.col3 UNION
SELECT
	* 
FROM
	tab1
	RIGHT JOIN tab2 ON tab1.col1 = tab2.col3;

8. 去重全联结:返回左表行与右表行的对称差集

# 去重全联结:返回左表行与右表行的对称差集
SELECT
	* 
FROM
	tab1
	LEFT JOIN tab2 ON tab1.col1 = tab2.col3 
WHERE
	tab2.col3 IS NULL UNION
SELECT
	* 
FROM
	tab1
	RIGHT JOIN tab2 ON tab1.col1 = tab2.col3 
WHERE
	tab1.col1 IS NULL;


9. 参考文献

  1. Ben Forta《MySQL必知必会》P97-112.
  2. MySQL 七种join 理论_huang__2的博客-CSDN博客
posted @ 2023-05-21 22:57  悟晓山青  阅读(300)  评论(0)    收藏  举报