SQL中几种JOIN关系

SQL中几种JOIN关系

SQL中的JOIN操作, 是用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
常使用的JOIN方式有4种:

  1. INNER JOIN: 内连接, 如果两个表中有至少一个匹配, 则返回行; 可以简写为 JOIN ;
  2. LEFT JOIN: 左连接, 即使右表中没有匹配到, 也会返回左表中的所有的行, 右表不存在的默认为NULL; 可以写为 LEFT OUTER JOIN ;
  3. RIGHT JOIN: 右连接, 即使左表中没有匹配到, 也会返回右表中的所有的行, 左表不存在的默认为NULL; 可以写为 RIGHT OUTER JOIN ;
  4. FULL JOIN: 全连接, 只要其中一个表存在, 就返回一行; 不存的默认为NULL; 可以写为 FULL OUTER JOIN ;
  5. 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: 内连接

SQL中几种JOIN关系_第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: 左连接

SQL中几种JOIN关系_第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: 右连接

SQL中几种JOIN关系_第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: 全连接

SQL中几种JOIN关系_第4张图片

-- 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
\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 
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中存在

SQL中几种JOIN关系_第5张图片

-- LEFT JOIN:  左连接 -> 只在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中存在

SQL中几种JOIN关系_第6张图片

-- RIGHT JOIN:  右连接 -> 只在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. 去除共有的

SQL中几种JOIN关系_第7张图片

-- FULL JOIN:  全连接 ->    去除共有的
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

你可能感兴趣的:(SQL,大数据,sql,数据库,大数据)