暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle子查询详解

Oracle微学堂 2019-04-30
1026

子查询

1
简单子查询

1.先于主查询执行。

2.主查询调用了子查询的结果。

3.注意列的个数和类型要匹配。

4.查询返回多行要用多行关系运算操作。

5.子查询要用括号括起来。


查询工资总和高于10号部门工资总和的部门。

select deptno,sum(sal)

from emp

group by deptno

having sum(sal)>(select sum(sal) from emp where deptno=10);

DEPTNO SUM(SAL)

------ ----------

30 9400

查询每个部门的最大工资是谁。

select deptno,ename,sal

from emp

where (deptno,sal) in (select deptno,max(sal) from emp group by deptno);

DEPTNO ENAME SAL

------ ---------- ----------

30 BLAKE 2850

10 KING 5000

20 FORD 3000

子查询返回多行,用=不可以,得用in。

子查询返回多列,所以对比的列也要匹配。


Any 和all操作

SQL> select ename,sal from emp where sal<any(1000,2000);

ENAME SAL

---------- ----------

SMITH 800

ALLEN 1600

WARD 1250

MARTIN 1250

TURNER 1500

JAMES 950

MILLER 1300

7 rows selected.

小于2000就可以

SQL> select ename,sal from emp where sal<all(1000,2000);

ENAME SAL

---------- ----------

SMITH 800

JAMES 950

必须小于1000


小于all小于最小,大于all大于最大

SQL> select ename,sal,deptno from emp

2 where sal<all(select avg(sal) from emp group by deptno);

ENAME SAL DEPTNO

---------- ---------- ------

SMITH 800 20

WARD 1250 30

MARTIN 1250 30

TURNER 1500 30

JAMES 950 30

MILLER 1300 10

小于any小于最大,大于any大于最小

select ename,sal,deptno from emp

where sal>any(select avg(sal) from emp group by deptno)

ENAME SAL DEPTNO

ALLEN 1600 30

JONES 2975 20

BLAKE 2850 30

CLARK 2450 10

KING 5000 10

FORD 3000 20

2
From子句中的子查询

查询工资大于本部门平均工资的员工。

select ename,e.deptno,sal,asal

from emp e,

(select deptno ,avg(sal) asal from emp group by deptno) a

where e.deptno=a.deptno and sal>asal;

A为视图,为什么要使用别名asal,因为表达式不能当列的名称,别名的本质使用方法是使非法的合法化。

ENAME DEPTNO SAL ASAL

---------- ------ ---------- ----------

BLAKE 30 2850 1566.66667

ALLEN 30 1600 1566.66667

FORD 20 3000 2258.33333

JONES 20 2975 2258.33333

KING 10 5000 2916.66667

3
相互关联的子查询

select ename,sal ,deptno

from emp o

where sal>(select avg(sal) from emp where deptno=o.deptno) ;

ENAME SAL DEPTNO

---------- ---------- ------

ALLEN 1600 30

JONES 2975 20

BLAKE 2850 30

KING 5000 10

FORD 3000 20

先运行主查询,得到第一行,将DEPTNO传入到子查询,由子查询求出AVG(SAL),在判定主查询的行是否符合查询的条件。

执行计划是将子查询看作视图的关联。这叫做SQL的自动改写。

4
Exists操作

select ename,empno,mgr from emp o

where exists(select 3 from emp where mgr=o.empno);

ENAME EMPNO MGR

---------- ---------- ----------

FORD 7902 7566

BLAKE 7698 7839

KING 7839

JONES 7566 7839

CLARK 7782 7839

找领导,其中3是常量,你写什么都可以。

当子查询有行时,Exists返回true

查到行后就不再继续查询

当子查询没有行时为假,Exists返回false

扫描二维码关注我的微学堂

搜索刘老师微信号:Rman-2014,备注“Oracle学习与咨询”,即可添加好友;或者扫描下面二维码,关注我的“微学堂”公众号,了解最新OCP认证动态、题库及答案解析、培训机构及讲师介绍、课堂授课内容等。每天还有一篇技术文章发布哦!



最后修改时间:2019-12-20 16:17:34
文章转载自Oracle微学堂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论