把几张表接在一起查
一种把表名并列写在 FROM 后面,一种用 JOIN 关键字。

分清楚两种写法
| 写法 | 连接条件写在 |
|---|---|
| 表名用逗号并列 | WHERE 子句里 |
| 用 JOIN 连 | ON 子句里 |
重 点
两张表都有同名字段时,字段前面必须加表名前缀,否则报字段有歧义。
一种把表名并列写在 FROM 后面,一种用 JOIN 关键字。

| 写法 | 连接条件写在 |
|---|---|
| 表名用逗号并列 | WHERE 子句里 |
| 用 JOIN 连 | ON 子句里 |
两张表都有同名字段时,字段前面必须加表名前缀,否则报字段有歧义。
内连接留公共部分,外连接保一边全员,交叉连接全配对。

FULL JOIN 是标准 SQL 里的写法,MySQL 不支持,敲了会报语法错。
最常用的一种,等值连接加上一个筛选条件。

内连接的结果里不会出现 NULL 补位,配不上的行直接被丢掉。
逗号写法和 INNER JOIN 写法生成的执行计划完全一样,选顺手的。
连接条件有几个,取决于表之间靠什么对上号。

连接 N 张表要写 N 减一个连接条件,少写一个就变成了交叉连接。
教师和课程之间隔着授课表,得先从教师连到授课,再从授课连到课程。
少写一个连接条件,结果会多出多少行?
先把表连起来,再按课程分组数人头。

分组字段里写了课程号还要再写课程名,因为它也出现在 SELECT 后面。
HAVING 里可以直接写 SELECT 起的别名,也可以把聚合函数再写一遍。
主表的行一个不少,从表配不上就补 NULL。

内连接看不见的那些落单的行,正是外连接要找出来的。
要查谁没有选过课,该用内连接还是外连接?
左边的教师表全员保留,右边配不上就是 NULL。

把两张表的位置对调,左连接就成了右连接。

左连接和右连接只是主表在哪一边的区别,能力上没有任何差异。
把表对调的同时把左改成右,主表还是学生表,结果就一样。
左边每一行都去配右边每一行,行数是两边相乘。

给同一张表取两个别名,就能拿它的两行互相比。

自连接的每个字段都必须带别名前缀,不然机器不知道你说的是哪一份。
一边锁定某个人,另一边找和他专业相同的。

结果里会带上被锁定的那个人自己,因为他和自己的专业当然相同。
要把王彤自己排除掉,条件里该再加一句什么?