子查询
多列子查询
上篇笔记讲的单行子查询是指子查询只返回单列、单行数据;多行子查询是指返回单列多行数据,都是针对单列而言。而多列子查询是指查询返回多个列数据的子查询。
查询与 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 种最差。
今天笔记做到这,后续有空继续。
网友评论