Oracle学习——Oracle的子查询——主查询、子查询

本文详细解析了Oracle数据库中子查询的使用方法,包括基本概念、语法结构及在不同SQL子句中的应用,通过具体实例展示了如何利用子查询进行复杂的数据筛选和分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle的子查询

何为子查询:子查询时嵌入在其他SQL语句中的SELECT语句,也称嵌套查询

举例:查询和SMITH是同一个职位的员工

//这是在where子句中使用子查询
		Select *
		From emp
		Where job = (select job 
		from emp
		where ename = ‘SMITH’);
//第一步 查询SMITH的职位
//第二步 查询和SMITH是同一个职位的员工

子查询语法

	SELECT  select_lis
	FROM  table
	WHERE  expr operator
					(SELECT  select_list
FROM  table);

可以使用子查询的位置: where, select, having, from

在select子句中使用子查询

举例:查询出每个部门的编号、名称、位置、部门人数。

Select deptno,dname,loc, (select count(empno) 
from emp
where emp.deptno = dept.deptno ) from dept;

在having子句中使用子查询

举例:查询员工信息表,按部门编号进行分组,要求显示员工的部门编号、平均工资,查询条件是平均工资大于30号部门的最高工资

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

在from子句中使用子查询:把子查询看成一张新的表

Select * from (select empno,ename,sal from emp);

举例:查询并显示高于部门平均工资的雇员信息

Select empno,ename,sal
 	From emp,(select deptno,avg(sal) avgsal from emp group by deptno) dept(别名)
	Where emp.deptno = dept.deptno and sal > avgsal;

主查询和子查询

简单来说括号里的就是子查询,也叫内查询

一个主查询可以有多个子查询

举例:显示职位和7521的职位相同并工资大于7934这个员工工资的员工信息

select *
from emp
where job = (select job from emp whereempno = 7521)
and sal > (select sal from emp where empno = 7934)

子查询的执行顺序:一般先执行子查询,再执行主查询,但相关子查询例外。

举例:查询员工表中小于平均工资的员工信息

Select *
	From emp
	Where sal < (select avg(sal) from emp);

相关子查询:当查询需要引用主查询的表列时,oracle会执行相关子查询相关子查询是先执行主查询,再执行子查询。

举例:查询工资高于部门平均工资的雇员名,工资和部门号。

Select ename,sal,deptno
	From emp e	//这里需要主查询给e.depeno传信息,所以会先执行主查询
	Where sal > (select avg(sal) from emp where deptno = e.deptno);

主查询和子查询可以不是同一张表

举例:查询部门名称是ACCOUNTING的员工信息

Select * 
	From emp
	Where deptno = (select deptno from dept where dname=’ACCOUNTING’);

用多表连接查询方法

Select * 
	From emp e,dept d
	Where e.deptno = d.deptno and d.dname=’ACCOUNTING’;

注意
尽量使用多表连接查询方法 因为只访问一次 子查询访问两次
这是理论上的,因为理论上不考虑笛卡尔集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值