技术文摘
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 子句的作用及执行顺序,合理安排条件,以提升查询性能。