【1】什么是子查询?
一条SQL语句含有多个select
-- 引入子查询:
-- 查询所有比"CLARK"工资高的员工的信息
-- 步骤1:"CLARK"工资
select sal
from emp
where ename = 'CLARK'; -- 2450
-- 步骤2:查询所有比"CLARK"工资搞得员工信息
select *
from emp
where sal > 2450;
-- 两次命令解决问题 -->效率低,第二个依托于第一个命令,第一个命令的结果给第二个使用,但是因为第一个命令的结果不确定要改,所以第二个命令也会导致修改
-- 将步骤1和步骤2合并 -->子查询 :
select * from emp where sal >(select sal from emp where ename='CLARK');
-- 通过一个命令解决问题 -->效率高
【2】执行顺序:
先执行子查询,再执行外查询;
【3】不相关子查询:
子查询可以独立运行,称为不相关子查询
【4】不相关子查询:
根据子查询的结果行数,可以分为单行子查询和多行子查询
-- 单行子查询:
-- 查询工资高于平均工资的员工名字和工资
select ename,sal
from emp
where sal >(select avg(sal) from emp);
-- 查询和CLARK同一部门且比他工资低的员工名字和工资
select ename,sal
from emp
where deptno = (select deptno from emp where ename = 'CLARK')
and
sal < (select sal from emp where ename = 'CLARK')
-- 查询职务和Scott相同,比Scott雇佣时间早的雇员信息:
select *
from emp
where HIREDATE <(select HIREDATE from emp where ename = 'Scott')
and
job = (select job from emp where ename = 'Scott')