当前位置:首页 > sql > 正文

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,并且中间没有其他步骤,无论你在哪里都是一样的。 制定它。