水下功夫做透,水上才能顺风顺水。

外联结(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

 

posted @ 2024-02-29 11:48  北方寒士  阅读(8)  评论(0编辑  收藏  举报