Oracle-DQL 6- 子查询
子查询:
--查询emp表中工资高于allen的员工信息
SELECT sal FROM emp
WHERE ename = 'ALLEN';
SELECT * FROM emp
WHERE sal > 1600;
--当查询的条件不是客观条件,而是表中的数据,并且不关心具体的数据是多少时,使用子查询
--子查询就是查询语句的嵌套,将子查询的结果作为主查询的条件
--子查询必须用括号括起来表示运算顺序,子查询最好单独作为一行编写
--习惯上将子查询写在比较运算符的右边
SELECT * FROM emp
WHERE sal >
(SELECT sal FROM emp WHERE ename = 'ALLEN');
--主查询中的条件和子查询的结果数据类型必须一致
--主查询中的条件和子查询的结果应该是同一意义的数据
1.单行子查询
--子查询的结果是一个数据时
--查询跟allen的部门和职位都相同的员工信息
SELECT * FROM emp
WHERE deptno =
(SELECT deptno FROM emp WHERE ename = 'ALLEN')
AND job =
(SELECT job FROM emp WHERE ename = 'ALLEN');
--子查询的数据跟主查询可以不在同一张表
--查询allen所在的部门名称
1)多表查询
SELECT d.dname
FROM emp e,dept d
WHERE e.deptno = d.deptno
AND e.ename = 'ALLEN';
--多表查询在笛卡尔结果中查询满足条件的数据,在14*4=56条数据中进行比对
2)子查询
SELECT dname FROM dept
WHERE deptno =
(SELECT deptno FROM emp WHERE ename = 'ALLEN');
--先通过allen的名字找到deptno,在emp表中找了14次
--通过deptno找dname,在dept表中找了4次
--最终查找了14+4=18次
--如果查询结果中的数据来自多张表,只能用多表查询
--如果查询结果中的数据来自一张表,只是用到了另一张表的数据作为条件
--可以用多表查询,也可以用子查询,推荐使用子查询
--子查询通常比多表查询效率高
--子查询中可以包含分组函数
--查询emp表中工资最高的员工名字
SELECT ename FROM emp
WHERE sal =
(SELECT MAX(sal) FROM emp);
--having 中也可以包含子查询
--查询人数比10号部门多的部门编号
SELECT deptno FROM emp
GROUP BY deptno
HAVING COUNT(*) >
(SELECT COUNT(*) FROM emp
WHERE deptno = 10);
2.多行子查询
--子查询的结果是多行数据时,使用多行子查询
--多行子查询必须使用多行比较运算符
--in 匹配多个值
--查询人数比10号部门多的部门名称
SELECT dname FROM dept
WHERE deptno IN
(SELECT deptno FROM emp
GROUP BY deptno
HAVING COUNT(*) >
(SELECT COUNT(*) FROM emp
WHERE deptno = 10));
--any, 满足任意一个条件就能返回结果
--查找工资比任意一个部门平均工资高的员工
SELECT * FROM emp
WHERE sal > ANY
(SELECT AVG(sal) FROM emp GROUP BY deptno);
--大于 any 表示大于最小值,小于 any 表示小于最大值
--all,满足所有条件才能返回结果
SELECT * FROM emp
WHERE sal > ALL
(SELECT AVG(sal) FROM emp GROUP BY deptno);
--大于 all 表示大于最大值,小于 all 表示小于最小值
3.多列子查询
--子查询返回的结果是多列数据
--in
--查询跟allen的部门和职位都相同的员工信息
SELECT * FROM emp
WHERE (deptno,job) IN
(SELECT deptno,job FROM emp WHERE ename = 'ALLEN');
4.分页子查询
--可以将子查询的结果看作一张表,再进行查询
SELECT ename,sal FROM
(SELECT ename,job,sal,deptno FROM emp
WHERE sal > 1500)
WHERE deptno = 30;
--rownum,是系统自动分配给查询结果的行号
--rownum不是真正的数据,只能从1开始,如果匹配的范围不是从1开始则返回空结果
--查询emp表中工资排名前三的员工信息
--先根据工资进行降序排列,找到这个结果中前三行数据
SELECT * FROM
(SELECT * FROM emp
ORDER BY sal DESC)
WHERE ROWNUM <= 3;
--查询emp表中工资排名3到5位的员工信息
--先根据工资进行降序排列,将rownum转换成真正的一列,在用这一列进行条件限定
SELECT * FROM emp
WHERE sal IN
(SELECT sal FROM
(SELECT ROWNUM rn,sal FROM
(SELECT sal FROM emp
ORDER BY sal DESC))
WHERE rn BETWEEN 3 AND 5);
【作业】
1.使用子查询,找出哪个部门下没有员工
SELECT * FROM dept
WHERE deptno NOT IN
(SELECT deptno FROM emp);
--distinct 去重
SELECT * FROM dept
WHERE deptno NOT IN
(SELECT DISTINCT deptno FROM emp);
2.使用子查询,列出薪金比“ALLEN”多的所有员工
SELECT * FROM emp
WHERE sal >
(SELECT sal FROM emp WHERE ename = 'ALLEN');
3.使用子查询,列出在销售部(SALES)工作的员工信息
SELECT * FROM emp
WHERE deptno =
(SELECT deptno FROM dept WHERE dname = 'SALES');
4.使用子查询,找出那些工资低于平均工资的员工
SELECT * FROM emp
WHERE sal <
(SELECT AVG(sal) FROM emp);
5.使用子查询,找出那些工资低于任意一个部门的平均工资的员工
SELECT * FROM emp
WHERE sal < ANY
(SELECT AVG(sal) FROM emp GROUP BY deptno);
6.使用sql语句查出各个部门工资最高的员工的部门编号、员工姓名及其工资的信息
SELECT deptno,ename,sal FROM emp
WHERE (deptno,sal) IN
(SELECT deptno,MAX(sal) FROM emp GROUP BY deptno);
7.列出所有部门的相应信息和部门人数,没有员工的部门则部门人数显示为0
1)多表查询
SELECT d.*,COUNT(e.empno)
FROM dept d,emp e
WHERE d.deptno = e.deptno(+)
GROUP BY d.deptno,d.dname,d.loc
ORDER BY d.deptno;
2)子查询
--先使用子查询构造出一张满足查询条件的表,然后和其他表进行多表查询
SELECT deptno,COUNT(empno) FROM emp
GROUP BY deptno;
SELECT d.*,NVL(c.ct,0)
FROM dept d,
(SELECT deptno,COUNT(empno) ct FROM emp
GROUP BY deptno) c
WHERE d.deptno = c.deptno(+);
SELECT ename FROM emp
WHERE deptno = 40;
SELECT AVG(sal) FROM emp
WHERE deptno = 40;
SELECT COUNT(ename) FROM emp
WHERE deptno = 40;
8.查询高于自己部门平均工资的员工名字,部门号,工资,平均工资(保留2位小数)
SELECT deptno,AVG(sal) asal FROM emp
GROUP BY deptno;
SELECT e.ename,e.deptno,e.sal,ROUND(a.asal,2)
FROM emp e,
(SELECT deptno,AVG(sal) asal FROM emp
GROUP BY deptno) a
WHERE e.deptno = a.deptno
AND e.sal > a.asal
ORDER BY e.deptno;
9.查询入职日期排名后3位的员工信息
SELECT * FROM
(SELECT * FROM emp
ORDER BY hiredate DESC)
WHERE ROWNUM <= 3;
Oracle-DQL 6- 子查询的更多相关文章
- Oracle02——oracle分页、子查询、集合运算、处理数据、创建和管理表和其他数据库对象
作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7289451.html --oracle分页(Pageing Query) select ...
- Oracle DB 使用子查询来解决查询
• 定义子查询 • 描述子查询可以解决的问题类型 • 列出子查询的类型 • 编写单行和多行子查询 • 子查询:类型.语法和准则 • 单行子查询: – 子查询中的组函数 – 带有子查询的HAVING ...
- Oracle with重用子查询
--with 重用子查询对于多次使用相同子查询的复杂查询语句来说,用户可能会将查询语句分成两条语句执行.第一条语句将子查询结果存放到临时表,第二条查询语句使用临时表处理数据.从 Oracle 9i 开 ...
- 彻底搞懂oracle的标量子查询
oracle标量子查询和自己定义函数有时用起来比較方便,并且开发者也常常使用.数据量小还无所谓.数据量大,往往存在性能问题. 下面測试帮助大家彻底搞懂标量子查询. SQL> create tab ...
- oracle ORA-01427: 单行子查询返回多个行
ORA-01427: 单行子查询返回多个行 前几天开发的同事反馈一个问题,说前台系统报出了ORA错误,希望我们能看看是什么原因.java.sql.SQLException: ORA-01427: si ...
- Oracle篇 之 子查询
子查询:先执行内部再外部 Select last_name,salary,dept_id From s_emp Where dept_id in ( Select dept_id From s_emp ...
- oracle数据库之子查询
子查询也叫内部查询,在主查询之前执行一次并得到结果,此结果一般情况下,是用来当做是主查询的条件. -- 在 emp 表中,找出工资比 ALLEN 的高? -- 先查出 ALLEN 的工资是多少? ...
- Oracle系列七 子查询
子查询语法 SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table); 子查询 (内查询) 在 ...
- MySQL中的DML、DQL和子查询
一.MySQL中的DML语句 1.使用insert插入数据记录: INSERT INTO `myschool`.`student` (`studentNo`, `loginPwd`, `student ...
- oracle查询优化之子查询条件优化
环境:oracle 11g 现有a表与b表通过a01字段关联,要查询出a表的数据在b表没有数据的数据:sql如下 ) ) 因为flag是虚拟字段没有走不了索引导致这条sql执行起来特别慢 310W条数 ...
随机推荐
- Codeforces Round #369 (Div. 2) C 基本dp+暴力
C. Coloring Trees time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- Java 面试题 三 <JavaWeb应用调优线程池 JVM原理及调优>
1.Java Web应用调优线程池 不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文由浅入深,介 ...
- python-解决pip安装速度慢的问题--豆瓣镜像
https://www.cnblogs.com/ZhangRuoXu/p/6370107.html https://blog.csdn.net/tianguiyuyu/article/details/ ...
- 阿里云Ubuntu安装LNMP环境之PHP7
在QQ群很多朋友问阿里云服务器怎么安装LNMP环境,怎么把项目放到服务器上面去,在这里,我就从头开始教大家怎么在阿里云服务器安装LNMP环境. 在这之前,我们先要知道什么是LNMP. L: 表示的是L ...
- Ant环境搭建
1.上传安装包到linux服务器 2.解压缩 tar zxvf apache-ant-1.10.1-bin.tar.gz 3.修改环境变量 vim /etc/profile 添加以下内容 expor ...
- ARTS打卡计划第十一周
Algorithms: https://leetcode-cn.com/problems/linked-list-cycle/ 链表环. Review: “What I learned from do ...
- FFmpeg之Linux下编译与调试
注:下面的一切都是在 root 模式下进行的,可以不再 root 模式下进行 1. 安装linux的基础环境 基础环境就是编译代码的基础库,Ubuntu联网安装软件很简单,一个语句即可搞定,这里列出语 ...
- 9Patch图
NinePatch是一种很有用的PNG图片格式,它可以在特定区域随文字大小进行缩放. - 上边线控制水平拉伸- 左边线控制竖直拉伸- 右边线和下边线控制内容区域 如下: 背景图片的中间区域会随着文字的 ...
- visible,invisible和GONE的区别
在Android开发中,大部分控件都有visibility这个属性,其属性有3个分别为“visible ”.“invisible”.“gone”.主要用来设置控制控件的显示和隐藏.有些人可能会疑惑In ...
- 使用AWS、Docker与Rancher提供弹性的生产级服务
2017-07-26 开始想你的 RancherLabs AWS Summit 2017 Beijing已经圆满落幕啦!亚马逊公司首席技术官沃纳·威格尔博士莅临现场,分享 AWS 最新云解决方案,把握 ...