子查询,即一个select语句中嵌套了另外的一个或者多个select语句
例如:
查询工资比Smith工资高的员工信息
第一步:查询Smith的工资数
select salary
from s_emp
where last_name='Smith';
结果:
SALARY
----------
940
第二步:查询工资比940高的员工信息
select last_name,salary
from s_emp
where salary>940;
第三步:把第二步中的数字940替换成第一步中的sql语句即可(注意格式)
select last_name,salary
from s_emp
where salary>(
select salary
from s_emp
where last_name='Smith'
);
例如:
查询所有部门的平均工资
select dept_id,avg(salary)
from s_emp
group by dept_id;
结果:
DEPT_ID AVG(SALARY)
---------- -----------
42 1081.66667
43 900
34 1160
44 1050
31 1400
32 1490
35 1450
50 2025
41 1247.5
45 1089
33 1515
DEPT_ID AVG(SALARY)
---------- -----------
10 1450
查询平均工资比1247.5高的部门编号
select dept_id
from s_emp
group by dept_id
having avg(salary)>1247.5;
结果:
DEPT_ID
----------
31
32
35
50
33
10
查询平均工资比1247.5高的部门中员工信息
select last_name,salary,dept_id
from s_emp
where dept_id in(10,31,32,33,35,50);
等价于
select last_name,salary,dept_id
from s_emp
where dept_id in(
select dept_id
from s_emp
group by dept_id
having avg(salary)>1247.5
);
查询平均工资比 41号部门的平均工资 高 的部门中员工的信息
select avg(salary)
from s_emp
where dept_id=41;
结果:
AVG(SALARY)
-----------
1247.5
所以这个sql语句和1247.5是等价的,那么就可以将上面sql语句中的1247.5给替换了
select last_name,salary,dept_id
from s_emp
where dept_id in(
select dept_id
from s_emp
group by dept_id
having avg(salary)>1247.5
);
替换后为:
select last_name,salary,dept_id
from s_emp
where dept_id in(
select dept_id
from s_emp
group by dept_id
having avg(salary)>(
select avg(salary)
from s_emp
where dept_id=41
)
);
练习:
注意:(可以把子查询的结果作为一张表来使用)
查询平均工资比 41号部门的平均工资 高的部门中员工的信息,并且显示出当前部门的平均工资
查询平均工资比 41号部门的平均工资 高的部门中员工的信息,并且显示出当前部门的平均工资,同时显示出部门的名字
查询员工信息,这些员工的工资要比自己所在部门的平均工资高
查询员工信息,这些员工的工资要比自己所在部门的平均工资高,同时显示部门的名称以及所在地区
查询工资比 Ngao所在部门平均工资 要高的员工信息,
同时这个员工所在部门的平均工资 也要 比Ngao所在部门的平均工资要高
查询工资比 Ngao所在部门平均工资 要高的员工信息,同时这个员工所在部门的平均工资 也要 比Ngao所在部门的平均工资要高,显示当前部门的平均工资
查询工资比 Ngao所在部门平均工资 要高的员工信息,同时这个员工所在部门的平均工资 也要 比Ngao所在部门的平均工资要高,显示当前部门的平均工资以及部门的名字和所在地区