五分钟搞懂 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. 参考文献
- Ben Forta《MySQL必知必会》P97-112.
- MySQL 七种join 理论_huang__2的博客-CSDN博客

浙公网安备 33010602011771号