技术文摘
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 子句的作用及执行顺序,合理安排条件,以提升查询性能。
- 微服务中负载均衡算法及配置策略的深度解析
- Spring Boot 中 Tomcat、Jetty、Undertow 嵌入式服务器谁最优?
- ElementUI、Ant-Deisgn 在前端的应用将逐渐减少
- 线程池线程抛出异常的处理方法
- 探究:Elasticsearch 文档的 _id 与 Lucene 的 docid 关系
- Golang httpClient 请求不时出现 EOF 的解决方法
- TimeWheel 算法:介绍与应用探索
- Spring Boot 中接口幂等性的四种实现方案
- 高并发场景中排行榜系统的设计最佳实践
- Go 必知必会:Go RPC 构建高效远程服务指南揭秘
- 单点登录全面剖析(图文详尽汇总)
- 这些 MyBatis 技巧让代码效率暴增 10 倍,同事羡慕,老板加薪 50%
- 字典扩容的过程及经历
- Go 语言构建 Windows 守护进程
- Vue 开发者会失业?AI 工具 v0 能生成 Vue 代码!