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 日期格式,该日期将由指 ...
随机推荐
- Codeforces Round #341 (Div. 2) D. Rat Kwesh and Cheese 数学
D. Rat Kwesh and Cheese 题目连接: http://www.codeforces.com/contest/621/problem/D Description Wet Shark ...
- [典型漏洞分享]YS的防暴力破解设计存在缺陷
YS使用的防暴力破解机制存在缺陷,该缺陷可被用于暴力破解其它用户密码[高] 问题描述: YS在用户登录页面设置了验证码机制,当用户输入密码错误次数达到3次时,再次登录需要验证码以防止攻击者进行暴力破解 ...
- java gzip压缩与解压
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOExceptio ...
- TStringList的DelimitedText的空格问题
TStringList的DelimitedText的空格问题 如果DelimitedText的字符串中有空格,TStringList遇到空格会进行自动换行,而这显然不是我们想要的结果.经测试发现D7~ ...
- Android Context作为参数传递this
来自:http://blog.csdn.net/sswmjoy/article/details/46119285将弹出框作为函数封装后参数为Context,供其他的类调用时,将this作为参数传入,总 ...
- Spring @Autowired 注解不生效
@Autowired默认不生效.为了生效,需要在xml配置:<context:annotation-config> 注解一<context:component-scan base-p ...
- 18.并发类容器MQ
package demo7.MQ; public class QueueData { private int id; private String name; private String taskC ...
- java界面编程(3) ------ 控制布局
本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 在java 中,组件放置在窗口上的方式可能与其它的GUI系统都不同样.首先,它全 ...
- delphi Align属性
---------------------------------------------- -
- flask restful修改头部信息
有两种方式,第一种是使用make_response from flask import make_response def test(): resp = make_response('test', c ...