«

MySQL联合查询JOIN内连接左连接区别

时间:2026-11-15 07:14     作者:emer     分类: MySQL


前言

多表查询是开发高频操作,INNER JOIN、LEFT JOIN、RIGHT JOIN 结果差异很大,写错会丢数据或出现空行。本文讲解三种连接的含义、示例、适用场景和性能注意。

操作步骤

1. 内连接 INNER JOIN(只保留匹配行)

SELECT o.id, u.username
FROM orders o
INNER JOIN users u ON o.user_id = u.id;

两边都匹配才出现。

2. 左连接 LEFT JOIN(保留左表全部)

SELECT o.id, u.username
FROM orders o
LEFT JOIN users u ON o.user_id = u.id;

订单即使没匹配用户也保留,用户字段为 NULL。

3. 右连接 RIGHT JOIN(保留右表全部)

SELECT o.id, u.username
FROM orders o
RIGHT JOIN users u ON o.user_id = u.id;

4. WHERE 过滤注意

SELECT o.id,u.username FROM orders o
LEFT JOIN users u ON o.user_id=u.id
WHERE u.status = 1;

左连接后在 WHERE 过滤右表非空,会退化成内连接。

5. 多表连接

SELECT * FROM orders o
JOIN users u ON o.user_id=u.id
JOIN goods g ON o.goods_id=g.id;

6. 用 EXPLAIN 看执行计划

EXPLAIN SELECT ...;

常见坑

  1. 左连接后 WHERE 右表字段,等于把 NULL 行过滤掉,变成内连接。
  2. 连接字段没加索引,大表 JOIN 全表扫描很慢。
  3. ON 和 WHERE 混用条件,结果集不一致。
  4. 笛卡尔积:连接条件缺失,行数暴增。
  5. RIGHT JOIN 可读性差,一般用 LEFT 互换替代。
  6. 多表 JOIN 顺序影响性能,小表驱动大表。
  7. NULL 值比较用 IS NULL,不能用 = NULL。

总结

INNER 只留匹配,LEFT 保留左表全部、右表不匹配为 NULL,RIGHT 反之。左连接过滤右表条件要放 ON,别放 WHERE。连接字段建索引,EXPLAIN 检查是否全表扫描,避免笛卡尔积。

遇到问题加QQ23979811 协助处理

标签: MySQL join 内连接 左连接