大家好,我是乔木,这里是我的一天解决一个问题系列。
我们在写sql脚本的时候,会发现我们的脚本跑完之后如何我们的预想的结果不一致。但是检查了几遍之后,还是发现没有明显的语法错误,但是就是数据对不上,这时候我们可以检查我的是不是我们的sql语法执行顺序没有注意到。比如常规的在有聚合函数和窗口函数的时候,我们的语句的实行顺序是如何的。根据查看<<SQLserver的技术原理内幕>>这本书,我们可以发现sql语句的执行顺序如下:
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>
SQL语句中的执行顺序如下:
(1)首先是from tablename 加载到内存中
(2)如果有多表做笛卡尔积的时候,先执行on语句,参与计算过滤掉不符合条件的数据
(3)join语句把另外的表也加载到内存进来,并做计算
(4)where语句过滤数据不符合条件的数据
(5)group by filed1 对字段filed1进行分组,形成一个结果集
(6)with as 作为子查询,用作简化复杂数据集,只能在下一次查询中使用,区别于视图
(7)having 条件1 可以把它当成一个可以在groub by之后结果集,之后对条件1进行计算。执行顺序GROUP BY >HAVING>ORDER BY ,且不能在where之后。having的字段可以是聚合/窗口函数的列,也可以是group by中的列。
(8)select 选取输出到客户端的数据列
(9)distinct 对已经结算出结果的结果集进行去重
(10)order by 对结果集进行排序
(11) 选出前几名到客户端,类似limit功能。
如果有任何问题,欢迎大家私信交流,每天进步一点点。