SQL优化

1.Oracle解析sql是从右至左的。

对于where condition1 and condition2 来说,只要有一个条件为false,就不会再去解析另一个条件,所以我们要把false的条件放在右边。

对于where condition1 or condition2  来说,只要有有一个条件为true,就不会再去解析另一个条件,所以我们要把true的条件放在右边。


2.在使用GROUP BY的时候,如果HAVING 和 WHERE都可以使用的情况下,先使用WHERE,再使用having

原因:如果一张表中有五千万条数据,需求是查询10号部门的员工并按照其职务分组,然后计算他们的平均工资。假设10号部门的员工只有50条记录,如果这时候我们先GROUP BY JOB(按照职务来分组)那么10号部门以外的员工也会进行按职务的分组操作,也就是说五千万条的数据都要进行分组操作,所以说性能是很低的。如果我们先用WHERE语句,选出部门为10的员工,即只有50条记录,然后再对这50条记录进行职位的分组操作,并计算其分组后的平均工资,这时效率将大大提高。

注意:当条件里需要用到组函数的情况,那么GROUP BY只能用HAVING来作为筛选条件的语句。WHERE子句中是绝对不能用组函数的。

例如:

--查询平均工资大于2000的部门信息
SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) >2000;

3.在查询的时候尽量使用列名(Oracle 9i之后,*和列名是一样的)

4.查询部门名称为SALES的员工信息(子查询和多表查询都能完成任务,理论上来说多表查询效率高,因为下面的子查询进行了两次查询,但也不排除oracle公司已经优化。)

方法一(子查询):

SELECT * FROM
EMP
WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='SALES')
方法二(多表查询):

SELECT * FROM
EMP E,DEPT D
WHERE E.DEPTNO=D.DEPTNO AND D.DNAME='SALES'

5.尽量不要使用集合运算.union这种

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值