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;
两种方式那种方式好,子查询的主要目的是解决多表查询带来的性能问题。
复杂查询完成
简单查询+限定查询+多表查询+分组统计查询+子查询。
面试题目一般都是复杂查询