SQL Server 中SQL语句执行顺序
我们需要对SQL语句的执行顺序了若指掌,才能更好的理解SQL。
SQL 不同于与其他编程语言的最明显特征是处理代码的顺序。
在大数编程语言中,代码按编码顺序被处理。
但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后被处理。
每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入(需要理解这一概念)。
这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。
只是最后一步生成的表才会返回给调用者。
如果没有在查询中指定某一子句,将跳过相应的步骤。
下面是SQL Server 中SQL语句执行顺序的简单描述。
(8)SELECT (9)DISTINCT (11)<Top Num> <select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list> (6)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>
① 确定表名——from
我们要对某张表进行筛选,首先要确定目标表存在。
如果表都不存在,就更别谈什么取数据了,所以,最先执行的语句为“ from 表名 ”
② 多表连接的条件——on
当我们需要对多张表进行连接时,需要使用 on 进行多个字段的连接。
先进行 on 的过滤,而后才进行 join ,这样就避免了两个大表产生全部数据的笛卡尔积的庞大数据。
③ 多表连接的方式——join
当我们需要对多张表进行连接时,需要指定连接的表名,以及表连接的方式。
如果没有多表连接,则没有②③两步。
④ 筛选条件——where
如果有多表连接,则可以对多张表的不同列进行筛选。
所以 where 语句的执行顺序肯定在多表连接之后。
⑤ 分组——group by
肯定要先筛选出我们需要的值,然后再对其进行分组。
如果想要对分组后的聚合内容进行筛选,就需要使用 having 语句。
⑥ 显示汇总行——with
with语句,可以在结果集内返回每一个可能的组和子组组合的 group by 汇总行。
一般不会使用,可以在确实需要使用的时候再去了解。
⑦ 聚合后筛选——having
对 ⑤ 中 group by 聚合后的内容进行筛选,顺序肯定在 group by 之后。
注意where和having的区别:
- where是对原始数据进行筛选;
- having是对聚合后的数据进行筛选;
- where语句执行在having语句之前。
⑧ 选择——select
前面⑦步都完成之后,我们得到了一个虚拟表(不可见)。
然后我们使用select语句进行列选择(说白了,我们必须先得到一个表,select…from之间的语句,只对表中的行或列进行一些选择罢了)。
所以,select语句“ 几乎总是最后被处理 ”。
⑨ 去重——distinct
和select一样,我们需要先得到一个虚拟表,才能对其进行去重操作。
⑩ 排序——order by
对所有前面处理完的数据进行排序。
⑪ 选择前n行——top n
对排序之后的数据,选择前n行进行显示。