-- INNER JOIN: 内连接SELECT
a.user_id, a.name, a.age, b.sex
FROM t_a a
INNERJOIN t_b b
ON a.user_id = b.user_id
;
user_id
name
age
sex
1001
张三
13
男
1004
赵四
12
女
2. LEFT JOIN: 左连接
-- LEFT JOIN: 左连接SELECT
a.user_id, a.name, a.age, b.sex
FROM t_a a
LEFTJOIN 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: 右连接
-- RIGHT JOIN: 右连接SELECT
a.user_id, a.name, a.age, b.sex
FROM t_a a
RIGHTJOIN 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: 全连接
-- RIGHT JOIN: 右连接SELECT
a.user_id, a.name, a.age, b.sex
FROM t_a a
RIGHTJOIN 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: 笛卡尔积
-- CROSS JOIN: 笛卡尔积SELECT/*+ mapjoin(b) */-- MC 运行环境要求, 没有使用 MapJoin 不能使用笛卡尔积, join 条件不能使用范围类型
a.user_id, a.name, a.age, b.sex
FROM t_a a
CROSSJOIN 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中存在
-- LEFT JOIN: 左连接 -> 只在A存在SELECT
a.user_id, a.name, a.age, b.sex
FROM t_a a
LEFTJOIN t_b b
ON a.user_id = b.user_id
WHERE b.sex ISNULL;
user_id
name
age
sex
1002
王五
15
\N
1006
李二
17
\N
2. 只在B中存在
-- RIGHT JOIN: 右连接 -> 只在B中存在SELECT
b.user_id, a.name, a.age, b.sex
FROM t_a a
RIGHTJOIN t_b b
ON a.user_id = b.user_id
WHERE a.name ISNULL;
user_id
name
age
sex
1003
\N
\N
男
1005
\N
\N
未知
3. 去除共有的
-- FULL JOIN: 全连接 -> 去除共有的SELECT
a.user_id, a.name, a.age, b.sex
FROM t_a a
FULLJOIN t_b b
ON a.user_id = b.user_id
WHERE a.name ISNULLOR b.sex ISNULL;