Oracle子查询

这里写目录标题

子查询

定义:一个查询语句中嵌套一个或多个查询语句,里层的查询语句的结果成为了外层查询语句的一部分。

外层的查询叫主查询

里层的查询叫子查询

子查询需要加括号

子查询的分类

1.非相关子查询

是指子查询部分,能单独运行,子查询不会牵扯主查询内容。主查询在乎的是子查询的结果。

根据子查询返回的结果不同,可以分为四种。

单行单列

SELECT AVG(sal) FROM emp;

例题:查询和SMITH在同一部门的员工信息。

SELECT * FROM emp WHERE deptno=(SELECT deptno FROM emp where ename='SMITH')

步骤:1.先写好主查询,子查询部分先用汉语表达,越清楚越好,如

SELECT * FROM emp WHERE deptno = (SMITH的部门编号)

2.写出子查询的查询,为了实现第一步中的汉语部分,查询结果列的个数,顺序,属性要和主查询条件列一致。

SELECT deptno FROM emp WHERE ename = 'SMITH'

3.将主查询和子查询结合。

SELECT * FROM emp WHERE deptno=(SELECT deptno FROM emp where ename='SMITH')

练习:查询和scott在同一岗位的员工信息

SELECT *FROM emp where job = (SELECT job FROM emp WHERE ename = 'SCOTT');

单行多列

不是很友好,用的不多

例题:查询和SOCTT在同一部门并且岗位也相同的员工信息。

SELECT * 
	FROM emp 
		WHERE (dept,job)=(SCOTT的部门和岗位)
--SCOTT的部门和岗位
SELECT deptno,job FROM emp WHERE ename = 'SCOTT';
--注意,查询的列的个数顺序属性要和主查询条件一致。
SELECT * 
	FROM emp 
		WHERE (deptno,job)=(
			SELECT deptno,job 
				FROM emp 
					WHERE ename = 'SCOTT')

练习:查询和scott或者king在同一部门并且同一岗位的员工信息

SELECT * FROM emp WHERE (deptno,job) in (SELECT deptno,job FROM emp WHERE ename in('SCOTT','KING'));

单列多行

把单列多行的查询结果看成一个集合

IN,ANY,ALL后面通常可以放结合

例题:查询和SMITH或者和KING在同一部门的员工信息

SELECT * FROM emp WHERE deptno IN (SELECT deptno FROM emp WHERE ename = 'SMITH' OR ename = 'KING');

练习:查询出emp表所有的领导信息。

SELECT * FROM emp WHERE empno in (SELECT  MGR FROM emp);

多行多列

子查询的结果相当于 一张表

大多数把多行多列的查询结果放在FROM关键字后面

例题:查询十号部门中最高的工资的员工。

SELECT ename,MAX(sal) FROM (SELECT sal,ename From emp WHERE deptno = 10 )

练习:查询所有部门中平均工资最高的部门编号

SELECT deptno FROM emp WHere (SELECT avg(sal) FROM emp GROUP by deptno )

习题:查询所有部门中平均工资最高的部门编号--把每个部门的平均工资当成表

方法1:
SELECT DEPTNO
  FROM (SELECT AVG(SAL) SAL, DEPTNO FROM EMP GROUP BY DEPTNO)
 WHERE SAL = (SELECT MAX(AVG(SAL)) SAL FROM EMP GROUP BY DEPTNO);
方法2:
SELECT DEPTNO, AVG(SAL)
  FROM EMP
 GROUP BY DEPTNO
HAVING AVG(SAL) = (SELECT MAX(SAL)
                     FROM (SELECT AVG(SAL) SAL, DEPTNO
                             FROM EMP
                            GROUP BY DEPTNO));

2.相关子查询

是指子查询不能单独运行,子查询会牵扯主查询的部分内容

主查询在乎的是与子查询的关系。

例题

查询员工的姓名岗位薪资部门编号以及对应的部门名称。

SELECT ename,job,deptno,(对应部门编号的部门名称) FROM emp;

SELECT ENAME,
               JOB,
               SAL,
               DEPTNO,
               (SELECT DNAME FROM DEPT B WHERE B.DEPTNO = A.DEPTNO)
          FROM EMP A;

练习:查询员工工资比该员工岗位平均薪资高的员工信息。

SELECT *
  FROM EMP A
 WHERE A.SAL >
       (SELECT AVG(SAL) FROM EMP B WHERE A.JOB = B.JOB GROUP BY JOB);
```
子查询不能放在GROUP BY后面,其余都可以。
相关子查询有点难度啊 上课没听懂改天学明白了再更新
相关推荐
Miqiuha4 分钟前
lock_guard和unique_lock学习总结
java·数据库·学习
一 乐1 小时前
学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
Java探秘者5 小时前
Maven下载、安装与环境配置详解:从零开始搭建高效Java开发环境
java·开发语言·数据库·spring boot·spring cloud·maven·idea
2301_786964365 小时前
3、练习常用的HBase Shell命令+HBase 常用的Java API 及应用实例
java·大数据·数据库·分布式·hbase
阿维的博客日记6 小时前
图文并茂解释水平分表,垂直分表,水平分库,垂直分库
数据库·分库分表
wrx繁星点点7 小时前
事务的四大特性(ACID)
java·开发语言·数据库
小小娥子7 小时前
Redis的基础认识与在ubuntu上的安装教程
java·数据库·redis·缓存
DieSnowK7 小时前
[Redis][集群][下]详细讲解
数据库·redis·分布式·缓存·集群·高可用·新手向
-XWB-8 小时前
【MySQL】数据目录迁移
数据库·mysql
老华带你飞8 小时前
公寓管理系统|SprinBoot+vue夕阳红公寓管理系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·spring boot·课程设计