oracl数据库(子查询)

子查询
子查询=简单查询+限定查询+多表查询+统计查询的综合体
多表查询性能差,替代方案:子查询,所谓的子查询指的就是在一个查询之中嵌套了其他的若干查询,嵌套子查询之后的查询sql语句如下:
select [distinct]*|分组字段 [别名] [,分组字段2 [别名]],...] |统计函数,(
select [distinct]*|分组字段 [别名] [,分组字段2 [别名]],...] |统计函数
from 表名称 [别名], [表名称 [别名],...]
[where 条件(s)]
[group by 分组字段1[,分组字段2,...]]
[having 分组后的过滤条件(可以使用统计函数)]
[order by 排序字段 [asc|desc]] [,排序字段 [asc|desc],...]];
)
from 表名称 [别名], [表名称 [别名],...]

实例:查询工资比Smith高的职员信息
select * from emp where sal>(select sal FROM emp where ename='SMITH');
如果选择子查询返回的是多行单列数据的话,这个时候就需要使用三种判断符判断: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子句中出现的查询,这个子查询一般返回的是多行多列的数据,当作一张临时表的方式来处理。
实例:
--查询出每个部门的编号、名称、位置、部门人数、平均工资
select deptno,dname,loc,count(empno),trunc(avg(sal))
from emp NATURAL JOIN dept
group by deptno,dname,loc

-- from 中使用子查询
select d.deptno, d.dname, d.loc,t.c,t.avg
from dept d,(select deptno,count(*) c,trunc(avg(sal)) avg from emp group by deptno) t
where d.deptno=t.deptno

-- 员工信息1页显示3个
-- 分页大小:3,页码:1
-- 第四页数据:>(pageNum-1)*pageSize <=pageNum*pageSize
select *
from (select rownum r,e.* from emp e where rownum <=4*3)
where r>3*3
总结:使用子查询的确比使用多表查询更加节省性能,所以开发之中子查询出现是最多的
大部分情况下,如果最终的查询结果之中需要出现select子句,但是又不能直接使用统计函数的时候,就在子查询中统计信息,即:有复杂统计的地方大部分都需要子查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值