Oracle子查询相关内容(包含TOP-N查询和分页查询)

摘要:
本节介绍Oracle子查询的相关内容:实例中使用的数据是Oracle中Scott用户下的empemployee表和dept部门表。数据如下:1。子查询1。概念:嵌入在查询中的另一个查询语句,即一个查询用作另一查询的条件,此查询称为子查询。示例4:查询30日平均工资大于部门最高工资的部门信息。总结了子查询的相关内容。如果有任何歧义,请给我更多的建议。

本节介绍Oracle子查询的相关内容:

实例用到的数据为oracle中scott用户下的emp员工表,dept部门表,数据如下:

Oracle子查询相关内容(包含TOP-N查询和分页查询)第1张Oracle子查询相关内容(包含TOP-N查询和分页查询)第2张

一、子查询

1、概念:嵌入在一个查询中的另一个查询语句,也就是说一个查询作为另一个查询的条件,这个查询称为子查询。

那么可以使用子查询的位置有select后面、from后面、where后面以及having后面。

2、分类:(1)单行子查询:查询结果只返回一行数据

      (2)多行子查询:查询结果返回多行数据,多行子查询的操作符有IN,ALL,ANY,具体用法实例中说明。

3、示例说明:

 Example1:查找每个部门的员工数量:

select deptno,dname,(select count(*) from emp e where e.deptno=d.deptno) amount from dept d;

Oracle子查询相关内容(包含TOP-N查询和分页查询)第3张

此处子查询位于select后面,是每个部门的员工总人数。

Example2:查找工资大于部门平均工资的员工

select ename,sal,e.deptno from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) m 
where e.deptno=m.deptno and e.sal>m.avgsal;

Oracle子查询相关内容(包含TOP-N查询和分页查询)第4张

此处子查询位于from后面,是每个部门的平均工资,将这个结果看做一张新表m,再加上查询条件即可。

Example3:查找和scott相同职位的员工信息

select * from emp where job=(select job from emp where ename='SCOTT');

Oracle子查询相关内容(包含TOP-N查询和分页查询)第5张

此处子查询位于where条件中,是和scott员工一样的职位。

Example4:查询部门平均工资大于30号部门最高工资的部门信息。

select deptno,avg(sal) from emp group by deptno having avg(sal)>(select max(sal) from emp where deptno=30);

Oracle子查询相关内容(包含TOP-N查询和分页查询)第6张

此处子查询位于having子句中,是30号部门的最高工资。

Example5:查询部门是开发部或销售部的员工信息

select * from emp where deptno in(select deptno from dept where dname='RESEARCH' or dname='SALES');

Oracle子查询相关内容(包含TOP-N查询和分页查询)第7张

此处用到了多行子查询的IN操作符用来获取RESEARCH和SALES部门的部门号,用来限制一个范围。

Example6:获取工资大于30号部门所有员工工资的信息。

select ename,sal,deptno from emp where sal>all(select sal from emp where deptno=30);

Oracle子查询相关内容(包含TOP-N查询和分页查询)第8张

此处用到了多行子查询中的ALL操作符,用于获取30号部门的所有工资信息,这里all起的主要作用是为了获得30号部门的最大工资,大于所有的意思就是大于最大的即可。

Example7:获取工资大于30号部门任意员工工资的信息。

select ename,sal,deptno from emp where sal>any(select sal from emp where deptno=30);

Oracle子查询相关内容(包含TOP-N查询和分页查询)第9张

此处用到了多行子查询中的any操作符,用于获取30号部门的工资信息,这里any的作用和all不同,主要取最小工资,任意就是说大于这些工资里面任意一个也就是大于最小的工资即可。

 二、oracle中TOP-N查询:

概念:用于获取一个查询中的前N条记录,需要借助rownum伪列来实现,rownum伪列,oracle为每个查询自动生成的伪列,物理上并不存在,查询中经常涉及多个表,但每个查询只有一列伪列。

Example:查找部门号为20和30的工资最高的5个员工信息

select * from (select * from emp where deptno in(20,30) order by sal desc) where rownum<=5;

Oracle子查询相关内容(包含TOP-N查询和分页查询)第10张

这里在from后加了一个子查询,那么有个问题出现了,为什么这里不直接写而是要引入一个子查询呢,先来看看不加的结果:

select * from emp e where e.deptno in(20,30) and rownum<=5 order by e.sal desc;

