SQL的执行顺序与书写顺序是有较大的不同的,二者不能混为一谈,接下来主要谈一下参数的执行顺序以及其中涉及的一些细节。
SQL的书写顺序:
select
-> distinct
-> from
-> join
-> on
-> where
-> group by
-> having
-> order by
-> limit
SQL的执行顺序:
from
-> on
-> join
-> where
-> group by
-> having
-> select
-> distinct
-> order by
-> limit
from
:
获取待查询数据涉及的相关表,假设一张表为 表1 另一张表为 `表2` ,`表1` 与 `表2` 做笛卡尔积,生成一张
`中间表1`.
on
:
筛选条件 或者 关联条件,基于 form 中得到的 `中间表1` 筛选符合条件的数据,生成 `中间表2`.
join
:
表连接,根据连接方式的不同,选择如何在 `中间表2` 中添加外部行,left join 就是把 左表 中被筛除掉的
数据重新添加到 `中间表2` 中,并生成 `中间表3`;right join 和 inner join 同理。
where
:
筛选 `中间表3` 中的数据生成 `中间表4`,执行顺序:自上到下、自左到右。
注: 对数据库记录生效。
无法对聚合结果生效。
可过滤掉最大记录数的条件必须写在 where 子句末尾。
不支持聚合函数(sum、count、max、avg)。
group by
:
根据聚合键(自定义字段)进行分组,即在 `中间表4` 的基础上生成 `中间表5`。
注:过滤条件尽可能在 where 中执行,尽量避免在后序的 having 中进行过滤。
having
:
对分组进行筛选,在 `中间表5` 的基础上生成` 中间表6`。支持聚合函数(sum、count、max、avg)
select
:
选择字段,对 `中间表6` 的字段进行选取,生成 `中间表7`。
distinct
:
对 `中间表7` 进行去重处理,生成 `中间表8`。
order by
:
按照排序键对 `中间表8` 中的记录进行排序,生成 `中间表9`。
注:执行顺序为从左到右。
limit
:
对 `中间表9` 进行分页处理,截取目标记录组,生成 `中间表10`。