技术文摘
SQL 里 where 和 on 谁先执行
SQL 里 where 和 on 谁先执行
在 SQL 的世界里,理解 where 和 on 子句的执行顺序至关重要,这对于编写高效、准确的查询语句意义重大。
首先要明确的是,on 子句的执行优先于 where 子句。
on 子句主要用于在连接表时指定连接条件。当执行 join 操作时,数据库会首先依据 on 子句的条件将相关表进行连接。例如,有两个表——学生表(student)和成绩表(score),要根据学生的 ID 来关联查询学生及其对应的成绩,使用 SELECT * FROM student s JOIN score sc ON s.student_id = sc.student_id; 语句时,数据库先按照 ON 后的条件,将两个表中 student_id 相同的记录进行匹配连接,生成一个新的数据集。这个新数据集是基于连接条件构建的,是后续操作的基础。
而 where 子句则是在表连接完成后才发挥作用。它用于对已经连接好的数据集进行过滤筛选。还是以上面的例子来说,如果要查询成绩大于 80 分的学生信息及成绩,就要在连接语句后加上 WHERE sc.score > 80,即 SELECT * FROM student s JOIN score sc ON s.student_id = sc.student_id WHERE sc.score > 80;。此时,数据库会在已经连接好的数据集里,按照 where 子句设定的条件,筛选出成绩大于 80 分的记录。
了解这种执行顺序,对优化 SQL 查询有很大帮助。如果将本应写在 on 子句里的条件误写在 where 子句中,可能会导致数据库先进行全表连接,然后再进行大量的数据过滤,增加了不必要的计算开销,降低查询效率。例如,在连接一个有 10 万条记录的表和一个有 5 万条记录的表时,如果本应在 on 子句中过滤掉部分记录,却写在 where 子句中,就可能会产生一个 50 亿条记录的临时表,再进行过滤操作,效率极低。
在编写 SQL 查询语句时,要正确区分 where 和 on 子句的作用及执行顺序,合理安排条件,以提升查询性能。
- MySQL 中 TEXT 字段以 0 作筛选条件为何会查询出所有数据
- InnoDB 表中创建跨越多个字段的联合索引,索引数量会达到字段数的乘积吗
- MySQL 终端操作:更改表、字符集与删除
- Spring Boot双数据源连接MySQL时出现Communications link failure错误怎么排查
- 基于 Express、TypeScript、TypeORM 和 MySQL 搭建项目的推荐框架与开源项目
- SpringBoot项目双数据源连接失败 解决Communications link failure的方法
- MyBatis动态SQL中怎样避免``与``并列使用引发的BadSql问题
- Spring Boot查询SQL为空:IDEA查询失败但Navicat成功的排查方法
- MySQL 如何计算数据表中排除最新记录后的其余记录总和
- Apple M1芯片采用的是ARMv8架构还是ARMv9架构
- Mybatis 动态 SQL 优化:<if>与<choose>标签的正确使用方法
- MySQL 如何查询特定部门及其所有下属部门的用户
- Nextcloud搭建报错:MySQL 5.5数据库最大键长度限制的解决方法
- MySQL 查询:排除最新数据后各类型 Num 总和的实现方法
- 怎样查询某部门下全部用户且防止重复记录