在 MySQL 中,联合查询(JOIN 查询)是用来把多个表的数据按照某个关联字段组合在一起进行查询的方式。通常用于存在关联关系的表,比如:用户表 + 订单表。
一、JOIN 联合查询的基本语法
SELECT 字段列表
FROM 表1
JOIN 表2
ON 表1.字段 = 表2.字段;
JOIN:表示连接表ON:指定连接条件- 一般使用 主键和外键进行关联
二、常见的联合查询类型
1️⃣ INNER JOIN(内连接)
只返回两个表中匹配的数据
SELECT u.id, u.name, o.order_id
FROM users u
INNER JOIN orders o
ON u.id = o.user_id;
含义:
- users 表 和 orders 表
- 只显示 有订单的用户
示例结果:
| id | name | order_id |
|---|---|---|
| 1 | Tom | 101 |
| 2 | Lucy | 102 |
没有订单的用户不会出现。
2️⃣ LEFT JOIN(左连接)
返回左表全部数据 + 右表匹配数据
SELECT u.id, u.name, o.order_id
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id;
含义:
- 以 users 表为主
- 即使没有订单也会显示
示例:
| id | name | order_id |
|---|---|---|
| 1 | Tom | 101 |
| 2 | Lucy | 102 |
| 3 | Jack | NULL |
3️⃣ RIGHT JOIN(右连接)
返回右表全部数据 + 左表匹配数据
SELECT u.id, u.name, o.order_id
FROM users u
RIGHT JOIN orders o
ON u.id = o.user_id;
含义:
- 以 orders 表为主
4️⃣ 多表联合查询
MySQL 可以连接 3个以上的表
SELECT u.name, o.order_id, p.product_name
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id;
查询结果:
用户 → 订单 → 商品
三、JOIN 的实际案例
表结构
users
| id | name |
|---|---|
| 1 | Tom |
| 2 | Lucy |
orders
| order_id | user_id |
|---|---|
| 101 | 1 |
| 102 | 2 |
查询用户订单
SELECT users.name, orders.order_id
FROM users
JOIN orders
ON users.id = orders.user_id;
结果:
| name | order_id |
|---|---|
| Tom | 101 |
| Lucy | 102 |
四、联合查询的优化技巧
1 使用别名(推荐)
SELECT u.name, o.order_id
FROM users u
JOIN orders o
ON u.id = o.user_id;
代码更简洁。
2 建立索引
CREATE INDEX idx_user_id ON orders(user_id);
JOIN 查询会明显加速。
3 只查询需要字段
❌ 不推荐
SELECT *
✅ 推荐
SELECT u.name, o.order_id
五、JOIN vs 子查询
JOIN(推荐)
SELECT u.name
FROM users u
JOIN orders o ON u.id = o.user_id;
子查询
SELECT name
FROM users
WHERE id IN (SELECT user_id FROM orders);
一般来说:
- JOIN 性能更好
- 子查询可读性有时更好
✅ 总结
MySQL 联合查询常见 3 种:
| 类型 | 说明 |
|---|---|
| INNER JOIN | 两表都存在的数据 |
| LEFT JOIN | 左表全部 |
| RIGHT JOIN | 右表全部 |
如果你愿意,我可以继续给你讲 MySQL 联合查询 90% 程序员都会写错的 6 个坑(面试 + 实战非常常见)。