隐式内连接 vs 显式内连接
两条语句查询结果完全相同,区别只在写法规范、可读性与可维护性;性能没有差异。
-- 隐式内连接(逗号连接)
SELECT e.name, d.name FROM emp e, dept d WHERE e.dept_id = d.id;
-- 显式内连接(INNER JOIN ... ON)
SELECT e.name, d.name FROM emp e INNER JOIN dept d ON e.dept_id = d.id;
一、差异对比
| 维度 | 隐式内连接 | 显式内连接 |
|---|---|---|
| 语法 | 表名用逗号分隔放在 FROM 中,连接条件写在 WHERE 里 | 用 INNER JOIN 指定连接类型,连接条件写在 ON 中 |
| 标准 | 较古老的写法(ANSI SQL-92) | 现代推荐的标准写法(ANSI SQL-99) |
| 可读性 | 连接条件与过滤条件混在 WHERE,多表时臃肿、难分辨 | 连接关系由 ON 承担,WHERE 只做数据过滤,职责分离 |
| 可维护性 | 多表联查时容易漏写某个连接条件 | 每张表紧跟自己的 ON,不易漏 |
| 执行计划 / 性能 | ——— 完全相同 ——— | ——— 完全相同 ——— |
主流数据库(MySQL、PostgreSQL、Oracle 等)的查询优化器会把隐式写法自动改写为显式连接,两者执行计划与性能一致。
二、为什么推荐显式写法
- 职责分离:
ON只负责表与表怎么连,WHERE只负责过滤数据,条件一多也不会乱; - 不易漏条件:隐式写法如果漏写
WHERE中的连接条件,会直接得到笛卡尔积(两表所有行的组合);显式写法的连接条件被ON强制约束,结构上更安全; - 语义明确:一眼能看出是内连接还是外连接,后期改成
LEFT JOIN只需改关键词。
三、速查
-- 隐式(能用,但多表时不推荐)
SELECT ... FROM 表1 别名1, 表2 别名2 WHERE 别名1.字段 = 别名2.字段 [AND 过滤条件];
-- 显式(推荐)
SELECT ... FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.字段 = 别名2.字段 [WHERE 过滤条件];
INNER JOIN中的INNER可以省略,写成JOIN等价;不带ON会直接报语法错误。
相关
- 多表查询(连接查询):内连接 / 外连接 / 自连接 / 联合查询
- 多表查询案例:12 道综合练习题与答案