打好基础——数据库——SQL语句的执行顺序

SQL语句的执行顺序对于编写和理解复杂的查询是非常重要的。这是一个典型的SQL查询(例如SELECT)的基本执行顺序:

  1. FROMJOIN: 这些子句是首先执行的。在这个阶段,数据库会组合所有的输入表格,形成一个结果集。JOIN条件定义了如何组合这些表格。
  2. WHERE: 然后数据库将根据WHERE子句的条件过滤结果集。这个阶段移除所有不满足条件的行。
  3. GROUP BY: 然后如果有的话,将对剩下的行进行分组。这创建了一个可以用于聚合函数(如SUMAVGMAX等)的新的结果集。
  4. HAVING: 如果存在HAVING子句,那么它将在GROUP BY子句之后执行,用来过滤由GROUP BY子句创建的分组结果。同样,这个阶段会移除所有不满足条件的行。
  5. SELECT: 在此阶段,SQL将执行所有在SELECT子句中的表达式。
  6. DISTINCT: 如果有的话,DISTINCT关键字会移除任何重复的行。
  7. UNION:表联合。
  8. ORDER BY: 最后,如果存在ORDER BY子句,数据库将对结果集进行排序。
  9. LIMIT / OFFSET: 这些子句最后执行,确定返回给客户端的最终行数。

这是标准的逻辑执行顺序,实际物理执行顺序可能会根据数据库优化器的选择而变化,但是结果会与这个逻辑顺序产生的结果一致。这种逻辑顺序也解释了为什么你不能在WHERE子句中使用SELECT子句中定义的别名,因为SELECT子句在WHERE子句之后执行。


SQL语句可以看做以下的过程:

  1. 列出并连接需要用到的表。
  2. 过滤结果集,这过程会移除不满住条件的行。
  3. 创建分组
  4. 过滤分组,过滤分组中不满足条件的行。
  5. 执行表达式。
  6. 去重
  7. 排序
  8. 返回指定的行数。