SQL 的书写顺序和执行顺序是不同的,所以有时候会产生让人头疼的问题,比如having不能用窗口函数等。下面介绍了SQL的运行顺序.
from/join
where
group by
having
window function
select
distinct
order by
limit
详解
1.读取数据
要想执行查询,执行引擎首先要找到相对应的数据(表),所以先执行from。如果有多张表join,则会去扫描所有提到的表,并且用ON里的条件进行聚合。它的扫描顺序是从左往右的。
2.按条件过滤
使用where从句里的条件过滤掉不符合条件的记录。此时数据还没有分组,所以无法使用聚合函数。同时因为还没进行列选取工作(select),所以也无法使用别名。
3.分组聚合
在这一步会根据group by的条件进行分组聚合,将符合条件的数据放到同一组里面,为之后的聚合计算做准备。
4.聚合计算
在上一步分组完成后,having这里就可以使用聚合函数进行计算了。这里可以对聚合计算后的条件进行一些过滤,比如大于平均值等。 常见的聚合函数
AVG:返回平均值
COUNT:返回行数
FIRST:返回第一个记录的值
LAST:返回最后一个记录的值
MAX: 返回最大值
MIN:返回最小值
SUM: 返回总和
5.窗口函数
窗口函数会在聚合计算完成后再进行执行。所以它可以被用在后面的步骤里,比如select 和 order by。这意味着窗口函数能使用聚合计算的结果,但是集合计算无法使用窗口函数的结果。如果需要使用,只能把窗口函数放在子查询里。
6.列选取
在这里,执行引擎会根据语句选取需要的列或者表达式。因为这里已经完成了聚合分组,所以可以使用聚合函数/窗口函数计算后的结果作为列。同时在这里也支持对列进行重命名。
7.去重
在这一步会对最终选取的结果进行去重.
8.排序
这一步会对最终结果根据order by语句指定的列进行排序.
9.返回指定结果数量
通过limit/offset 选取指定数量的记录进行返回。