MySQL联合查询JOIN内连接左连接区别 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 ...;
常见坑
- 左连接后 WHERE 右表字段,等于把 NULL 行过滤掉,变成内连接。
- 连接字段没加索引,大表 JOIN 全表扫描很慢。
- ON 和 WHERE 混用条件,结果集不一致。
- 笛卡尔积:连接条件缺失,行数暴增。
- RIGHT JOIN 可读性差,一般用 LEFT 互换替代。
- 多表 JOIN 顺序影响性能,小表驱动大表。
- NULL 值比较用 IS NULL,不能用 = NULL。
总结
INNER 只留匹配,LEFT 保留左表全部、右表不匹配为 NULL,RIGHT 反之。左连接过滤右表条件要放 ON,别放 WHERE。连接字段建索引,EXPLAIN 检查是否全表扫描,避免笛卡尔积。
遇到问题加QQ23979811 协助处理