1、定义
- 指嵌入在其他sql语句中的select语句
- 通俗的来讲指的是在一个查询之中嵌入若干个小的查询
- 子查询可以出现在查询语句的任意位置上,但是实际开发运用中,子查询出现在WHERE和FROM子句之中较多。
2 、核心作用
子查询的出现主要是为了解决多表查询之中的性能问题。超大型数据尽可能尽力不要写子查询,使用连接(JOIN)去替换它
3 、分类
- 嵌套查询(标准子查询)
指子查询可以脱离主查询独立执行
- 关联查询(相关子查询)
关联子查询就是指子查询与主查询之间有条件关联,关联子查询会引用外部查询中的一列或多列。这种子查询之所以被称为关联子查询,是因为子查询的确与外部查询有关。当问题的答案需要依赖于外部查询中包含的每一行中的值时,通常就需要使用关联子查询。
笔记:关联子查询(相关子查询):子查询不可以脱离主查询独立执行
4 、FROM中使用子查询
1、说明
如果在 FROM 子句里面出现的子查询,其返回的结果一般都是多行多列数据(相当于表)。
2、示例代码
-
范例:查询出每个部门的编号、名称、位置、部门人数、平均工资
1、方式一
2、方式二:通过子查询完成,所有的统计查询只能在GROUP BY中出现,所以在子查询之中负责统计数据,而在外部的查询之中,负责将统计数据和dept表数据相统一。SELECT d.deptno,d.dname,d.loc,COUNT(e.empno),AVG(e.sal) FROM emp e,dept d WHERE e.deptno=d.deptno GROUP BY d.deptno,d.dname,d.loc;
3、说明SELECT d.deptno,d.dname,d.loc,temp.count,temp.avg FROM dept d,(SELECT deptno dno,COUNT(empno) count,AVG(sal) avg FROM emp GROUP BY deptno) temp WHERE d.deptno=temp.dno;
方式一的数据量,
积的数量:emp 的 14 条 * dept 的 4 条 = 56 条数据;
方式二的数据量- 子查询中统计的记录是14条记录,最终统计的显示结果是3条记录;
- dept表之中一共有4条记录;
- 如果现在产生笛卡尔积的话只有12条记录,再加上子查询中雇员的14条记录,一共才26条记录;
通过如上的分析,可以发现,使用子查询的确要比使用多表查询更加节省性能,所以在开发之中子查询出现是最多的,而且在给出一个不成文的规定:大部分情况下,如果最终的查询结果之中需要出现SELECT子句,但是又不能直接使用统计函数的时候,就在子查询中统计信息,即:有复杂统计的地方大部分都需要子查询。
- 查询比本部门平均工资高的员工的姓名,部门编号,工资及平均工资
SELECT e.ename, e.sal, e.deptno, temp.salavg FROM emp e, (SELECT deptno, AVG(sal) salavg FROM emp GROUP BY deptno) temp WHERE e.deptno = temp.deptno AND e.sal > temp.salavg
- 查询出部门名称,部门的员工数,部门的平均工资,部门的最低收入雇员的姓名
SELECT d.dname,temp.cou,temp.avg,e.ename FROM (SELECT deptno,count(1) cou,round(avg(sal)) avg,min(sal) min FROM emp GROUP BY deptno ) temp, dept d, emp e WHERE d.deptno=temp.deptno AND e.sal=temp.min;