
大数据分析入门之10分钟掌握JOIN连接语法
虽然JOIN类型有这么多种,但抓住了差异后,其实不难理解。欢迎提出你遇到的SQL问题,我会针对地出一些教程解答大家问题的~
·
前言
书接上回大数据分析入门10分钟快速了解SQL。
本篇将会进一步介绍JOIN
连接语法。
基本语法
SELECT column_name
FROM table1
[INNER|LEFT|RIGHT|FULL|CROSS] JOIN table2
ON table1.column_name=table2.column_name;
假设你有一张表students
表记录了id
,school_year
,name
,score
四个字段;
- 如果你想知道"2023学年"比"2022学年"分数提升的学生,那么SQL如下
SELECT l.name, l.score, l.score, r.score
FROM
(SELECT id,school_year,name,score
FROM students
WHERE school_year = '2023') l -- 2023学年的学生成绩作为子查询l
JOIN
(SELECT id,school_year,name,score
FROM students
WHERE school_year = '2022') r -- 2022学年的学生成绩作为子查询r
ON l.id = r.id -- 根据id连接两年的成绩
WHERE l.score > r.score -- 筛选2023年 > 2022年的结果
但事实上,2023年相比2022年可能有退学、有新转入的学生,那这部分的学生会出现在结果中吗?
需要引入JOIN
类型才能控制这部分结果
JOIN
默认是INNER JOIN
,只有左右查询都存在时,才会出现在结果。因此查询结果,不会有2023年退学或者新转入的学生。LEFT JOIN
有左侧查询的所有数据,因此2023新转入的学生会出现在结果(2022年缺失的score
为NULL
)RIGHT JOIN
有右侧查询的所有数据,因此2023退学的学生会出现在结果(2023年缺失的score
为NULL
)FULL JOIN
有两侧查询的所有数据,因此2023新转入、退学的学生都会出现在结果(缺失学年的成绩会补为NULL
)
注意调整
JOIN
类型时候,也要调整WHERE
条件l.score IS NULL or r.score IS NULL
;避免NULL
值被WHERE
过滤掉
进阶用法
一般在大数据场景,都需要指定连接条件进行JOIN
;
但不指定连接条件也能使用CROSS JOIN
,“笛卡尔积”将每一行都进行连接。
某些分析场景也能派上用场,例如
- 如果你想要知道2023年每个学生和平均分相差多少,那么SQL如下
SELECT l.name, l.score, l.score - r.avg_score -- 计算当前学生和平均成绩的差
FROM
(SELECT id,school_year,name,score
FROM students
WHERE school_year = '2023') l -- 2023学年的学生成绩作为子查询l
CROSS JOIN
(SELECT AVG(score) avg_score
FROM students
WHERE school_year = '2023') r -- 2023学年的平均成绩作为子查询r
总结
虽然JOIN类型有这么多种,但抓住了差异后,其实不难理解。
欢迎提出你遇到的SQL问题,我会针对地出一些教程解答大家问题的~
更多推荐
所有评论(0)