目录
语法
需求
示例
分析
代码
语法
SELECT columns
FROM table1 JOIN table2
ON table1.common_column = table2.common_column;
在数据库管理和编程中,JOIN
是一种用于结合来自两个或多个表的数据的 SQL 操作。通过使用 JOIN
,你可以根据两个表中的某些列之间的匹配关系,获取这些表的组合结果集。JOIN
操作在关系型数据库管理系统(RDBMS)中非常常见
左链接
SELECT columns
FROM table1 LEFT JOIN table2
ON table1.common_column = table2.common_column;
- 返回左表中的所有行,以及右表中满足连接条件的匹配行。
- 如果右表中没有匹配的行,则结果集中的右表部分将包含
NULL
值。
右链接
SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.common_column = table2.common_column;
- 返回右表中的所有行,以及左表中满足连接条件的匹配行。
- 如果左表中没有匹配的行,则结果集中的左表部分将包含
NULL
值。
全链接
SELECT columns
FROM table1 FULL JOIN table2
ON table1.common_column = table2.common_column;
- 返回两个表中的所有行,当其中一张表中没有匹配时,结果集中的对应部分将包含
NULL
值。
交叉链接
SELECT columns
FROM table1 CROSS JOIN table2;
- 返回两个表的笛卡尔积,即返回两个表中所有行的组合。
- 如果没有
WHERE
子句来限制结果集,则结果集的大小将是两个表大小的乘积。
自链接
SELECT e1.columns, e2.columns
FROM employees e1 INNER JOIN employees e2
ON e1.manager_id = e2.employee_id;
- 是一种特殊的连接,其中一个表与自己进行连接。
- 常用于查找表中的相关记录,例如查找员工及其经理的信息。
需求
表: Employee
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | name | varchar | | department | varchar | | managerId | int | +-------------+---------+ id 是此表的主键(具有唯一值的列)。 该表的每一行表示雇员的名字、他们的部门和他们的经理的id。 如果managerId为空,则该员工没有经理。 没有员工会成为自己的管理者。
编写一个解决方案,找出至少有五个直接下属的经理。
以 任意顺序 返回结果表。
查询结果格式如下所示。
示例
输入: Employee 表: +-----+-------+------------+-----------+ | id | name | department | managerId | +-----+-------+------------+-----------+ | 101 | John | A | Null | | 102 | Dan | A | 101 | | 103 | James | A | 101 | | 104 | Amy | A | 101 | | 105 | Anne | A | 101 | | 106 | Ron | B | 101 | +-----+-------+------------+-----------+ 输出: +------+ | name | +------+ | John | +------+
分析
该表的每一行表示雇员的名字、他们的部门和他们的经理的id。没有员工会成为自己的管理者。
经理和下属均具有独立id,经理的managerId为null,下属的managerId为对应经理id
交叉连接 from Employee e1 join Employee e2
匹配 on e1.id = e2.managerId
找出至少有五个直接下属的经理
需要计数,按照经理的id分组 group by e1.id
仅需至少五个下属 having count(e2.managerId) >= 5
输出经理name
select e1.name name
代码
select e1.name name
from Employee e1 join Employee e2
on e1.id = e2.managerId
group by e1.id
having count(e2.managerId) >= 5