子查询:指在一个select语句中嵌套另一个select语句,支持多层嵌套。
被包裹的select语句:称子查询或内查询
包裹子查询的外部查询语句:称主查询语句
子查询分类
1、通过位置来分:
select 后面:仅仅支持标量子查询
from 后面:支持表子查询
where 或having 后面:支持标量子查询(重要)\列子查询(重要)\行子查询(用的较少)
exists 后面(相关查询):支持表子查询(用的较少)
2、按结果集的行列数不同分类:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集只有一行但有多列)
表子查询(结果集多行多列)
3、子查询特点:
子查询放在小括号内
子查询一般放在条件的右侧
标量子查询,一般搭配着单行操作符来使用(> < >= any 比子查询中返回的最小值要大, all 比子查询中返回的最大值要大, (
select salary
from employees
where employee_id=143);
案例:having的子查询:查询最低工资大于50号部门最低工资的部门id和其最低工资
select department_id , min(salary)
from employees
group by
department_id
having
min(salary)>(
select min(salary)
from employees
where department_id=50);
案例:查询其他工种中比job_id为'IT_PROG'的员工某一工资低的员工的员工号,姓名,job_id和salary(列子查询)
SELECT employee_id,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
avg_res.avgs,avg_res.department_id,g.grade_level
FROM
(SELECT AVG(salary) avgs,department_id
FROM employees GROUP BY department_id
) avg_res,
job_grades g
WHERE
avg_res.avgs BETWEEN g.lowest_sal AND g.highest_sal;
5、exists的作用是:判断子查询有没有结果的存在(很少使用)
语法:
select exists(完整的子查询); #子查询有结果返回1,没有结果返回0;
案例:查询有员工的部门名
select department_name
from departments d
where
exists(
select *
from employees e
where d.department_id=e.department_id );
