首页天道酬勤sql执行的先后顺序,sql查询条件先后顺序

sql执行的先后顺序,sql查询条件先后顺序

张世龙 05-12 18:03 74次浏览

SQL语句的执行顺序

查询语句的selectfromwheregroupbyhavingorderby执行顺序

1 .用于查询的关键字主要有六个,其顺序如下

选择---从--- where---- group by---having---order by

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

与sql语句的书写顺序不同,按以下顺序执行

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

from:需要从哪个数据表获取数据

where:筛选表中数据的条件

groupby:如何对上面过滤的数据进行分组

having:过滤上述分组数据的条件

select:显示结果集中哪个列或列的计算结果

orderby:按什么顺序显示返回的数据

2.from后面的表关联从右向左分析

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

也就是说,在编写SQL语句时,通过将数据量尽可能多的表放在最右边进行关联,

将可以筛选大量数据的条件置于where语句的底部。

SQLSelect语句的完整执行顺序【从DBMS用户的角度】:

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

2、where子句根据指定条件过滤记录行;

3、groupby子句将数据分成多个组;

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

5、使用having子句筛选组;

6、计算所有公式

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

SQLSelect语句的执行步骤【从DBMS实现者的角度来看,这对我们的用户来说意义不大】:

1 )语法分析,分析句子语法是否符合规范,测定句子中各式的含义。

2 )语义分析检查语句中是否存在所有数据库对象,以及用户是否具有相应的权限。

3 )视图转换。 将与视图相关的查询语句转换为对相应基表的查询语句。

4 )将复杂SQL表达式转换为更简单的等效连接表达式的表达式转换。

5 )选择优化程序。 “执行计划”通常因优化程序而异

6 )选择连接方法。 ORACLE有三种连接方法,您可以为多表连接的ORACLE选择适当的连接方法。

7 )选择连接顺序,为多个表选择ORACLE要连接的一对表,然后选择两个表中的哪个表作为源数据表?

8 )选择数据搜索路径,根据上述条件选择合适的数据搜索路径。 例如,选择所有表搜索、使用索引或选择其他方法。

9 )执行《执行计划》。

from子句--执行顺序从后向前,从右向左

表名(最后面的表称为驱动表,执行顺序从后向前,所以数据量少的表尽量放在后面) )。

oracle解析器按从右到左的顺序处理,首先处理FROM子句中的表名,然后处理FROM子句中最后写的表(基础表驱动表)。 也就是说,如果最后一个表是驱动表,而FROM子句包含多个表,则必须选择记录最少的表作为基础表。 如果存在三个或多个表连接查询,则必须选择“交叉表”(intersectiontable )作为基础表。 交叉表是指其他表引用的表

对于多表连接,请使用表的别名并将别名前缀到每个列。 可以缩短分析时间,减少由Column歧义引起的语法错误。

where子句--执行顺序从下到上,从右到左

ORACLE自下而上地按从右到左的顺序分析Where子句。 根据这一原理,表之间的连接必须写在其他Where条件之前,而能够过滤最大数量记录的条件必须写在Where子句的末尾。

groupby--执行顺序从左到右分组

GROUPBY语句的效率可以通过在GROUPBY之前过滤不需要的记录来实现。 也就是说,在GROUPBY之前使用WHERE进行思考,在GROUPBY之后避免HAVING过滤。

having子句----消耗资源,尽量不使用

请勿使用HAVING子句。 HAVING在搜索所有记录后过滤结果集。 此处理需要排序、汇总等操作。

如果可以在Where子句中在GROUPBY之前限制记录的数量,则可以减少这方面的开销

可以为on、where和having三个条件的子句(在非oracle中)中,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子句--执行顺序为从左到右排序,很耗资源

关闭firewalld,firewalld详解 sql里面and和or的优先级,java线程优先级设置