前言

书接上回大数据分析入门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年缺失的scoreNULL
  • RIGHT JOIN有右侧查询的所有数据,因此2023退学的学生会出现在结果(2023年缺失的scoreNULL
  • 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问题,我会针对地出一些教程解答大家问题的~

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