【转】oracle条件子句执行顺序

Oracle WHERE条件执行顺序:ORACLE采用自下而上的顺序解析WHERE子句

1、据此那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾
例如:SELECT … FROM EMP E WHERE SAL > 50000 AND JOB = ‘MANAGER’ AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);(低效)
     SELECT … FROM EMP E WHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO) AND SAL > 50000 AND JOB = ‘MANAGER’;(高效)
2、SELECT子句中避免使用'*'
当在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用'*'是一个方便的方法.可是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.
3、使用表的别名(Alias)
当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.

 

当一个查询语句同时出现了where、group by、having、order by的时候的执行和编写顺序
一般形式为
select 列a,聚合函数 from 表
where 过滤条件
group by 列a
group by子句与where结合使用时,where在前,group by 在后
当使用having子句对分组后的结果进行筛选,语法和where差不多
1、having只能用在group by之后,对分组后的结果进行筛选
2、where肯定在group by之前,即也在having之前
3、where条件里不允许使用聚合函数,having可以
当一个查询语句同时出现where、group by、having、order by的时候
1、执行where 对表筛选返回第1个结果集
2、对第1个结果集使用group by分组,返回第2个结果集
3、对第2个结果集中每组数据执行select,有几组就执行几次,返回第3个结果集
4、对第3个结果集执行having筛选,返回第4个结果集
5、对第4个结果集排序
example:
按由高到低的顺序显示平局分在70分以上的学生姓名和平均分,计算平均分前不包括60分以下的成绩,也不计算某某(xx)的成绩
分析:
1、显示学生姓名和平均分
select s_name,avg(score) from student
2、计算平均分前不包括60分以下的成绩,且不计算某某(xx)的成绩
where score>=60 and s_name!='xx'
3、显示个人平均分
group by s_name
4、显示平均分在70分以上
having avg(s_score)>=70
5、顺序由高到低
order by avg(s_score) desc

索引的使用
1、索引是单独的数据库对象,也需要被维护
2、索引可以提高查询速度,但会降低增删改的速度
3、通过一定的查询触发,并不是越多越好

 

转载:http://blog.csdn.net/cainiaowys/article/details/6652459
转载:http://wenku.baidu.com/view/d83707e981c758f5f61f67e0.html

posted @ 2013-10-26 11:47  Gnight  阅读(465)  评论(0编辑  收藏  举报