SQL语句的执行顺序对于编写和理解复杂的查询是非常重要的。这是一个典型的SQL查询(例如SELECT)的基本执行顺序:
FROM
和JOIN
: 这些子句是首先执行的。在这个阶段,数据库会组合所有的输入表格,形成一个结果集。JOIN
条件定义了如何组合这些表格。WHERE
: 然后数据库将根据WHERE
子句的条件过滤结果集。这个阶段移除所有不满足条件的行。GROUP BY
: 然后如果有的话,将对剩下的行进行分组。这创建了一个可以用于聚合函数(如SUM
,AVG
,MAX
等)的新的结果集。HAVING
: 如果存在HAVING
子句,那么它将在GROUP BY
子句之后执行,用来过滤由GROUP BY
子句创建的分组结果。同样,这个阶段会移除所有不满足条件的行。SELECT
: 在此阶段,SQL将执行所有在SELECT
子句中的表达式。DISTINCT
: 如果有的话,DISTINCT
关键字会移除任何重复的行。UNION
:表联合。ORDER BY
: 最后,如果存在ORDER BY
子句,数据库将对结果集进行排序。LIMIT
/OFFSET
: 这些子句最后执行,确定返回给客户端的最终行数。
这是标准的逻辑执行顺序,实际物理执行顺序可能会根据数据库优化器的选择而变化,但是结果会与这个逻辑顺序产生的结果一致。这种逻辑顺序也解释了为什么你不能在WHERE
子句中使用SELECT
子句中定义的别名,因为SELECT
子句在WHERE
子句之后执行。
SQL语句可以看做以下的过程:
- 列出并连接需要用到的表。
- 过滤结果集,这过程会移除不满住条件的行。
- 创建分组
- 过滤分组,过滤分组中不满足条件的行。
- 执行表达式。
- 去重
- 排序
- 返回指定的行数。