oracle 复杂的查找用法
【第一题】: 找到员工表中工资最高的前三名,要求按如下格式输出(第一步部分);以及oracle查询结果指定分页显示的方法(第二部分)。

——涉及Top-N分析问题。
一般不在子查询中使用order by, 但在Top-N分析问题中,必须使用order by
想将现有的表进行分页。1-4第一页,5-8第二页……
参考内容:
行号rownum(伪列)需要注意的问题:
1. rownum永远按照默认的顺序生成。
SQL> select rownum, empno, ename, sal from emp order by sal desc
——发现行号是跟着行走的。查询结果顺序变了,行号依然固定在原来的行上。行号始终使用默认顺序。
2.rownum只能使用<, <=符号,不能使用>,>=符号。
原因:与行号生成的机制有关:Oracle中的行号永远从1开始——取了1才能取2,取了2才能取3,<=8可以是因为1234567挨着取到,而>=5不行,因为没有1234,不能直接取5。
第一部分:输出图片的效果;
SQL> select rownum, empno, ename, sal
from (select *
from emp
order by sal desc)
where rownum <=3 第二部分,对查询的内容进行分页显示:
1-4为一页;
select rownum, empno, ename, sal
from (select * from emp
order by sal desc)
where rownum<=4 and rownum>=1
/
5-8为一页
select *
from (select rownum r, empno, ename, sal
from (select * from emp
order by sal desc)
where rownum<=8)
where r >= 5 关键是>=5 的获取问题,是不能直接写rownum>=5的。但是这条SQL语句查询的结果是一个新的“集合”,
该集合中有一列是专门表示行号,可以假想这列不再是伪列,而是该集合中专门用来表示行号的列。
所以,可以给该列取一个别名r,并把该查询语句整体作为子查询,放到另外一条SQL语句的from后。
【第二题】找到员工表中薪水大于本部门平均薪水的员工

采用两种方法:
第一种:一般子查询,使用自连接(多表查询的一种特殊情况)
与第一题一样,别名的特殊用法;可以从子查询中带出来,当作一个元素来使用。
一般子查询的的执行顺序:先执行子查询(内查询),再执行主查询(外查询),相关子查询除外
第二种:使用相关子查询()
概念:将主查询的某个值,当作参数传递给子查询。
一.一般子查询
1 select empno, e.deptno, ename, sal , d.davg
2 from emp e, (select deptno, avg(sal) davg
3 from emp
4 group by deptno) d
5 where e.deptno = d.deptno and e.sal > d.davg 二.相关子查询
select empno, e.deptno, ename, sal , (select avg(sal) from emp where deptno = e.deptno group by deptno) as "avg"
from emp e
where sal>(select avg(sal) from emp
where deptno = e.deptno)
【第三题】统计每年入职的员工个数:以下图的格式展现:已知员工的入职年份是---1980,1981, 1982,1987;
提示:该练习只考察函数的应用,注意调用关系。

