模块课程(1/4)
连接两个表:INNER JOIN
到目前为止,我们一次读取了一张表。然而,在现实世界中,数据
分布在多个相关表中:例如,在我们的数据集中,每个
员工有一个 department_id 指向 departments 表。去看
我们需要加入该部门的名称(而不仅仅是其 id)
两张桌子。执行此操作的运算符称为 JOIN。
基本语法
SELECT columns
FROM table_a
JOIN table_b ON table_a.x = table_b.y;用英语阅读:“采用 table_a,通过将每个配对将 table_b 附加到它
table_a.x 等于 table_b.y" 的行。结果是一个新的虚拟
表 以及两者的列。
-- For each employee, also show the name of their department:
SELECT employees.first_name,
employees.last_name,
departments.name AS dipartimento
FROM employees
JOIN departments ON employees.department_id = departments.id;ON 之后的部分称为 连接条件:它告诉
引擎*“这两行是同一件事,将它们排成一行”*。在
绝大多数情况下,主键和外键之间是相等的
键(此处为 departments.id 和 employees.department_id)。
内部连接,详细信息
完整的关键字是 INNER JOIN,但 JOIN 本身就是标准
同义词。 “内部”意味着只有两个都匹配的行
返回表:
- 如果员工有
department_id = NULL,他们不会出现 结果; - 如果一个部门没有员工,它不会出现在结果中。
限定列名称
当两个表具有相同名称的列时(此处都有 id,并且
如果您考虑一下,两者都有 name ),您需要指定哪个表
通过编写 table.column 来创建列。为了避免重复长名称,
经常使用别名(您在模块 2 中看到了它们):
SELECT e.first_name, e.last_name, d.name AS dipartimento
FROM employees AS e
JOIN departments AS d ON e.department_id = d.id;AS 在这里也是可选的: FROM employees e 的作用相同。
尝试一下
对于 Ingegneria 部门中的每位员工,显示名字 (first_name)、姓氏 (last_name) 和部门城市 (departments.city)。三列,每个员工一行。
显示提示
使用 e.department_id 和 d.id 之间的相等来完成 ON 条件,然后选择 d.city 作为第三列。
3 次尝试后可用的解决方案
复习练习
列出在米兰某个部门工作的所有员工的名字 (first_name) 和姓氏 (last_name)。根据 Departments.city 进行过滤,而不是根据部门名称进行过滤。
显示提示
与上一个练习相同的 JOIN,但根据 d.city = 'Milano' 而不是部门名称进行过滤。
3 次尝试后可用的解决方案