你不可不知的T-SQL执行顺序
-- SQL查询处理的步骤(生成了很多中间表)
SELECT TOP 3 a.CustomerId,COUNT(1) AS order_count
FROM dbo.T_Customer AS a
INNER JOIN dbo.T_Order AS b
ON a.CustomerId = b.CustomerId
WHERE a.CustomerId < 200
GROUP BY a.CustomerId WITH ROLLUP
HAVING COUNT(1)>10
ORDER BY order_count;
/* 执行顺序
1、FROM:对FROM子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表T1。交叉连接:cross join 并且不需要ON连接
2、ON:对T1应用ON筛选器,两边都匹配的数据放入到T2。(INNER JOIN)
3、如果是左外连接或右外连接则保留表中未找到匹配的行将作为外部行添加到T2,生成T3。
如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤到步骤,直到处理完所有的表位置。
4、WHERE:对T3应用WHERE筛选器,只有使为true的行才插入T4。
5、GROUP BY:按GROUP BY子句中的列列表对T4中的行进行分组,生成T5 。
6、CUBE|ROLLUP:把超组插入T5,生成T6。
7、HAVING:对T6(没有T6时针对T5)应用HAVING筛选器,只有使为true的组插入到T7。
8、SELECT:处理SELECT列表,产生T8。
9、DISTINCT:将重复的行从T8中删除,产品T9。
10、ORDER BY:将T9中的行按ORDER BY子句中的列列表顺序,生成一个游标(VC10)。
11、TOP:从VC10的开始处选择指定数量或比例的行,生成表T11,并返回给调用者。
*/