复杂查询 = 限定查询 + 多表查询 + 统计查询 + 子查询。

WHERE子句中的子查询

子查询

范例:查询最低工资雇员的信息

  • 步骤一:查询最低工资

    SELECT MIN(sal) FROM emp;

  • 步骤二:最低工资雇员信息

    SELECT * FROM emp WHERE sal=(SELECT MIN(sal) FROM emp);

so,这就是一个子查询,即就是在一个完整的查询之中定义了若干个小的查询所形成的复杂查询。

注意:所有子查询编写的时候一定要使用“()”标记。

WHERE子句中处理子查询

子查询返回的是单行单列数据

范例: 查询出基本工资比ALLEN低的全部雇员信息

分析:

  • 步骤一:找到ALLEN的工资(返回的是单行单列的数据,即一个数值)

    SELECT sal FROM emp WHERE ename='ALLEN';

  • 步骤二:在WHERE子句中使用此子查询

    1
    2
    SELECT * FROM emp
    WHERE sal < (SELECT sal FROM emp WHERE ename='ALLEN');

子查询返回的是单行多列的数据

范例:查询与SCOTT从事同一工作且工资相同的雇员信息

  • 步骤一:找到SCOTT的工作和工资

    SELECT job,sal FROM emp WHERE ename="SCOTT";

  • 步骤二:既然返回的是单行两列的数据,那么我们还是用WHERE进行判断

    1
    2
    SELECT * FROM emp
    WHERE (job,sal) = (SELECT job,sal FROM emp WHERE ename="SCOTT");

子查询返回的是多行单列数据

在使用多行子查询时,主要使用三种操作符:IN、ANY、ALL

范例:查询出与每个部门中最低工资相同的全部雇员信息

  • 步骤一:查询出与每个部门之中最低工资相同的全部雇员信息

    SELECT MIN(sal) FROM emp GROUP BY deptno ;

  • 步骤二:要在此范围之中

    1
    2
    SELECT * FROM emp
    WHERE sal IN (SELECT MIN(sal) FROM emp GROUP BY deptno);

HAVING子句中使用子查询

HAVING一定是结合GROUP BY子句一起使用的,其主要目的是进行分组后数据的再次过滤,而且与WHERE子句不同的是,HAVING是在分组后,可以使用统计函数。

HAVING语句使用子查询,返回的数据往往是单行单列的。

范例:查询部门编号、雇员人数、平均工资,且要求这些部门的平均工资高于公司平均薪金

  • 步骤一:查询出公司的平均薪金

    SELECT AVG(sal) FROM emp;

  • 步骤二:按照deptno字段进行分组,并且统计部门信息

    1
    2
    3
    SELECT deptno, COUNT(empno), AVG(sal)
    FROM emp
    GROUP BY deptno;
  • 步骤三:要执行分组后的数据过滤

    1
    2
    3
    4
    SELECT deptno, COUNT(empno), AVG(sal)
    FROM emp
    GROUP BY deptno
    HAVING AVG(sal) > (SELECT AVG(sal) FROM emp);

FROM子句中使用子查询

FROM子句中出现的内容一般都是多行多列的子查询