【转】SQL语句的条件执⾏顺序
我想请哪位⾼⼈分析⼀下以下⼏种SQL语句类型的执⾏顺序.SQL语句原型为;
1.select 列列表 from 表列表名/视图列表名 where 条件.
2.select 列列表 from 表列表名/视图列表名 where 条件 group by (列列表) having 条件
3.select 列列表 from 表列表名/视图列表名 where 条件 group by (列列表) having 条件 order by 列列表
4.select 列列表 from 表1 join 表2 on 表1.列1=表2.列1...join 表n  on 表n.列1=表(n-1).列1 where 表1.条件 and 表2.条件...表n.条件
exists子查询请问他们执⾏的时候顺序是怎样的呢?⽐如说第1条的意思是说:是先根据where条件从from表列表中选出满⾜条件的结果集,然后在从结果集中选出列列表中的列记录集
1. 先where 后select
2. 先where 再group 再having 后select
3. 先where 再group 再having 再select 后order
4. 先join  再where 后select
第⼆条是这样的,如果你提取的字段名⾥边包涵有count,sum函数,必须⽤group by 分组,having是给函数加条件,就等于⼆次过滤.
order by  是这样的,他是按照他后边的字段给排序
今天上午在开发的过程中,突然遇到⼀个问题,需要了解SQL语句的执⾏顺序才能继续,上⽹上查了⼀下相关的资料,现整理如下:
⼀、sql语句的执⾏步骤:
1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。
2)语义分析,检查语句中涉及的所有数据库对象是否存在,且⽤户有相应的权限。
3)视图转换,将涉及视图的查询语句转换为相应的对基表查询语句。
4)表达式转换,将复杂的 SQL 表达式转换为较简单的等效连接表达式。
5)选择优化器,不同的优化器⼀般产⽣不同的“执⾏计划”
6)选择连接⽅式, ORACLE 有三种连接⽅式,对多表连接 ORACLE 可选择适当的连接⽅式。
7)选择连接顺序,对多表连接 ORACLE 选择哪⼀对表先连接,选择这两表中哪个表做为源数据表。
8)选择数据的搜索路径,根据以上条件选择合适的数据搜索路径,如是选⽤全表搜索还是利⽤索引或是其他的⽅式。
9)运⾏“执⾏计划”
⼆、oracle 共享原理:
ORACLE将执⾏过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库⽤户共享当你执⾏⼀个SQL语句(有时被称为⼀个游标)时,如果它和之前的执⾏过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执⾏路径. 这个功能⼤⼤地提⾼了SQL的执⾏性能并节省了内存的使⽤
三、oracle 语句提⾼查询效率的⽅法:1: where column in(select * from ... where ...); 2:... where exists (select 'X' from ...where ...); 第⼆种格式要远⽐第⼀种格式的效率⾼。在Oracle中可以⼏乎将所有的IN操作符⼦查询改写为使⽤EXISTS的⼦查询使⽤EXIST,Oracle系统会⾸先检查主查询,然后运⾏⼦查询直到它到第⼀个匹配项,这就节省了时间 Oracle系统在执⾏IN⼦查询时,⾸先执⾏⼦查询,并将
获得的结果列表存放在在⼀个加了索引的临时表中避免使⽤having字句避免使⽤HAVING⼦句, HAVING 只会在检索出所有记录之后才对结果集进⾏过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE⼦句限制记录的数⽬,那就能减少这⽅⾯的开销
SQL Select语句完整的执⾏顺序:
1、from⼦句组装来⾃不同数据源的数据;
2、where⼦句基于指定的条件对记录⾏进⾏筛选;
3、group by⼦句将数据划分为多个分组;
4、使⽤聚集函数进⾏计算;
5、使⽤having⼦句筛选分组;
6、计算所有的表达式;
7、使⽤order by对结果集进⾏排序。