sql语句执行顺序解析
- sql
- 2024-05-01 22:22:41
- 4988
〽️sql执行顺序以及on和where的区别
(1.)select语句的执行顺序
SELECT语句的处理顺序
SELECT语句的处理顺序如下所示。
1.FROM
2.ON
3.JOIN
4.WHERE
5.GROUPBY
6.WITHCUBE或WITHROLLUP
7.有
8.SELECT
9.DISTINCT
10.ORDERBY
11.TOP
(5)SELECTDISTINCT
(7)TOP()
(1)FROMJOINON
(2)WHERE
(3)GROUPBY
(4)HAVING
(6)ORDERBY
T-SQL为查询的每个级别执行单独的任务。
包含:
(1)FROMstage
FROM阶段识别查询的源表并处理表运算符。
包含连接操作(各种连接)的查询有以下主要步骤:
a.求笛卡尔积。
无论哪种类型的联接操作,第一步都是执行交叉联接并求笛卡尔积,生成虚拟表VT1-J1。
b.ON过滤器。
在此阶段,根据ON子句中出现的谓词对上一步生成的VT1-J1进行过滤,使得谓词值为true的行通过测试并插入到VT1-J2中。
c.添加外部行。
如果指定了externaljoin,则VT1-J2中不匹配的行必须作为外部行添加到VT1-J2以生成VT1-J3。
完成以上步骤就完成了FROM阶段。
总结一下,FROM阶段就是预处理,根据指定的运算符(除了join之外,还有apply、pivot、unpivot)对语句中提到的每一个表进行处理。
(2)WHERE阶段
WHERE阶段根据条件过滤VT1中的行,以便仅将满足条件的行插入到VT2中。
(3)GROUPBY阶段GROUP阶段根据指定的列名列表对VT2的行进行分组,并生成VT3。
最后,每组只有一行。
(4)HAVING阶段
该阶段根据HAVING子句中出现的谓词过滤VT3中的组,并将符合条件的组插入到VT4中。
(5)SELECT阶段
该阶段是一个投影过程,处理SELECT子句中指定的元素并生成VT5。
这些步骤通常按以下顺序执行:a.计算SELECT列表中的表达式并生成VT5-1。
b.如果存在DISTINCT,则删除VT5-1中的重复行并生成VT5-2。
c.如果TOP存在,则根据ORDERBY子句定义的逻辑顺序从VT5-2中进行选择。
通过对指定数量或百分比的行进行签名来生成VT5-3
(6)ORDERBY阶段
根据ORDERBY子句中指定的列表对VT5-3中的行进行排序,并创建VC6将生成的游标。
如果On和where只能选其一:
On先过滤,再合并。
这避免了由两个大表产生的所有数据的笛卡尔乘积产生的巨大数据。
执行这些步骤时,每个步骤都会生成一个虚拟表,用作下一步的输入。
这些虚拟表不可用于调用者(客户端应用程或外部查询)。
仅将上一步生成的表返回给调用者。
如果查询中没有指定子句,则跳过相应步骤。
(2)on和where哪个更高效?
对于innerjoin,你可以用on或where得到相同的结果,但是很难说哪个更高效或者更快。
这是有区别的,因为对于outerjoin(左或右),首先启用on,预先过滤一些数据,然后启用where。
综上所述,我觉得下面的效率比较高。
我把它放进去是因为它是在where之前执行的。
先笛卡尔积,再过滤。
如果连接是内部的,则继续向下。
如果连接是左连接,则将数据附加到过滤后的左主表。
byon;然后运行whereFiltering;
on不是最终的过滤。
因为后面可能会添加leftjoin。
只有在使用外连接(左、右)时,on和where之间的区别是因为使用内连接时,on之后是where,并且中间没有其他步骤,无论你在哪里都是一样的。
制定它。