带通配符(%)的like语句
当通配符在搜寻词首出现时,orale将不使用该字段的索引,但在词尾出现时还是会使用索引的
order by语句
任何在order by语句的非索引项或者有计算表达式都会降低查询速度
第一种格式是使用IN操作符
...where column in ( select * from ... where ... );
第二种格式是使用EXIST操作符
...where exists (select 'X' from ... where ... )
后者比前者数据快很多
select ... from emp where dept_no not in (select dept_no from dept where dept_cat='A')
select ... from emp E where not exists (select 'X' from dept D where E.dept_no=D.dept_no and d.dept_cat='A' )
<>操作符
不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描
a<>0改为a>0 or a<0
a<>'' 改为 a>''
select * from employee where salary<>3000;
select * from employee where salary<3000 or salary>3000;
第二种查询方案会比第一种查询方案更快些,第二种查询允许oracle对salary列使用索引,而第一种查询不能使用索引
如一个表有100万记录,一个数值字段A,30万记录的A=0,30万记录的A=1,
39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,
因为A>2时oracle会先找出为2的记录索引再进行比较,
而A>=3时oracle则直接找到=3的记录索引
union操作符
union在进行表链接后会筛选掉重复的记录
所以在不会产生重复记录的情况下使用 union all
select * from b_gs
union all
select * from b_ds
select子句中避免使用*,oracle在解析的过程中,会将*依次转换成所有的列名
使用decode函数来减少处理时间
使用decode函数可以避免重复扫描相同记录或重复连接相同的表
select count(*) ,sum(sal) from emp
where dept_no=0020 and ename like 'smith%'
select count(*),sum(sal) from emp
where dept_no=0030 and ename like 'smith%'
select count(decode(dept_no,0020,'X',null)) as D0020_count,
count(decode(dept_no,0030,'X',null)) as D0030_count,
sum(decode(dept_no,0020,sal,null)) as D0020_sum,
sum(decode(dept_no,0030,sal,null)) as D0030_sum
from emp where ename like 'smith%'