子查询
子查询就是嵌套查询,即select中包含这select,如果一条语句中存在着两个,或者两个以上的select,那么就是子查询语句了。
子查询出现的位置
where后,作为条件的一部分;
from后,作为被查询的一条表;
当子查询出现在where 后作为条件时,还可以使用以下的关键字:
any
all
子查询结果集的形式:
单行单列(用于条件)
单行多列(用于条件)
多行单列(用于条件)
多行多列(用于表)
1.工资高于Allen的员工。
分析:
查询条件:工资>Allen工资,其中Allen工资需要一条子查询。
第一步:查询Allen的工资
select * from emp where ename='Allen';
第二步:查询高于Allen工资的员工
select * from emp where sal>($第一步);
结果:
select * from emp where sal>(select sal from emp where ename='Allen');
子查询作为条件
子查询形式为单行单列
2.工资高于30部门所有人的员工信息
分析:
查询条件:工资高于30部门所有人工资,其中30部门所有人工资是子查询。高于所有需要使用all关键字。
第一步:查询30部门所有人工资
select sal from emp where deptno=30;
第二步:查询高于30部门所有人工资的员工信息
select * from emp where sal>all($第一步);
结果:
select * from emp where sal>all(select sal from emp where deptno=30);
子查询作为条件
子查询形式为多行单列(当子查询结果集形式为多行单列时可以使用ALL或ANY关键字)
3.查询工作和工资与fred完全相同的员工信息
分析:
查询条件:工作和工资与fred完全相同,这是子查询
第一步:查询出fred的工作和工资
select job,sal from emp where ename='fred';
第二步:查询出与fred工作和工资相同的人
select * from emp where (job,sal)in($第一步);
结果:
select * from emp where (job,sal)in(select job,sal from emp where ename='fred');
子查询作为条件
子查询形式为单行多列
4.查询员工编号为1006的员工名称、员工工资、部门名称、部门地址
分析:
查询列:员工名称、员工工资、部门名称、部门地址
查询表:emp和dept,分析得出,不需要外连接(外连接的特性:某一行(或某些行)记录上会出现一半有值,一半为NULL值)
条件:员工编号为1006
第一步:去除多表,只查一张表,这里去除部门表,只查员工表
select ename,sal from emp where empno=1006;
第二步:让第一步与dept做内连接查询,添加主外键条件去除无用笛卡尔积
select e.name,e.sal,d.dname,d.loc
from emp e, dept d
where e.deptno=d.deptno and empno=1006;
第二步中的dept表表示所有行所有列的一张完整的表,这里可以把dept替换成所有行,但只有dname和loc列的表,这需要子查询。
第三步:查询dept表中dname和loc两列,因为deptno会被作为条件,用来去除无用笛卡尔积,所以需要查询它。
select dname,loc,deptno from dept;
第四步:替换第二步中的dept
select e.ename,e.sal,d.dname,d.loc
from emp e,(select dname,loc,deptno from dept) d
where e.deptno=d.deptno and e.empno=1006;
子查询作为表
子查询形式为多行多列