Oracle子查询相关内容(包含TOP-N查询和分页查询)第11张

很明显3000才是最高的工资,那是什么原因导致了这样的结果呢?是因为oracle中对select查询语句的执行顺序是先where条件后order by排序,也就是说先取了5行在对这5行进行排序,而正确的顺序应该是所有20,30部门的员工工资先进行排序在取5行

 三、Oracle分页查询的应用:

 概念:分页查询,顾名思义,控制查询结果的范围,得到我们想要的部分数据。

Example:获取员工表中20,30部门按工资降序以后的第4页也就是第7,8两条数据

select * from (select rownum rowline,emp1.* from (select * from emp where deptno in (20,30) 
order by sal) emp1 where rownum<=10) emp2 where emp2.rowline>=7 and emp2.rowline<=8;

Oracle子查询相关内容(包含TOP-N查询和分页查询)第12张

这里或许稍微有点复杂,首先为什么不这样写

select * from (select * from emp where deptno in(20,30) order by sal desc) where rownum>=7 and rownum<=8;

这个查询永远也不会有数据生成,为什么呢,因为当内层查询产生第一条记录时,oracle为其伪列赋值rownum=1,

外层查询判rownum>=7 and rownum<=8不符合条件去除记录,当第二条记录产生时,oracle仍然会为其伪列赋值rownum=1,

外层判断仍然不会通过,这样无论内层查询产生多少数据都会因为外层查询的条件不符合记录而流失数据。

而想要避免这样的情况发生,就需要将伪列当成一个查询中的字段,将它不在看做“伪列”,而是真正的一个字段,

这样就需要在外面在嵌套一层查询将伪列做成一个物理上存在的字段,而最后我们只需要将外层查询的条件改为内层查询中“真实”存在的伪列即可。

子查询的相关内容总结完毕,有不明处请多多指教。                                                                                           2018-08-13    15:51:41

免责声明:文章转载自《Oracle子查询相关内容(包含TOP-N查询和分页查询)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇漫谈 IP 协议linux下查看已经安装的jdk 并卸载jdk下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

oracle:重装操作系统后,如何利用原有oracle表空间文件还原数据库 挪威

说明: 原oracle安装目录,D:\oracle\ 备份oracle目录,   X:\oracle\ 步骤: 一、重装oracle,安装目录要与原来的安装目录相同,即为D:\oracle\ 二、创建数据库时,确保ORACLE_SID与原数据库相同,此处ORACLE_SID = ORACLE ,并且创建好表空间信息,也与原数据库相同     (如果表空间不...

REHL8 oracle 19C RAC安装一(环境准备)(更新前)

1.三台虚拟机 虚拟机的配置如下 [root@nymtx asm]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 local...

Oracle 11.2.0.4 For Windows 64bit+32bit 数据库

转自 https://www.cnblogs.com/ShaYeBlog/p/7729714.html1.Oracle11G 32BIT介质官方链接适用于Windows 32bit的Oracle Database 11G 第2版U4(11.2.0.4)Oracle11.2.0.4 Windows32BIT介质盘https://updates.oracle....

细聊Oracle通过ODBC数据源连接SQL Server数据库

    类似文章搜索引擎上有很多,内容大致相同,今天所谓细聊是因为我在借鉴这些文章时候走了些弯路,所以写此文,为自己备忘,同时如果能为初涉此处知识点的小伙伴提供些帮助就更好了,文章结尾处的一些扩展有一定实战意义,废话不多说。     我的应用场景:     项目系统使用oracle数据库,与客户的第三方系统供应商实现资源共享,对方为sql server数据...

WebRTC学习(三)WebRTC设备管理

一:WebRTC设备管理 (一)重要API,用于获取音视频设备 其中返回的ePromise结果,是一个Promise对象。 Promise对象的结构体:MediaDevicesInfo  deviceID:是设备唯一标识符ID label:是设备的名字(可读的) kind:设备的种类(音频输入/输出两种,视频输入/输出两类) groupID:同一个设备...

转:ORACLE的JDBC连接方式:OCI和THIN

oracle的jdbc连接方式:oci和thin     oci和thin是Oracle提供的两套Java访问Oracle数据库方式。     thin是一种瘦客户端的连接方式,即采用这种连接方式不需要安装oracle客户端,只要求classpath中包含jdbc驱动的jar包就行。thin就是纯粹用Java写的ORACLE数据库访问接口。oci是一种胖客...