4.7 数据库:单行子查询和多行子查询
以查询的结果及记录的数量来划分子查询,按照结果集里边记录的数量去划分子查询,可以分为单行子查询和多行子查询。
1. 单行子查询和多行子查询
顾名思义的单行子查询,就是返回一行记录,多行子查询就是返回多行记录。
单行子查询比较简单,能出现在select子句,from子句和where子句里边。但是多行子查询只能出现在where子句和from子句里边。当一个子查询返回多行记录的时候,如果在from子句里边的那是绝对没有问题的。因为结果集可以当做一张临时表来跟其他的数据表做连接。所以子查询的结果有多少条,记录是无所谓的,反正也是当做临时表来处理。如果多行记录出现在where子句里边,我们可以用特殊的表达式符号来做判断。
因为select子句的其他字段的一条记录没法跟子查询的多条记录做合并。所以说select子句里边绝对不可以出现多行字查询。
问题1:如何用子查询查找FORD和MARTIN两个人的同事?
select
ename
from t_emp
where deptno in (select deptno from t_emp where ename in ("FORD","MARTIN")) and ename not in ("FORD","MARTIN")
in:就是等于这个结果集里边任何一个值
2.WHERE 子句中多行子查询
问题2:查询比 FORD 和MARTIN 底薪都高的员工信息
select
ename
from t_emp
where sal >= all
(select sal from t_emp where ename in("FORD","MARTIN")) and ename not in("FORD","MARTIN");
all:结果集中所有的
any:结果集中的任意一个
exists:把原来在子查询之外的条件判断写到子查询里面
原来在where子句里边,我们用条件与子查询的结果做判断,现在这个条件改到了exist关键字对应的那个子查询里边了
问题3:查询工资等级是 3级或者 4级的员工信息
select
ename,sal
from t_emp
where exists
(select ename from t_salgrade where sal between losal and hisal and grade in(3,4))