oracle 分组查询 子查询

本文介绍SQL分组查询与子查询的应用技巧,包括如何使用GROUP BY与HAVING子句进行高级数据筛选,以及如何利用子查询进行复杂条件判断。文章通过具体案例展示了非销售人员的工资统计、部门平均工资计算等实际应用场景。

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

分组查询

例:
统计平均工资大于2000的部门信息
-- 1.确定要查询的字段及表
select e.sal,d.deptno, d.dname, d.loc from emp e,dept d where e.deptno= d.deptno
-- 2.统计平均工资及部门信息
select avg(e.sal),d.deptno, d.dname, d.loc from emp e,dept d
where e.deptno= d.deptno group by d.deptno, d.dname, d.loc
-- 3.统计平均工资大于2000 的部门信息
select trunc(avg(e.sal)) avg,count(*) total,d.deptno, d.dname, d.loc from emp e,dept d
where e.deptno= d.deptno group by d.deptno, d.dname, d.loc
HAVING avg(e.sal)>2000

注意:where 和 having的区别
where: 是在执行group by 操作之前进行的过滤,表示从全部数据之中筛选出部分的数据
在where之中不能使用统计函数
having:是在group by 分组之后的再次过滤,可以在having子句中使用统计函数

查询语句顺序与电脑执行顺序:

综合练习 例:
--显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,
--并且要满足从事同一工作的雇员的月工资合计大于$5000,
--输出结果按月工资的合计升序排列:
select job,sum(sal) from emp where job<>'SALESMAN' group by job
having sum(sal)>5000
order by sum(sal)

子查询:
子查询=简单查询+限定查询+多表查询+统计查询的综合体
所谓的子查询指的就是在一个查询之中嵌套了其他的若干查询,嵌套子查询之后的查询SQL语句如下:


如果子查询返回的是多行单列数据的话,需要使用三种判断符: in、 any、 all
in操作符:用于指定一个子查询的判断范围
例:
select * from emp where sal in(select sal from emp where job='MANAGER')


any操作符:与每一个内容相匹配,有三种匹配形式
例:
-- 等于any 与in作用一样
select * from emp where sal=any(select sal from emp where job='MANAGER')

-- 大于any 比子查询中返回的最小结果要大
select * from emp where sal>any(select sal from emp where job='MANAGER')

-- 小于any 比子查询中返回的最大结果要小
select * from emp where sal<any(select sal from emp where job='MANAGER')

all操作符: 与每一个内容相匹配,有两种匹配形式
例:
-- 大于all 比子查询中返回的最大结果还要大
select * from emp where sal>all(select sal from emp where job='MANAGER')

-- 小于all 比子查询中返回的最小结果还要小
select * from emp where sal<all(select sal from emp where job='MANAGER')

from中的子查询
在from子句中出现的查询,这个子查询一般返回的是多行多列的数据,
当作一张临时表的方式来处理查询出每个部门的编号、名称、位置、部门人数、
平均工资通过子查询完成,所有的统计查询只能在group by中出现,所以在子
查询之中负责统计数据,而在外部的查询中,负责将统计数据和dept表数据相
统一
例:


子查询总结
大部分情况下,如果最终的查询结果之中需要出现select子句,但是又不能直接使用统计函数的时候
就在子查询中统计信息,即:有负责统计的地方大部分都需要子查询



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值