Oracle学习笔记(八)——子查询

Oracle学习笔记(八)——子查询

子查询就是在已有的查询里嵌套查询,在所有的地方都可以嵌套。
一个查询语句之中有可能嵌套多个子查询。
对于子查询的使用方法:

WHERE子句:子查询一般会返回单行单列,单行多列,多行单列
HAVING子句:子查询会返回单行单列数据,同时表示要使用统计函数
FROM子句:子查询返回多行多列数据(表结构)
SELECT子句:返回单行单列,不过一般不使用

1.在where子句中使用子查询(数据行的筛选操作)
范例:查询出低于公司平均工资的雇员信息

SELECT AVG(sal) FROM emp;
SELECT * FROM emp WHERE sal<(SELECT AVG(sal) FROM emp);

范例:与SCOTT从事同一工作,并且工资相同的雇员信息

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

如果查询的内容是多行单列的话就表示一个操作的数据范围
三个操作符:IN、ANY、ALL
1.1IN操作:与子查询返回的内容完全相同

SELECT * FROM emp WHERE sal IN(
SELECT sal FROM emp WHERE job='MANAGER');
SELECT * FROM emp WHERE sal NOT IN(
SELECT sal FROM emp WHERE job='MANAGER');

NOT IN 子查询不能返回空,如果子查询返回了空,最后不会有结果返回。

1.2ANY操作:分为三种形式
=ANY:与IN相同

SELECT * FROM emp WHERE sal =ANY(
SELECT sal FROM emp WHERE job='MANAGER');

.>ANY:大于最小值
.<ANY:小于最大值

1.3ALL操作:两种形式
.>ALL:大于最大值
.<ALL:小于最小值

2.在HAVING子句中使用子查询(单行单列,统计函数计算)
范例:查出高于公司平均工资的职位名称,职位人数以及平均工资

SELECT job,COUNT(empno),AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal)>(SELECT AVG(sal) FROM emp);

3.在SELECT子句中使用子查询(基本不用,行列转置)
范例:查询每个雇员的编号,姓名,职位,部门名称(多表查询)

SELECT e.job,e.ename,e.empno,
(SELECT d.dname FROM dept d WHERE d.deptno=e.deptno)	
FROM emp e;

尽量回避1+n次查询
4.在FROM子句中使用子查询(重点)
高效解决多表查询问题,如果子查询返回的结构是多行多列的数据,那么就相当于是一张临时表的形式,可以直接在FROM字句里面使用
范例:查询出每个部门的名称,位置,部门人数
多表查询实现(1400*400)

SELECT d.dname,d.loc,COUNT(e.empno)
FROM emp e,dept d
WHERE d.deptno=e.deptno
GROUP BY d.dname,d.loc;

子查询实现(最多400*400+400)

SELECT d.dname,d.loc,temp.count
FROM dept d,(
	SELECT deptno,COUNT(empno) count
	FROM emp
	GROUP BY deptno) temp
WHERE d.deptno=temp.deptno;

两种方式那种方式好,子查询的主要目的是解决多表查询带来的性能问题。

复杂查询完成
简单查询+限定查询+多表查询+分组统计查询+子查询。
面试题目一般都是复杂查询

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值