SQL中几种JOIN关系
SQL中的JOIN操作, 是用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
常使用的JOIN方式有4种:
- INNER JOIN: 内连接, 如果两个表中有至少一个匹配, 则返回行; 可以简写为 JOIN ;
- LEFT JOIN: 左连接, 即使右表中没有匹配到, 也会返回左表中的所有的行, 右表不存在的默认为NULL; 可以写为 LEFT OUTER JOIN ;
- RIGHT JOIN: 右连接, 即使左表中没有匹配到, 也会返回右表中的所有的行, 左表不存在的默认为NULL; 可以写为 RIGHT OUTER JOIN ;
- FULL JOIN: 全连接, 只要其中一个表存在, 就返回一行; 不存的默认为NULL; 可以写为 FULL OUTER JOIN ;
- CROSS JOIN: 笛卡尔积, 没有关联条件, 两个表每条数据互相组合型号曾新的一行数据,总共条数 m*n行(m:A表行数, n:B表行数) ;
举例展示:
1- 数据准备
WITH t_a AS (
SELECT * FROM (
VALUES (1001, '张三', 13)
, (1002, '王五', 15)
, (1004, '赵四', 12)
, (1006, '李二', 17)
) AS table_name(user_id, name, age)
)
, t_b AS (
SELECT * FROM (
VALUES (1001, '男')
, (1003, '男')
, (1004, '女')
, (1005, '未知')
) AS table_name(user_id, sex)
)
2- 分类实现
1. INNER JOIN: 内连接
SELECT
a.user_id, a.name, a.age, b.sex
FROM t_a a
INNER JOIN t_b b
ON a.user_id = b.user_id
;
user_id |
name |
age |
sex |
1001 |
张三 |
13 |
男 |
1004 |
赵四 |
12 |
女 |
2. LEFT JOIN: 左连接
SELECT
a.user_id, a.name, a.age, b.sex
FROM t_a a
LEFT JOIN t_b b
ON a.user_id = b.user_id
;
user_id |
name |
age |
sex |
1001 |
张三 |
13 |
男 |
1002 |
王五 |
15 |
\N |
1004 |
赵四 |
12 |
女 |
1006 |
李二 |
17 |
\N |
3. RIGHT JOIN: 右连接
SELECT
a.user_id, a.name, a.age, b.sex
FROM t_a a
RIGHT JOIN t_b b
ON a.user_id = b.user_id
;
user_id |
name |
age |
sex |
1001 |
张三 |
13 |
男 |
\N |
\N |
\N |
男 |
1004 |
赵四 |
12 |
女 |
\N |
\N |
\N |
未知 |
4. FULL JOIN: 全连接
SELECT
a.user_id, a.name, a.age, b.sex
FROM t_a a
RIGHT JOIN t_b b
ON a.user_id = b.user_id
;
user_id |
name |
age |
sex |
\N |
\N |
\N |
男 |
1004 |
赵四 |
12 |
女 |
1001 |
张三 |
13 |
男 |
\N |
\N |
\N |
未知 |
1006 |
李二 |
17 |
\N |
1002 |
王五 |
15 |
\N |
5. CROSS JOIN: 笛卡尔积
SELECT
a.user_id, a.name, a.age, b.sex
FROM t_a a
CROSS JOIN t_b b
;
user_id |
name |
age |
sex |
1001 |
张三 |
13 |
男 |
1002 |
王五 |
15 |
男 |
1004 |
赵四 |
12 |
男 |
1006 |
李二 |
17 |
男 |
1001 |
张三 |
13 |
男 |
1002 |
王五 |
15 |
男 |
1004 |
赵四 |
12 |
男 |
1006 |
李二 |
17 |
男 |
1001 |
张三 |
13 |
女 |
1002 |
王五 |
15 |
女 |
1004 |
赵四 |
12 |
女 |
1006 |
李二 |
17 |
女 |
1001 |
张三 |
13 |
未知 |
1002 |
王五 |
15 |
未知 |
1004 |
赵四 |
12 |
未知 |
1006 |
李二 |
17 |
未知 |
3- 其它类型, 加条件
1. 只在A中存在
SELECT
a.user_id, a.name, a.age, b.sex
FROM t_a a
LEFT JOIN t_b b
ON a.user_id = b.user_id
WHERE b.sex IS NULL
;
user_id |
name |
age |
sex |
1002 |
王五 |
15 |
\N |
1006 |
李二 |
17 |
\N |
2. 只在B中存在
SELECT
b.user_id, a.name, a.age, b.sex
FROM t_a a
RIGHT JOIN t_b b
ON a.user_id = b.user_id
WHERE a.name IS NULL
;
user_id |
name |
age |
sex |
1003 |
\N |
\N |
男 |
1005 |
\N |
\N |
未知 |
3. 去除共有的
SELECT
a.user_id, a.name, a.age, b.sex
FROM t_a a
FULL JOIN t_b b
ON a.user_id = b.user_id
WHERE a.name IS NULL OR b.sex IS NULL
;
user_id |
name |
age |
sex |
\N |
\N |
\N |
男 |
\N |
\N |
\N |
未知 |
1002 |
王五 |
15 |
\N |
1006 |
李二 |
17 |
\N |
end