Jw
首页
技术
英语
首页
技术
英语
  • MySQL

    • MySQL 基础
    • 环境变量配置(PATH)
    • SQL 语法与分类
    • MySQL 数据类型
    • SQL - DDL 数据定义语言
    • SQL - DML 数据操作语言
    • SQL - DQL 数据查询语言
    • SQL - DCL 数据控制语言
    • MySQL 函数
    • SQL 约束
    • SQL 外键约束
    • 多表关系
    • 多表查询(连接查询)
    • 隐式内连接 vs 显式内连接
    • 子查询
    • 多表查询案例
    • 事务
    • 并发事务问题与隔离级别
    • MySQL 体系结构与存储引擎
    • 索引概述
    • 索引结构
    • 索引分类
    • 索引语法
    • SQL 性能分析
    • 索引使用
    • 索引设计原则
    • SQL 优化 - 插入数据与主键优化
    • SQL 优化 - order by 与 group by
    • SQL 优化 - limit / count / update
    • 视图
    • 存储过程
    • 存储过程 - 变量
    • 存储过程 - 流程控制、游标与条件处理
    • 存储函数
    • 触发器
    • 锁概述与全局锁
    • 表级锁
    • 行级锁
    • InnoDB 逻辑存储结构
    • InnoDB 架构
    • 事务原理(redo / undo log)
    • MVCC
    • MySQL 系统数据库
    • MySQL 常用工具
    • 数据备份与导入导出
    • 错误日志与二进制日志
    • 查询日志与慢查询日志
    • 主从复制 - 概述与原理
    • 主从复制 - 搭建
    • Mycat 配置
    • Mycat 垂直拆分与水平拆分
    • Mycat 分片规则
    • Mycat 管理与监控
    • Mycat 读写分离 - 一主一从
    • Mycat 读写分离 - 双主双从

隐式内连接 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 道综合练习题与答案
最近更新: 2026/10/9 23:41
Contributors: liujw
Prev
多表查询(连接查询)
Next
子查询