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 日期格式,该日期将由指 ...
随机推荐
- [转]Java transient关键字
java 的transient关键字的作用是需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中. trans ...
- Implicit declaration of function 'CC_MD5' is invalid in C99
//导入这个就行了#import <CommonCrypto/CommonDigest.h> //没有导包的时候,提示如下: Implicit declaration of functio ...
- linux禁ping与限制ip登录
以root进入linux系统,然后编辑文件icmp_echo_ignore_allvi /proc/sys/net/ipv4/icmp_echo_ignore_all将其值改为1后为禁止PING将其值 ...
- NHibernate官方文档中文版--基础ORM(Basic O/R Mapping)
映射声明 对象/关系映射在XML文件中配置.mapping文件这样设计是为了使它可读性强并且可修改.mapping语言是以对象为中心,意味着mapping是围绕着持久化类声明来建立的,而不是围绕数据表 ...
- HDU 4631 Sad Love Story (2013多校3 1011题 平面最近点对+爆搞)
Sad Love Story Time Limit: 40000/20000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others ...
- c# 简单又好用的四舍五入方法
http://www.soaspx.com/dotnet/csharp/csharp_20100415_3809.html四舍五入是软件开发中经常遇到的问题,我也在不止一个项目中用到这方面的运算:关于 ...
- edittext 手机号、邮箱输入限制
package com.example.yanlei.myapplication; import android.support.v7.app.AppCompatActivity;import a ...
- 【mybatis】mybatis中放置IN查询拼接sql过长,IN查询进行分批次查询的处理
需要使用的切割list集合的工具类,链接:https://www.cnblogs.com/sxdcgaq8080/p/9376947.html 处理逻辑,原本的一个LIst,进行切割,循环进行myba ...
- jquery的一次点击实现
1.项目中需要实现一个需求,第一个点击的时候允许弹出dialog对象框,第二次不允许,除非重新刷新页面 2.在js的click事件中定义一个标签属性:相当于设置一个全局变量 var auclot= ' ...
- 用phonegap和jquery-mobile写android应用
今天纪录的是学习用phonegap和jquery-moblie来写android的过程.环境搭建. 我的习惯是直接上官网看文档,看get-started guide之类的文档.然后在看参考手册.然后就 ...