Oracle - 子查询、TOP - N
1 子查询
sql 中查询是可以嵌套的,一个查询的结果可以作为另外一个查询的条件、表。
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
理解子查询的关键在于把子查询当作一张表来看待,外层的语句可以把内嵌的子查询返回的结果当成一张表使用,子查询结果可以作为一个虚表被使用。注意,子查询要用括号括起来 。子查询根据其返回结果可以分为单行子查询和多行子查询。
1.1 单行子查询
当子查询有单行时,可以取单行中的一个字段形成单个值用于条件比较,特别是当子查询结果为单行单列时,可以当成一个值用于比较。
-- 查询雇员其薪资在雇员平均薪资以上的雇员
select *
from emp e
where e.sal > (select avg(e.sal) "AVGSAL" from emp e);
1.2 多行子查询
多行子查询返回的结果可以作为表使用,通常结合in、some/any、all、exists。
-- 查在雇员中有哪些人是管理者
select e.*
from emp e
where e.empno in (select distinct e.mgr
from emp e
where e.mgr is not null);
1.3 from 后的子查询
子查询结果可以作为一张续表用于from后。
-- 每个部门平均薪水的等级
select vt0.deptno,vt0.avgsal,sg.grade
from (select e.deptno,avg(e.sal) "AVGSAL"
from emp e
group by e.deptno) VT0, salgrade sg
where vt0.avgsal between sg.losal and sg.hisal;
2 TOP - N
在 Oracle 中和 mysql 不一样,没有 top 关键字,只能通过 rownum 属性作为筛选条件,实现取“前 N 个几个”。
rownum:表示对查询结果的数据集记录的编号,从1开始。
-- 查询前10名雇员
select e.*,rownum
from emp e
where rownum <= 10;
当我们要查询前 6 - 10 名雇员的时候就出现了问题。rownum 后面接 “<”、“<=”时不会出现问题,但取的第一个结果不是 rownum = 1 时,就会出现结果为空集的问题。例如 rownum >= 1 结果正常,但是 rownum > 1 为空集。可以这么理解,rownum 是对结果集进行编号,当程序执行where rownum > 1 时,把结果的第一行排除掉了,但是此时的结果集第一个记录 rownum 由 2 变成了 1,于是继续把这一条记录也剔除掉,以此类推,最后所有数据都被剔除了。
要解决这个问题,采取的方法时将 rownum 固定住,也就是将原表和 rownum 合成一个新表,新表上 rn 字段表示行数,在这个新表上再作判断。
--求薪水最高的第6到10名雇员
SELECT *
FROM (SELECT X.*, ROWNUM NUM
FROM (SELECT E.*
FROM EMP E
ORDER BY E.SAL DESC) X)
WHERE NUM BETWEEN 6 AND 10;
Oracle - 子查询、TOP - N的更多相关文章
- Oracle子查询相关内容(包含TOP-N查询和分页查询)
本节介绍Oracle子查询的相关内容: 实例用到的数据为oracle中scott用户下的emp员工表,dept部门表,数据如下: 一.子查询 1.概念:嵌入在一个查询中的另一个查询语句,也就是说一个查 ...
- oracle 子查询和组合函数
oracle 子查询和组合函数 --查询与"SCOTT"在同一个部门的员工 select empno,ename,deptno from emp where deptno in ( ...
- 一道Oracle子查询小练习
一道Oracle子查询小练习 昨天晚上躺在床上看Oracle(最近在学习这个),室友说出个题目让我试试.题目如下: 有如下表结构,请选择出成绩为前三名的人的信息(如果成绩相同,则算并列),表名为t ...
- Oracle 子查询
1.子查询在SELECT.UPDATE.DELETE语句内部可以出现SELECT语句.内部的SELECT语句结果可以作为外部语句中条件子句的一部分,也可以作为外部查询的临时表.子查询的类型有: ① 单 ...
- oracle 子查询因子化 浅谈(with的使用)
近来学习oracle,想要提高自己所写语句的效率和易读性,今天的笔记是关于子查询因子话这么一个东西 因子化的查询不一定可以提高效率,但是一定可以再提高程序的可读性方面成效显著 --with 语句 wi ...
- Oracle子查询之高级子查询
Oracle 高级子查询 高级子查询相对于简单子查询来说,返回的数据行不再是一列,而是多列数据. 1,多列子查询 主查询与子查询返回的多个列进行比较 查询与141号或174号员工的manager_id ...
- Oracle子查询之简单子查询
Oracle 简单子查询 顾名思义,简单子查询是嵌套在 SQL 语句中的另一个SELECT 语句,并且子查询只返回一列数据 1,单行子查询: 子查询 (内查询) 在主查询之前一次执行完成.子查询的结果 ...
- Oracle子查询和多表查询
多表查询需要用到表的连接 连接可以分为:(自行百度) 交叉连接(数字逻辑的笛卡尔积,不做解释) 等值连接 例如:select * from t_a, t_b where t_a.xx = t_b.xx ...
- Oracle 子查询(复杂select语句)
在执行数据操作时,如果某个操作需要依赖于另外一个 select语句的查询结果,那么就可以把 select 语句迁入到该操作语句中,这样就形成了一个子查询.实际应用中,表与表之间相互关联,相互依存,这样 ...
随机推荐
- I am coming..
It's so great to start the blog here since it's been a long time that I want to start such kind of l ...
- 快速掌握Python的捷径-Python基础前传(1)
文: jacky(朱元禄) 开文序 最近看新闻,发现高考都考Python了,随着人工智能的火热,学数据科学的人越来越多了!但对于数据行业本身来说,现象级的火热,这并不是什么好事. 方丈高楼平地起,无论 ...
- 决策树算法的Python实现—基于金融场景实操
决策树是最经常使用的数据挖掘算法,本次分享jacky带你深入浅出,走进决策树的世界 基本概念 决策树(Decision Tree) 它通过对训练样本的学习,并建立分类规则,然后依据分类规则,对新样本数 ...
- Lua unpack函数用法
unpack,接受一个table做个参数,然后按照下标返回数组的所有元素 unpack lua 版本 <= 5.1 local t = {nil , 3} retunrn unpack(t) / ...
- 【Redis 向Redis中批量导入mysql中的数据(亲自测试)】
转自:https://blog.csdn.net/kenianni/article/details/84910638 有改动,仅供个人学习 问题提出:缓存的冷启动问题 应用系统新版本上线,这时候 re ...
- centos7下面装fastdfs
首先我完全是按照这个链接上面来的,其中也算有点小错https://blog.csdn.net/ty5546/article/details/79245648 环境准备编译环境 yum install ...
- centos6.9实现双网卡绑定
1.创建bond0文件 # vi /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 NM_CONTROLLED=no #是否由networ ...
- js判断滚动条是否已到页面最底部或顶部实例
原文 本文实例讲述了js判断滚动条是否已到页面最底部或顶部的方法.分享给大家供大家参考.具体分析如下: 我们经常会看到很多的网站一个返回顶部效果就是当我们滚动条到指定位置时返回顶部出来了,否则就自动隐 ...
- OUC_TeamTraining_#1 720
D - The Mirror of Galadriel Time Limit:2000MS Memory Limit:0KB 64bit IO Format:%lld & %l ...
- CentOS linux7 磁盘分区
常用命令 df [选项] [文件] -a 显示全部文件系统 -h 方便阅读方式显示 -l 只显示本地文件系统 -T 显示文件系统类型 fdisk /dev/sda1