——decode():第一个参数:待判断的值,条件,结果,条件,结果……最后是else的情况。
以图中的格式输出
select count(*) Total,
sum(decode(to_char(hiredate, 'yyyy'), '', 1, 0)) "1981",
sum(decode(to_char(hiredate, 'yyyy'), '', 1, 0)) "1980",
sum(decode(to_char(hiredate, 'yyyy'), '', 1, 0)) "1982",
sum(decode(to_char(hiredate, 'yyyy'), '', 1, 0)) "1987"
from emp; 如忽略输出格式:(即不是图中的输出格式:) select to_char(hiredate ,'yyyy') as "年份", count(*) as "人数"
from emp
group by to_char(hiredate ,'yyyy')
oracle 复杂的查找用法的更多相关文章
- oracle之to_char,to_date用法
[转载自]http://www.jb51.net/article/45591.htm 这篇文章主要介绍了oracle中to_date详细用法示例,包括期和字符转换函数用法.字符串和时间互转.求某天是星 ...
- oracle中to_date详细用法示例(oracle日期格式转换)
这篇文章主要介绍了oracle中to_date详细用法示例,包括期和字符转换函数用法.字符串和时间互转.求某天是星期几.两个日期间的天数.月份差等用法 TO_DATE格式(以时间:2007-11-02 ...
- Oracle to_date()函数的用法
Oracle to_date()函数的用法 to_date()是Oracle数据库函数的代表函数之一,下文对Oracle to_date()函数的几种用法作了详细的介绍说明,供您参考学习. 在Orac ...
- Oracle 中 decode 函数用法
Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...
- Oracle trunc()函数的用法
Oracle trunc()函数的用法 /**************日期********************/1.select trunc(sysdate) from dual --2013-0 ...
- Oracle中group by用法
Oracle中group by用法 在select 语句中可以使用group by 子句将行划分成较小的组,一旦使用分组后select操作的对象变为各个分组后的数据,使用聚组函数返回的是每一个组的汇总 ...
- oracle获取本月第一天和最后一天及Oracle trunc()函数的用法
select to_char(trunc(add_months(last_day(sysdate), -1) + 1), 'yyyy-mm-dd') "本月第一天", to_cha ...
- oracle正则表达式regexp_like的用法详解
oracle正则表达式regexp_like的用法详解 /*ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与IN ...
- Oracle trunc()函数的用法--来着心静禅定ing
1.TRUNC(for dates) TRUNC函数为指定元素而截去的日期值. 其具体的语法格式如下: TRUNC(date[,fmt]) 其中: date 一个日期值 fmt 日期格式,该日期将由指 ...
随机推荐
- mysql备份相关
1linux下mysql导出文件 备份mysql数据库的命令 mysqldump -h主机名 -u用户名 -p密码 数据库名字 > 备份的数据库名字.sql 例如:mysqldump -uro ...
- WPF中的动画——(五)关键帧动画
与 From/To/By 动画类似,关键帧动画以也可以以动画形式显示目标属性值. 和From/To/By 动画不同的是, From/To/By 动画只能控制在两个状态之间变化,而关键帧动画则可以在多个 ...
- JS的join方法
join() 方法用于把数组中的所有元素放入一个字符串. 元素是通过指定的分隔符进行分隔的. 例子 1 在本例中,我们将创建一个数组,然后把它的所有元素放入一个字符串: <script type ...
- jquery load 方法回显数据
使用jQuery对象.load()方法 load() 方法的作用是可以通过 AJAX 请求从服务器加载数据,并把返回的数据直接放置到指定的元素中. 该方法使用起来非常简单,大大简化了ajax开发 语法 ...
- easyui datagrid 表格动态隐藏部分列的展示
1.一套代码中,可能不同的项目情况都在用,但是可能不同的项目要求展示的datagrid列的内容并不一致,所以能够动态的显示部分datagrid列的内容. 即datagrid的中的某一列,这个项目要求显 ...
- juqery.fn.extend和jquery.extend
jquery.fn == jquery.prototype //true jquery.extend( obj1,obj2 ) 用一个或多个对象来拓展一个对象,返回拓展之后的对象 var aaa = ...
- 大气散射 Aerial Perspective
http://mathinfo.univ-reims.fr/IMG/pdf/PreethamSig2003CourseNotes.pdf https://blog.csdn.net/toughbro/ ...
- jquery元素节点操作
jquery元素节点操作 创建节点 var $div = $('<div>'); var $div2 = $('<div>这是一个div元素</div>'); 插入 ...
- 从项目上一个子查询扩展学习开来:mysql的查询、子查询及连接查询
上面这样的数据,想要的结果是:如果matchResult为2的话,代表是黑名单.同一个softId,version,pcInfoId的代表是同一个软件,需要去重:同时,如果相同软件里面只要有一个mat ...
- 从外部重置一个运行中consumer group的消费进度
对于0.10.1以上版本的kafka, 如何从外部重置一个运行中的consumer group的进度呢?比如有一个控制台,可以主动重置任意消费组的消费进度重置到12小时之前, 而用户的程序可以保持运行 ...