子查询
出现在其他语句中的select语句,称为子查询或内查询
分类
按结果集的行列数不同:
关键词 | 含义 |
---|---|
标量子查询 | 一行一列 |
列子查询 | 一列多行 |
行子查询 | 一行多列 |
表子查询 | 多行多列 |
按子查询的位置:
- select后面:仅仅支持标量子查询
- from后面:支持表子查询
- where或having后面:标量子查询、列子查询、行子查询
- exists后面(x相关子查询):表子查询
where或having后面
特点:
- 子查询放在小括号内
- 子查询一般放在条件的右侧
- 标量子查询,一般搭配着单行操作符使用(> < >= <= = <>)
列子查询,一般搭配着多行操作符使用(in、any/some、all) - 子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果
标量子查询
谁的工资比Abel高?
select salary
from employees
where salary>(
select salary
from employees
where last_name='Abel'
);
列子查询
返回其它工种中比job_id为’IT_PROG’工种任一工资低的员工的员工号、姓名、job_id以及salary
select employee_id,last_name,job_id,salary
from employees
where salary<any(
select distinct salary
from employees
where job_id='IT_PROG'
) and job_id<>'IT_PROG';
行子查询
查询员工编号最小并且工资最高的员工信息
select *
from employees
where (employee_id,salary)=(
select min(employee_id),max(salary)
from employees
);
select后面
查询每个部门的员工个数
select d.*,(
select count(*)
from employees e
where e.department_id=d.department_id
) 个数
from departments d;
from后面
将子查询结果充当一张表,要求必须起别名
查询每个部门的平均工资的工资等级
select ag_dep.*,g.grade_level
from (
select avg(salary) ag,department_id
from employees
group by department_id
) ag_dep
inner join job_grades g
on ag_dep.ag between lowest_sal and highest_sal
exists后面
语法:exists(完整的查询语句)
结果:1或0
查询有员工的部门名
select department_name
from departments d
where exists(
select *
from employees e
where d.department_id=e.department_id
);