课程 5.2: INNER JOIN - 组合匹配行
在上一课中,我们建立了连接表以检索相关数据的基本概念。最常见和使用频率最高的连接类型是 INNER JOIN。在本课中,我们将详细探讨其逻辑、语法和实际应用。
什么是 INNER JOIN?
INNER JOIN 是一种操作,仅在两个表中根据指定条件存在匹配值时,才会组合这两个表的行。如果表 A 中的某一行在表 B 中没有对应的匹配,则该行将被排除在结果集之外。同样,表 B 中任何不匹配表 A 的行也会被排除。
可以将其视为两个数据集的 交集。
可视化:
表 A (客户) 表 B (付款)
+----+----------+ +----+----------+
| id | 姓名 | | id | 金额 |
+----+----------+ +----+----------+
| 1 | 爱丽丝 | <--------> | 1 | 10.00 | (匹配!)
| 2 | 鲍勃 | | 1 | 15.00 | (匹配!)
| 3 | 查理 | | 4 | 20.00 | (查理或 ID 4 没有匹配)
+----+----------+ +----+----------+
在这个例子中,查理被排除,因为他没有付款,而 customer_id 为 4 的付款被排除,因为没有该 ID 的客户。
INNER JOIN 语法
INNER JOIN 的标准语法为:
SELECT
table1.column1,
table2.column2
FROM
table1
INNER JOIN
table2 ON table1.common_column = table2.common_column;
INNER JOIN:指定我们只想要匹配的行。ON:定义匹配的条件(通常是一个表的主键和另一个表的外键)。
注意: 在大多数 SQL 数据库(如 MySQL、PostgreSQL 和 SQL Server)中,关键字
INNER是可选的。写JOIN和INNER JOIN将产生完全相同的结果。
实际示例(Sakila 数据库)
1. 连接城市与国家
city 表包含一个 country_id,它指向 country 表。为了查看城市名称及其国家名称,我们使用 INNER JOIN。
SELECT
ci.city,
co.country
FROM
city AS ci
INNER JOIN
country AS co ON ci.country_id = co.country_id;
此查询仅返回与有效国家相关联的城市。
2. 列出员工及其地址
为了找出每位员工的居住地,我们连接 staff 和 address 表。
SELECT
s.first_name,
s.last_name,
a.address,
a.district
FROM
staff AS s
INNER JOIN
address AS a ON s.address_id = a.address_id;
连接多个表
您可以链接多个 INNER JOIN 子句,以一次性从多个表中收集信息。例如,要查看某个演员出演的电影,我们需要三个表:actor、film 和连接表 film_actor。
SELECT
a.first_name,
a.last_name,
f.title
FROM
actor AS a
INNER JOIN
film_actor AS fa ON a.actor_id = fa.actor_id
INNER JOIN
film AS f ON fa.film_id = f.film_id
LIMIT 10;
工作原理:
- 第一个连接基于
actor_id连接actor和film_actor。 - 第二个连接基于
film_id将第一个连接的结果与film表连接。 - 只有在所有三个表中都存在的记录才满足条件并出现在结果中。
本课的关键要点
- INNER JOIN 是 SQL 中的默认连接类型。
- 仅当两个表中存在 匹配 时,它才会返回行。
- 不满足连接条件的行将从结果集中 丢弃。
- 通过添加后续的
INNER JOIN语句,您可以连接多个表。 - 使用 表别名(
AS ci、AS co)使复杂的连接更易于阅读和编写。