有时候我们查询一个结果必须基于另外一个查询的结果,这时候就要用到子查询
子查询又分为以下两类:
- 非相关子查询:非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查
- 相关子查询:相关子查询的执行依赖于外部查询的数据,外部查询执行一次,子查询就执行一次
使用子查询要注意以下几个方面
- 子查询放在括号内
- 子查询放在比较条件的右边
- 在单行子查询中庸单行运算符,在多行子查询中用多行运算符
非相关子查询
如我们查询大于smith薪资列表的员工信息,可以这样写代码
SELECT * FROM emp
WHERE sal>(SELECT sal FROM emp WHERE ename='SMITH' );
--查询与smith相关职位人员的列表
SELECT * FROM emp
WHERE job=(SELECT job FROM emp WHERE ename='SMITH' );
--查询最低工资的人员信息
SELECT * FROM emp
WHERE sal=(SELECT MIN(sal) FROM emp);
如果子查询返回多行,我们就不能用大于、等于这些运算符,而是需要使用多行运算符
- IN:等于列表中的任何成员
- ANY:比较子查询返回的每个值
- ALL:比较子查询返回的全部值
--查询收入为各部门中最低的员工列表
SELECT * FROM emp
WHERE sal IN (SELECT min(sal) FROM emp GROUP BY deptno);
--查询非职员(CLERK)的人员中比所有职员薪资高的人员列表
SELECT * FROM emp
WHERE sal
> ANY (SELECT sal FROM emp WHERE job='CLERK') AND job<>'CLERK';
-
>ANY:大于最小值
-
=AN:同IN
-
>ALL:大于最大值
大家可以好好体会一下,区别
--查询非职员(CLERK)中比职员薪资最高的人还高的人员列表
SELECT * FROM emp
WHERE sal
> ALL ( SELECT sal FROM emp WHERE job= 'CLERK') AND job<>'CLERK' ;
相关子查询
--相关子查询
--查询表中薪资超过该员工所在部门平均薪资的人员信息
SELECT * FROM emp
t1
WHERE t1.sal>(SELECT AVG(sal) FROM emp
t2 WHERE t1.deptno=t2.deptno)
ORDER BY t1.deptno;
其中子查询需要的deptno需要每次从外查询中取得
<!-- 正文结束 -->
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26935791/viewspace-1117493/
,如需转载,请注明出处,否则将追究法律责任。