MySQL的JION用法
MySQL JOIN 用法详解
MySQL JOIN 用于在两个或多个表之间根据相关列进行数据查询。以下是主要连接类型的详细说明:
1. INNER JOIN(内连接)
作用:只返回两个表中匹配的记录,不匹配的记录不会出现在结果集中。
SELECT users.id, users.name, countries.country_name
FROM users
INNER JOIN countries ON users.country_id = countries.id;
适用场景:只需要获取两个表中有对应关系的数据,如查询"已分配国家的用户"。
2. LEFT JOIN(左连接)
作用:返回左表的所有记录,如果右表有匹配则一起返回;如果没有匹配,右表字段返回 NULL。
SELECT users.id, users.name, countries.country_name
FROM users
LEFT JOIN countries ON users.country_id = countries.id;
适用场景:需要展示左表全部数据,即使右表没有对应记录(如查询"所有用户及其国家信息,包括未分配国家的用户")。
3. RIGHT JOIN(右连接)
作用:返回右表的所有记录,如果左表有匹配则一起返回;如果没有匹配,左表字段返回 NULL。
SELECT users.id, users.name, countries.country_name
FROM users
RIGHT JOIN countries ON users.country_id = countries.id;
注意:使用较少,通常可以通过交换表位置改用 LEFT JOIN 实现相同效果。
4. FULL JOIN(全外连接)
作用:返回左右两表的所有记录,匹配则合并,不匹配则填充 NULL。
重要:MySQL 不直接支持 FULL JOIN,需要使用 UNION 结合 LEFT JOIN 和 RIGHT JOIN 实现:
SELECT users.id, users.name, countries.country_name
FROM users
LEFT JOIN countries ON users.country_id = countries.id
UNION
SELECT users.id, users.name, countries.country_name
FROM users
RIGHT JOIN countries ON users.country_id = countries.id;
5. CROSS JOIN(交叉连接)
作用:返回笛卡尔积,即两张表的所有可能组合,不需要 ON 条件。
SELECT users.name, countries.country_name
FROM users
CROSS JOIN countries;
注意:3 个用户 × 3 个国家 = 9 条记录。大数据量时慎用,容易导致性能问题。
实用技巧
使用表别名简化查询:
SELECT
i.id,
i.name,
c.name AS category_name
FROM items AS i
JOIN categories AS c ON i.category_id = c.id;
避免常见错误:
- ❌ 忘记写
ON条件会导致CROSS JOIN(笛卡尔积) - ✅ 始终明确指定连接条件
- ✅ 使用有意义的列别名避免重复列名混淆
连接类型对比总结
| 连接方式 | 作用 | 是否包含不匹配数据 |
|---|---|---|
| INNER JOIN | 仅返回匹配记录 | 否 |
| LEFT JOIN | 返回左表全部数据,右表无匹配填 NULL | 是(左表) |
| RIGHT JOIN | 返回右表全部数据,左表无匹配填 NULL | 是(右表) |
| FULL JOIN | 返回两表全部数据,填 NULL | 是(左右表) |
| CROSS JOIN | 返回笛卡尔积(所有组合) | N/A |

浙公网安备 33010602011771号