9.单行子查询只能使用单行操作符
多行子查询只能使用多行操作符
返回一条记录---单行子查询
返回2条及其以上----多行子查询
单行子查询示例1:
查询员工信息:
1.职位与7566员工一样
2.薪水大于7782的薪水
select *
from emp
where job = (select job from emp where empno=7566) and
sal > (select sal from emp where empno=7782);
单行子查询示例2:
查询工资最低的员工信息
select *
from emp
where sal = (select min(sal) from emp);
单行查询示例-3:
查询最低工资大于20号部门最低工资的部门号和部门的最低工资
select deptno,min(sal)
from emp
group by deptno
having min(sal) > (select min(sal)
from emp
where deptno=20);
多行操作符-
in--- 等于列表中的任何一个
any--- 和子查询返回的任意一个值比较
all--- 和子查询返回的所有值比较
多行操作符in:
查询部门名称是SALES和ACCOUNTING的员工信息
select *
from emp
where deptno in (select deptno from dept where dname='SALES' or dname='ACCOUNTING');
多表查询实现:
select e.*
from emp e,dept d
where e.deptno=d.deptno and (d.dname='SALES' or d.dname='ACCOUNTING');
tips:如若不加括号,按照and,or从前到后次序执行;
多行操作符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);
多行操作符: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);


单行子查询错误示例提示
subquery 子查询
ORA-01427 single-row subquery returns more than one row
非法使用子查询,使用单行操作符“=”,子查询的返回结果就不允许是多行

多行操作符in 案例:查询部门名称是SALES和ACCOUNTING的员工信息
实现方式1:
select *
from emp
where deptname in (select deptname where dname = 'SALES' or dname = 'ACCOUNTING');
实现方式2:
select e.*
from emp e .dept d
where e.deptno = d.deptno and (d. dname = 'SALES' or d.dname = 'ACCOUNTING');
多行操作符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);
多行操作符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);
单行子查询只能使用单行操作符,多行子查询只能使用多行操作符
子查询:返回一条记录属于单行子查询;多行子查询:返回多条查询记录属于多行子查询。


查询员工信息要求:职位与7566员工一样,薪水大于7782员工新水:
select *
from emp
where job = (select job from emp where empno=7566) and
sal > (select sal from emp where empno=7782)
查询员工工资最低的信息
select *
from emp
where sal = (select min(sal) from emp );
查询最低工资大于20号部门最低工资的部门号和部门的最顶工资
select deptno ,min(sal)
from emp
group by deptno
having min(sal) > (select min(sal)
from emp
where deptno = 20)

单行操作符:=,>,>=,<,<=,<>

多行操作符:in,any,all

any与min()单行子查询
使用单行操作符
单行子查询,单行符
单行子查询和多行子查询
1、单行子查询只能使用单行操作符;多行子查询只能使用多行操作符
单行子查询示例
1、查询员工信息,要求:-职位与7566员工一样-薪水大于7782员工的薪水
select * from emp where job= (select job from emp where empno=7566) and sal>(select sal from emp where empno=7782);
单行子查询只能使用单行操作符
在一个主查询中可以有多个子查询
2、查询工资最低的员工信息
select * from emp where sal =(select min(sal) from emp );
3、查询最低工资大于20号部门最低工资的部门号和部门的最低工资
select deptno,min(sal) from emp group by deptno having min(sal) > (select min(sal) from emp where deptno=20);
多行子查询
1、IN
查询部门名称是SALES和ACCOUNTING的员工信息
select * from emp where deptno in (select deptno from dept where dname ='SALES' or dname='ACCOUNTING');
select e.* from emp e,dept d where e.deptno=d.deptno and (d.dname='SALES' or d.dname='ACCOUNTING');
2、ANY
查询工资比30号部门任意一个员工高的员工信息
select * from emp where sal >any (select sal fro 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);
any.all
select *
from emp
where job =(select job from emp where empno=7566) and
sal> (select sal from emp where empno=7782);
单行子查询只能使用单行操作符
在一个主查询中可以有多个子查询。
in 等于列表中的任何一个
any 和子查询返回的任意一个值比较
all 和子查询返回的所有值比较
单行子查询只能使用单行操作符;多行子查询只能使用多行操作符
多行子查询 多表
单行子查询
error at line 4:
ora-01427:single-row
select deptno,min(sal) from emp
group by deptno
having min(sal) > (select min(sal)
from emp
where deptno=20);
select * from emp
where sal = (select min(sal) from emp);
select * from emp
where job = (select job from emp where empno = 7566) and
sal > (select sal form emp where empno = 7782);
单行子查询只能用单行操作符
多行子查询只能用多行操作符
对于多行子查询可以使用in,any,all来操作。
any代表的是子查询中的某一个,也就是满足一个成立就可以了,all代表的是子查询的所以,也就是对于所有的都要满足才行。具体是最大值还是最小值要额外分析。
where后的条件如果有or的话一定要记得加(),不然会导致先执行and再执行or导致or的对象不是原本想要的运算的对象。
where后的条件如果有or的话一定要记得加(),不然会导致先执行and再执行or导致or的对象不是原本想要的运算的对象。
例2 查询员工最低的工资信息
select * from emp
where sal = ( select min(sal) from emp);
例3 查询最低工资大于
20 号部门最低工资的部门号和部门的最低工资

单行子查询
select * from emp
where job=(select job from emp where empno=7566) and
sal > (select sal from emp where empno=7782);
这个 的> 和= 都是单行子查询,一个主查询可以有多个子查询