跳转到主要内容
模块 3 · 第 1 课(共 4)课程中的9/57~12 min
模块课程(1/4)

连接两个表:INNER JOIN

到目前为止,我们一次读取了一张表。然而,在现实世界中,数据 分布在多个相关表中:例如,在我们的数据集中,每个 员工有一个 department_id 指向 departments 表。去看 我们需要加入该部门的名称(而不仅仅是其 id) 两张桌子。执行此操作的运算符称为 JOIN。

基本语法

SQL
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" 的行。结果是一个新的虚拟 表 以及两者的列。

SQL
-- 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 中看到了它们):

SQL
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 的作用相同。

尝试一下

锻炼#sql.m3.l1.e1
尝试:0加载中...

对于 Ingegneria 部门中的每位员工,显示名字 (first_name)、姓氏 (last_name) 和部门城市 (departments.city)。三列,每个员工一行。

正在加载编辑器...
显示提示

使用 e.department_id 和 d.id 之间的相等来完成 ON 条件,然后选择 d.city 作为第三列。

3 次尝试后可用的解决方案

复习练习

锻炼#sql.m3.l1.e2
尝试:0加载中...

列出在米兰某个部门工作的所有员工的名字 (first_name) 和姓氏 (last_name)。根据 Departments.city 进行过滤,而不是根据部门名称进行过滤。

正在加载编辑器...
显示提示

与上一个练习相同的 JOIN,但根据 d.city = 'Milano' 而不是部门名称进行过滤。

3 次尝试后可用的解决方案