Oracle学习(七)----查询Top—N问题 & 相关子查询
2016-03-30 00:03
585 查看
<pre name="code" class="plain">习题课一: 1:找到员工表中工资最高的员工的信息 方法一: SQL> select * from emp 2 where sal >= all(select sal from emp); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- 1 tom_abc 8000 10 方法二: SQL> select * from emp 2 where sal >= (select max(sal) from emp); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- 1 tom_abc 8000 10 2:找到员工表中工资最高的前三名员工的信息(需要用到rownum,不会因为我们的排序而变化,也就是说,他是内置的) 注: 1)rownum按照oracle的默认机制生成 2)rownum只能使用< / <= 号,不能使用 > / >= 号 以上两点与rownum的实现机制有关系:rownum返回集的行号(是一个属性,固话到一行中,不会因为排序而变化),没有第 一行就没有第二行...... SQL> ed 已写入 file afiedt.buf 1 select rownum, ename, sal from 2 (select ename, sal from emp order by sal desc) 3* where rownum <= 3 ------注:不能用>=号,没有一哪有二 SQL> / ROWNUM ENAME SAL ---------- ---------- ---------- 1 tom_abc 8000 2 KING 5000 3 SCOTT 3000 3:找到员工表中工资第五名到第八名员工的信息(处理a<b<c的情况) SQL> ed 已写入 file afiedt.buf 1 select r, ename, sal from 2 ( 3 select rownum r, ename, sal from -----将行幻化为实例, 中层 4 (select ename, sal from emp order by sal desc) ---- 最内层,将行号重新排序 5 where rownum <= 8 6 ) 7* where r >= 5 SQL> / R ENAME SAL ---------- ---------- ---------- 5 JONES 2975 6 BLAKE 2850 7 CLARK 2450 8 ALLEN 1600 =======oracle分页思想总结 (内层排序 外层选,需要三层查询) 内:排序。 中:使用rownum选择前n条;并给rownum指定一个别名,以供最外层过滤使用。 外:去掉前m条结果。 习题课二: 找到员工表中薪水大于本部门平均薪水的员工。 思路1:首先本部门,那么一定会有分组,并将此作为一个表结构 思路2:查找员工表和部门薪水表====>多表查询 思路3:等值条件连接 方法一: 1 select e.deptno, e.ename, e.job, e.sal, d.avgsal avgsal from emp e, 2 (select deptno, avg(sal) avgsal from emp group by deptno ) d 3 where e.deptno = d.deptno and e.sal > d.avgsal 4* order by 1 SQL> / DEPTNO ENAME JOB SAL AVGSAL ---------- ---------- --------- ---------- ---------- 10 tom_abc 8000 4187.5 10 KING PRESIDENT 5000 4187.5 20 JONES MANAGER 2975 2175 20 SCOTT ANALYST 3000 2175 20 FORD ANALYST 3000 2175 30 ALLEN SALESMAN 1600 1566.66667 30 BLAKE MANAGER 2850 1566.66667 方法二:相关子查询:主查询的参数,让子查询用,一般是通过别名 一般子查询:子查询的结果供主查询使用 1 select empno, ename, sal, (select avg(sal) from emp where deptno = e.deptno) salavg 2 from emp e 3 where sal > (select avg(sal) from emp where deptno = e.deptno) 4* order by 1 SQL> / EMPNO ENAME SAL SALAVG ---------- ---------- ---------- ---------- 1 tom_abc 8000 4187.5 7499 ALLEN 1600 1566.66667 7566 JONES 2975 2175 7698 BLAKE 2850 1566.66667 7788 SCOTT 3000 2175 7839 KING 5000 4187.5 7902 FORD 3000 2175 已选择7行。
相关文章推荐
- oracle 层次查询判断叶子和根节点
- PowerDesigner oracle 反向工程到cdm文件
- Oracle 排序中使用nulls first 或者nulls last 语法
- Oracle数据的导出与导入
- oracle 远程连接超时问题
- Oracle自定义聚集函数
- oracle数据库的备份与恢复
- 关于oracle分组后组外排序的问题
- Oracle 数据库类型和java 类型以及jdbc类型对照
- 40.Oracle深度学习笔记——全库备份常用
- 39.Oracle深度学习笔记——自动创建ASM UDEV设备脚本
- 38.Oracle深度学习笔记——OS下关闭连接进程脚本
- Oracle学习(六)----子查询
- Oracle SQL 经典查询练手第二篇
- Oracle 常见的SQL调优
- asp.net用npoi读取ecxel数据到oracle表
- 验证ORACLE不同字符集中汉字占用的byte及NLS_LENGTH_SEMANTICS参数的影响
- oracle中的char、varchar、varchar2、nvarchar、nvarchar2区别
- oracle聚簇表
- Centos6.5安装Oracle12c安装笔记