在实际业务中,数据往往分布在多个表中。例如,用户信息可能在 users
表里,订单信息在 orders
表里。
那么,我们怎么把这两张表的数据“连起来”进行查询呢?这就轮到 SQL 中非常重要的关键字了 —— JOIN
!
一、么是 JOIN?
JOIN
是 SQL 中用于连接两个或多个表的关键字。它通过一个共同的字段(如主键和外键)将不同表中的数据关联在一起。
你可以把它理解为:“根据某个条件,把两张或多张表合并成一张大表来查询”。
二、常见的 JOIN 类型
JOIN 类型 | 含义说明 |
---|---|
INNER JOIN |
只返回两个表中匹配的行 |
LEFT JOIN |
返回左表所有行,即使右表没有匹配项(用 NULL 填充) |
RIGHT JOIN |
返回右表所有行,即使左表没有匹配项 |
FULL OUTER JOIN |
返回两个表的所有行,不管有没有匹配(部分数据库不支持) |
⚠️ 注意:MySQL 不支持
FULL OUTER JOIN
,但可以通过UNION
实现。
三、示例讲解
假设我们有两个表:
表1:users
(用户表)
id | name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
表2:orders
(订单表)
order_id | user_id | product |
---|---|---|
101 | 1 | 手机 |
102 | 1 | 耳机 |
103 | 2 | 鼠标 |
示例1:INNER JOIN(内连接)
SELECT users.name, orders.product
FROM users
INNER JOIN orders ON users.id = orders.user_id;
结果:
name | product |
---|---|
张三 | 手机 |
张三 | 耳机 |
李四 | 鼠标 |
只有 id
在两个表中都存在的记录才会被显示。
示例2:LEFT JOIN(左连接)
SELECT users.name, orders.product
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
结果:
name | product |
---|---|
张三 | 手机 |
张三 | 耳机 |
李四 | 鼠标 |
王五 | NULL |
左表(users
)所有记录都会显示,右表没有对应记录时用 NULL
填充。
示例3:RIGHT JOIN(右连接)
SELECT users.name, orders.product
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
结果:
name | product |
---|---|
张三 | 手机 |
张三 | 耳机 |
李四 | 鼠标 |
和 LEFT JOIN
相反,保留的是右表的所有记录。
注意:
JOIN
的核心是找到两个表之间的关联关系,通常是主键与外键的关系。如果你不确定应该用哪种
JOIN
,先尝试画出两个表的结构图,再决定需要保留哪些数据。多个表也可以一起连接,比如:
SELECT u.name, o.product, a.address FROM users u LEFT JOIN orders o ON u.id = o.user_id LEFT JOIN addresses a ON u.id = a.user_id;
四、 总结对比表
JOIN类型 | 是否保留左表全部 | 是否保留右表全部 | 匹配方式 |
---|---|---|---|
INNER JOIN |
❌ | ❌ | 仅返回匹配项 |
LEFT JOIN |
✅ | ❌ | 左表全保留 |
RIGHT JOIN |
❌ | ✅ | 右表全保留 |
FULL JOIN |
✅ | ✅ | 两边都保留 |