子查询所要解决的问题:不能一步求解的问题!
语法:select 语句的嵌套1.单行子查询:如果子查询只返回一行记录,就是单行子查询单行操作符: = , > , >=,<,<=,<>2.多行子查询:如果子查询返回多行记录,就是多行子查询多行操作符: in(set) , any , all如:查询工资比SCOTT高的员工信息,分两步1.查询SCOTT的工资: select sal from emp where ename='SCOTT';2. 查询比3000高的员工: select * from emp where sal>3000;子查询: select * from emp where sal > (select sal from emp where ename='SCOTT');//多行子查询1.in 在集合中select * from emp where deptno in (select deptno from dept where dname='SALES'or dname='ACCOUNTNG');select e.* from emp e,dept d where e.deptno=d.deptnoand (d.dname='SALES' or d.dname='ACCOUNTING');2.any: 和集合中任意一个值比较//查询工资比30号部门任意一个员工高的员工信息select * from emp where sal > any (select sal from emp where deptno=30);//大于集合任意一个值,只需要大于集合最小值即可select * from emp where sal > (select min(sal) from emp where deptno=30)3. all:和集合中的所有值比较//查询工资比30号部门所有员工高的员工信息select * from emp where sal > all (select sal from emp where deptno=30);或 select * from emp where sal > (select max(sal) from emp where deptno=30)注意的问题:1. 要有括号2.合理的书写风格3.可以在主查询的where ,select, having ,from后面都可以使用子查询select 语句后面使用子查询,只能使用单行子查询,即只允许返回一条记录4.不可以在group by后面使用子查询5.强调from后面的子查询6.主查询和子查询可以不是同一张表;只要子查询返回的结果主查询可以使用 即可7.一般不在子查询中排序;但在top-n分析问题中,必须对子查询排序8.一般先执行子查询 再执行主查询;但相关子查询例外9.单行子查询只能使用单行操作符;多行子查询只能使用多行操作主查询可以有多个子查询,即1:n关系,子查询可以嵌套用,最多855层10.子查询中的null ,为什么集合中若有空值,不能用not in(10,20,null) 可以用in( );举例:和上面序号对应3. //select 语句后面使用子查询,只能使用单行子查询,即只允许返回一条记录select empno,ename,sal,(select job from emp where empno=7839) 第四列 from emp;//按部门分组查询最低工资,且最低工资大于10号部门的最低工资才显示select deptno ,min(sal) from emp group by deptno having min(sal) >(select min(sal) from emp where deptno = 10);//查询员工号,姓名,月薪 ,年薪select * from (select empno,ename,sal , sal*12 年薪 from emp );6.查询部门名称是sales的员工select * from emp where deptno = (select deptno from dept where dname='SALES');//子查询方式select e.* from emp e,dept d where e.deptno = d.deptno and d.dname='SALES';//多表查询方式7.Top-n分析: 找出员工工资表的前三名8.一般先执行子查询 再执行主查询;但相关子查询例外9.单行子查询只能使用单行操作符;多行子查询只能使用多行操作//查询工资最低的员工的职位和薪水select ename,job,sal from emp where sal =(select min(sal) from emp);//下面是非法的,因为多行子查询使用单行比较符select ename from emp where sal = (select min(sal) from emp groupby deptno);错误10. 单行子查询空值问题 不能贸然使用 = 或 != ,因为后面返回null就永远不成立select ename, job from emp where job=(select job from emp where ename='mike') //子查询可能返回null ,而判断是否为空,不能使用 = 或者 !=多行子查询中的null:集合有空值,不能用not in 可以用in//查询不是领导的员工select * from emp where empno not in (select mgr from emp); //错误写法select * from emp where empno not in (select mgr from emp where mgr is not null);//正确--------------------- 作者:水河澹澹 来源:CSDN 原文:https://blog.csdn.net/qq_33497137/article/details/53791261 版权声明:本文为博主原创文章,转载请附上博文链接!