SQL执行顺序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL执行顺序相关的知识,希望对你有一定的参考价值。

参考技术A 查询语句中select from where group by having order by的执行顺序

1.查询中用到的关键词主要包含六个,并且他们的顺序依次为 

select--from--where--group by--having--order by 

其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序 

与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行 

from--where--group by--having--select--order by, 

from:需要从哪个数据表检索数据 

where:过滤表中数据的条件 

group by:如何将上面过滤出的数据分组 

having:对上面已经分组的数据进行过滤的条件  

select:查看结果集中的哪个列,或列的计算结果 

order by :按照什么样的顺序来查看返回的数据

2.from后面的表关联,是自右向左解析的 

而where条件的解析顺序是自下而上的。 

也就是说,在写SQL文的时候,尽量把数据量大的表放在最右边来进行关联, 

而把能筛选出大量数据的条件放在where语句的最下面。

SQL Select语句完整的 执行顺序 【从DBMS使用者角度】:

1、from子句组装来自不同数据源的数据;

2、where子句基于指定的条件对记录行进行筛选;

3、group by子句将数据划分为多个分组;

4、使用聚集函数进行计算;

5、使用having子句筛选分组;

6、计算所有的表达式;

7、使用order by对结果集进行排序 。

from 子句--执行顺序为从后往前、从右到左

表名(最后面的那个表名为驱动表,执行顺序为从后往前, 所以数据量较少的表尽量放后)

oracle 的解析器按照从右到左的顺序处理,FROM 子句中的表名,FROM 子句中写在最后的表(基础表 driving

table)将被最先处理,即最后的表为驱动表,在FROM 子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3

个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指被其他表所引用的表

多表连接时,使用表的别名并把别名前缀于每个Column上。可以减少解析的时间并减少那些由Column 歧义引起的语法错误.

where子句--执行顺序为自下而上、从右到左

ORACLE 采用自下而上从右到左的顺序解析Where 子句,根据这个原理,表之间的连接必须写在其他Where 条件之前, 可以过滤掉最大数量记录的条件必须写在Where 子句的末尾。

group by--执行顺序从左往右分组

提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。即在GROUP BY前使用WHERE来过虑,而尽量避免GROUP BY后再HAVING过滤。

having 子句----很耗资源,尽量少用

避免使用HAVING 子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作.

如果能通过Where 子句在GROUP BY前限制记录的数目,那就能减少这方面的开销.

(非oracle 中)on、where、having 这三个都可以加条件的子句中,on 是最先执行,where 次之,having 最后,因为on 是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的,

where 也应该比having 快点的,因为它过滤数据后才进行sum,在两个表联接时才用on 的,所以在一个表的时候,就剩下where 跟having比较了。

在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where 可以使用rushmore 技术,而having 就不能,在速度上后者要慢。

如果要涉及到计算的字段,就表示在没计算之前,这个字段的值是不确定的,where 的作用时间是在计算之前就完成的,而having 就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。

在多表联接查询时,on 比where 更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where 进行过滤,然后再计算,计算完后再由having 进行过滤。

由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里。

select子句--少用*号,尽量取字段名称 。

ORACLE 在解析的过程中, 会将依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 使用列名意味着将减少消耗时间。

sql 语句用大写的;因为 oracle 总是先解析 sql 语句,把小写的字母转换成大写的再执行

order by子句--执行顺序为从左到右排序,很耗资源

SQL 执行顺序

    SQL 是一种声明式语言,与其他语言相比它的最大特点是执行顺序-并非按照语法顺序来执行。因此很多程序猿看到SQL就头疼,我之前也是这样,后来看到一篇文章后豁然开朗-地址

    理解了SQL的执行顺序无疑对我们学习SQL有很大的帮助。标准的SQL的解析顺序为:

FROM(组装来自不同数据源的数据)->WHERE(对数据源进行指定条件的筛选)->GROUP BY(对数据源进行分组)->聚合函数进行计算->HAVING(对分组结果进行筛选)->计算所有表达式->ORDER BY(对结果进行排序);每个步骤都会产生一个虚拟表,该虚拟表用于下一个步骤的输入。

    下面一个比较复杂的SQL语法表示,通过它来进一步理解SQL的执行顺序 。

(08)SELECT 
(09)DISTINCT 
(11)<Top num> <column name>
(01)FROM [Left_table]
(03)<join_type> JOIN [Right_Table]
(02)ON join_condition>
(04)WHERE <where_condition>
(05)GROUP BY <group_by_list>
(06)WITH <CUBE |ROLLUP>
(07)HAVING <having_condition>
(10)ORDER BY <order_by_column_list>
上面的sql语句执行顺序如下:

技术分享

技术分享

  最后,希望对大家有帮助。ps:好久没写博客了,怪自己太懒了,自己要坚持下去

  请关注我的github:https://github.com/khadron

以上是关于SQL执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句执行流程与顺序原理解析

sql语句执行顺序、

sql执行顺序以及on和where的区别

sql语句的执行顺序是啥,为啥下面这两个sql执行的结果是一样的

SQL 执行顺序

SQL语句执行顺序