240429_SQL中的JOIN

连接查询
我最熟悉的多表联立 from 表1,表2,然后where里通过外键把表联立起来。这其实就是inner join.
但现在扩展的SQL可以在from里带上join直接做连接了
1 | select ... |
连接条件写在join下的on里,如果不带on条件的话,就和from多表where为空,简单的笛卡尔积一样
- inner join
1 | 隐式内连接: select 字段列表 from 表1, 表2 where 连接条件; |
不写inner直接写join默认是内连接,内连接查询出来是两表的交集


1 | select * |
郭靖和周芷若由于DepartmentID为空,所以不在检索结果里
- outer join
1 | select 字段列表 from 表1 left|right [outer] join 表2 on 连接条件; |
左外连接完全保留表1的数据,一般连接条件是对于表2做筛选。可以理解为筛选完的拼接到表1的记录上
1 | select * |

左外连接保留了郭靖,周芷若

右外连接保留了机械,电子
full join的话就全都保留了
小红书上看别人的面经帖子,手撕SQL: (一个学生表,一个成绩表,每个学生可能对应多个成绩,选出有一个科以上不及格的同学)
若题意只要有一门不及格的就搜出来:
1 | -- 只搜sid |
==尽量多用嵌套查询,避免from多表联立join的连接操作==
若题意是>=2门不及格的: 需要聚合函数count(),以及按sid来分组,涉及到group by, having.
分组查询
The HAVING
clause was added to SQL because the WHERE
keyword cannot be used with aggregate functions.
1 | SELECT column_name(s) |
where与having的区别:
- 执行时机不同:where是分组之前进行过滤,不满足where条件的不参与分组直接筛掉;而having是分组之后对结果进行过滤
- where里不能有聚合函数,having可以带聚合函数
1 | select StudentName, count(*) as 不及格科数 |
- Title: 240429_SQL中的JOIN
- Author: Haoliang Tang
- Created at : 2024-04-29 00:00:00
- Updated at : 2025-04-29 23:43:49
- Link: https://hl-tang.github.io/2024/04/29/240429_SQL中的JOIN/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments