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 JOINRIGHT 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
posted @ 2026-03-26 10:10  cwp0  阅读(6)  评论(0)    收藏  举报