一个查询之中嵌套了其他的若干查询。
from 和 where 子句中。select <select_list>
from 表名
where 条件(s) 操作符
? (select <select_list> from 表名);
# 查询大于公司平均工资的员工姓名select ename, sal from emp where sal > (select avg(sal) from emp);
(1)单行单列子查询:子查询返回一行一列记录,好比就是一个值
返回一条记录---比较运算符(针对一个值的运算符): = > < >= < !=
# 查询大于公司平均工资的员工姓名select ename, sal from emp where sal > (select avg(sal) from emp);
(2) 多行单列子查询:子查询返回单列多行记录,好比是多个值
返回多条记录---比较运算符(多个值的运算符): in any all
in 相当于 = any
any:与子查询返回的任意一个值做比较; all:与子查询返回的每一个值做比较
# 查询工资等于部门经理的员工信息select * from emp where sal in (select sal from emp where job = 'manager');select * from emp where sal = any (select sal from emp where job = 'manager');# 查询工资大于任意部门经理的员工信息select * from emp where sal > any (select sal from emp where job = 'manager');# 查询工资小于任意部门经理的员工信息select * from emp where sal < any (select sal from emp where job = 'manager');
(3)多行多列子查询:子查询返回多列一行/多行记录,好比是一张表 【其实就是多表连接查询】
一般把查询结果含多个列的当做临时表【必须给临时表起个别名】,接着在临时表上继续查询或者连接查询;
# 查询出每个部门的编号、名称、部门人数、平均工资select t.deptno, d.dname, t.count_empno, t.avg_salfrom dept d left join(select e.deptno, count(e.empno) count_empno, avg(e.sal) avg_sal from emp e group by deptno) t on d.deptno = t.deptno;纵向连接(一般用于作为临时表)select <select_list> from 表名1
union | union all
select <select_list> from 表名2
#全连接查询员工的编号、名称、部门名称select e.deptno,e.ename,d.dname from emp e left join dept d on e.deptno = d.deptnounionselect e.deptno,e.ename,d.dname from emp e right join dept d on e.deptno = d.deptno;