Mysql中隐式内连接和显式内连接的区别
1. 内连接(INNER JOIN)
内连接是数据库中一种常见的连接方式,用于从两个或多个表中返回满足连接条件的记录,即只返回两张表中匹配的行。
示例场景:有学生表(包含学生 ID 和姓名)和成绩表(包含学生 ID 和成绩),内连接会返回那些在两张表中学生 ID 匹配的记录。
2. 隐式内连接(Implicit Inner Join)
- 实现方式:通过在
WHERE
子句中指定连接条件来实现,没有明确使用INNER JOIN
关键字。 - 特点:
- 语法上直接在
FROM
子句中列出多个表,然后在WHERE
子句中定义连接条件。 - 代码看起来更简洁,但可能不够直观,容易混淆连接条件和其他过滤条件。
- 属于历史遗留写法,早期 SQL 常用。
- 语法上直接在
- 示例代码:
SELECT s.name, g.score
FROM students s, grades g
WHERE s.student_id = g.student_id;
- 代码解释:
FROM students s, grades g
:列出两张表,用逗号分隔。WHERE s.student_id = g.student_id
:指定连接条件,确保只返回学生 ID 匹配的记录。
- 结果:返回学生姓名和对应的成绩。
- 缺点:
- 连接条件混杂在
WHERE
子句中,如果查询复杂,可能难以区分连接条件和过滤条件。 - 可读性较差,尤其是表多时。
- 不推荐在现代 SQL 中使用。
- 连接条件混杂在
3. 显式内连接(Explicit Inner Join)
- 实现方式:通过使用
INNER JOIN
关键字明确指定连接关系,并在ON
子句中定义连接条件。 - 特点:
- 语法清晰,连接逻辑明确,易于理解和维护。
- 是现代 SQL 标准推荐的写法。
- 连接条件与过滤条件分开,增强可读性。
- 示例代码:
SELECT s.name, g.score
FROM students s
INNER JOIN grades g
ON s.student_id = g.student_id;
- 代码解释:
INNER JOIN grades g
:明确指定要连接的表。ON s.student_id = g.student_id
:定义连接条件。
- 结果:与隐式内连接相同,返回学生姓名和对应的成绩。
- 优点:
- 语法结构清晰,连接条件与过滤条件(如果有
WHERE
)分离。 - 更易于维护,适合复杂查询。
- 现代数据库优化器通常更偏好这种写法。
- 语法结构清晰,连接条件与过滤条件(如果有
4. 隐式内连接 vs 显式内连接:主要区别
特性 | 隐式内连接 | 显式内连接 |
---|---|---|
语法 | 用 FROM table1, table2 和 WHERE 条件 | 用 INNER JOIN 和 ON 子句 |
关键字 | 无 INNER JOIN ,用 WHERE | 使用 INNER JOIN 和 ON |
可读性 | 较差,连接条件混在 WHERE 中 | 较高,连接条件明确在 ON 中 |
维护性 | 复杂查询时难以维护 | 易于维护,适合复杂查询 |
现代推荐 | 不推荐,历史遗留 | 推荐,符合现代 SQL 标准 |
性能 | 与显式内连接性能基本相同(优化器处理) | 与隐式内连接性能基本相同(优化器处理) |