外联结(OUTER JOIN)的主表
1.什么是联结——JOIN
简单来说,就是将其他表中的列添加到特定的表中,即进行“添加列”的运算,
本质是对主表字段的扩展,主表集合不变,一对多的情况下,主表列会增加。
联结图示该操作通常用于无法从一张表中获取期望数据(列)的情况。在实际工作中,期望得到的数据往往会分散
在不同的表之中(这也是关系型数据库的特点)。使用联结就可以从多张表中选取数据了。
2.什么是外联结(主表集合不变,行可能增加,列扩展)
外连接是左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)、全外连接(FULL OUTER JOIN)的统称。全外连接只是一种概念,在实际工作中用不到。
在外联结中,有一个很重要的概念——主表,在实际工作中,同样的多个表进行外联结,但选取的主表不同,结果往往是大相径庭的。顾名思义,使用 LEFT 时 FROM 子句中写在左侧的表是主表,使用 RIGHT时右侧的表是主表。
3. 内连接(集合和行都可能减少,列扩展)
INNER JOIN:内连接,也可以只写JOIN。只有进行连接的两个表中,都存在与连接标准相匹配的数据才会被保留下来,相当于两个表的交集。结果集可能少于
任何一张表记录,甚至为0 。
如果前后连接同一张表,也叫自连接。
方式一: SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e [INNER] JOIN departments d ON (e.department_id = d.department_id); 方式二: SELECT employee_id,department_name FROM employees e,departments d WHERE e.`department_id` = d.department_id;
它会把所有的符合where条件的字段查询出来。听起来十分合理,但是有这样一种这样的情况:就是两张表的数据有的不存在某种关系。(例如:员工表中有的员工他没有部门)
缺点:如果我们想要把不满足条件的数据也查询出来,内连接就做不到。
于是我们引入外连接。
这个题是大厂经常出的连续登录问题,其中一种解法就是用的自连接。
作业:编写一个 SQL 查询,查找所有至少连续出现三次的数字,表名为:Num,表结构如下:
作业解析:通过id+1的方式查找id下一次出现的数字,通过id+2的方式查找下下次出现的数字,只要下一次及下下次出现的数字和当前出现的数字相同,即为满足连续出现至少三次的数字。
SELECT DISTINCT a.num FROM Num a JOIN Num b ON a.id+1 = b.id JOIN Num c ON a.id+2 = c.id where a.num = b.num AND a.num = c.num