Oracle 学习笔记(八)

子查询

多列子查询

上篇笔记讲的单行子查询是指子查询只返回单列、单行数据;多行子查询是指返回单列多行数据,都是针对单列而言。而多列子查询是指查询返回多个列数据的子查询。 

查询与 SMITH 的部门和岗位完全相同的所有雇员

1、查询 SMITH 的部门和岗位

SELECT deptno, job FROM emp WHERE ename = 'SMITH'; 

2、查询与 SMITH 的部门和岗位完全相同的所有雇员

SELECT * FROM emp WHERE (deptno, job) = (SELECT deptno, job FROM emp WHERE ename = 'SMITH'); 

在 from 子句中使用子查询

查询高于自己部门平均工资的员工的信息 

1. 查出各个部门的平均工资和部门号

SELECT deptno, AVG(sal) mysal FROM emp GROUP by deptno; 

2. 把上面查询的结果看做是一张子表 

SELECT e.ename, e.deptno, e.sal, ds.mysal FROM emp e, (SELECT deptno, AVG(sal) mysal FROM emp GROUP by deptno) ds WHERE e.deptno = ds.deptno AND e.sal > ds.mysal; 

当在 from 子句中使用子查询时,该子查询会被作为一个视图来对待,因此叫做内嵌视图,当在from子句中使用子查询时,必须给子查询指定别名。(给表取别名的时候不能加 as,给列取别名可以加 as)  

分页查询

Oracle分页一共有三种方式 :

1.按 rowid 来分页

select * from t_test where rowid in (select rid from (select rownum rn, rid from(select rowid rid, cid from t_test order by cid desc) where rownum<1000) where rn>998) order by cid desc; 

2.按分析函数来分页

select * from (select t.*, row_number() over(order by cid desc) rk from t_test t) where rk<1000 and rk>998; 

3.按 rownum 来分页

select * from (select t.*,rownum rn from(select * from t_test order by cid desc)t where rownum<1000) where rn>998; 

感觉第 1 种效率最好,第 3 种次之,第 2 种最差。 

今天笔记做到这,后续有空继续。

你可能感兴趣的:(Oracle 学习笔记(八))