子查询就是嵌套查询,即SELECT语句中包含SELECT语句,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。
子查询出现的位置:
- Where子句中,作为条件存在;
- from后,作为表存在(多行多列)。
下面我们通过几个练习题来了解子查询,如下所示:
(1)查询emp表中,工资最高的员工的详细信息,如图1-1所示:
图1-1 查询员工信息
图1-1中,查询语句是:select * from emp where sal=MAX(sal),看上去这条sql语句没有什么问题,但是执行的时候却报错了。原因是where子句后面不能使用聚合函数,为了解决这个问题,我们可以使用子查询。
(2)首先查询出emp表中的最大工资,然后再查询工资等于最大工资的员工信息,如图1-2所示:
图1-2 子查询
图1-2中,查询语句是:select * from emp where sal=(select MAX(sal) from emp ),在where子句中嵌套了一个子查询语句。该子查询语句查询的是最大工资数。
以上子查询的位置是在where子句中,下面我们来了解子查询的位置出现在from关键字后面的情况,如下所示:
(3)查询30号部门的员工信息,如图1-3所示:
图1-3 子查询
在from后面使用子查询时,一定要为子查询指定别名,图1-3中,查询语句是:select * from (select * from emp where deptno=30) e,子查询的别名为e,可以理解为查询的结果就是一张表,然后再从这张表中查询信息。
图1-2中,子查询语句的查询结果是单行单列,图1-3中的子查询语句的查询结果是多行多列。根据子查询的查询结果有以下分类:
- 单行单列:这样的子查询通常用来做条件,如:select * from 表1 别名1 where 列1[=,>,<,>=,<=,!=] (select 列 from 表2 别名2 where 条件);
- 多行单列:这样的子查询通常也用来做条件,如:select * from 表1 别名1 where 列1[in,all,any] (select 列 from 表2 别名2 where 条件);
- 单行多列:这样的子查询通常也用来做条件,如:select * from 表1 别名1 where [列1,列2,…列n] in (select 列1,列2,…列n from 表2 别名2 where 条件);
- 多行多列:这样的子查询通常作为要查询的表,即放在from关键词后面,如:select * from 表1 别名1,(select…) 别名2 where 条件。
单行单列的子查询我们就不在演示,下面我们了解子查询的结果是多行单列的练习题,如下所示:
(4)查询大于30部门所有员工工资的员工信息,包含30部门员工,如图1-4所示:
图1-4 多行单列子查询
图1-4的查询语句是:select * from emp where sal>all(select sal from emp where deptno=30),其中子查询语句:select * from emp where deptno =30的结果是30部门所有员工的工资,是一个多行单列的结果集,查询语句的含义是大于子查询结果集中的所有的工资值,all关键字就是所有的意思,那么只要员工的工资大于30部门员工的最大工资就符合查询条件。
(5)查询大于30部门任意一个员工工资的员工信息,包含30部门员工,如图1-5所示:
图1-5 多行单列子查询
图1-5中查询语句是:select * from emp where sal>any(select sal from emp where deptno=30),子查询还是查询30部门的所有员工工资,where条件子句代表查询员工工资大于30部门员工的最小工资的员工信息,any表示任意一个。
以上是多行单列的子查询,下面我们来了解单行多列的子查询,如下所示:
(6)查询与名称为殷天正的员工的工作,部门以及工资相同的员工信息,如图1-6所示:
图1-6 单行多列子查询
图1-1中,查询语句是:select * from emp where (job,deptno,sal) in (select job,deptno,sal from emp where ename=’殷天正’),子查询是查询殷天正的工作,部门以及工资。where条件字句表示查询job,deptno以及sal同时与殷天正的工作,部门,工资相同的员工。
当子查询的查询结果是多行多列时,我们就可以把它当成是一个表,将它放在from关键词后面,这里我们就不在进行演示。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/253228.html