8. 子查询

子查询定义:在一个查询的内部还包括另外一个查询

子查询格式:在小括号中编写代码

SELECT DISTINCT *|列名 别名

FROM 表名 别名

    {括号内容就是子查询

        SELECT DISTINCT *|列名 别名

FROM 表名 别名

{WHERE 条件(s)}

{GROUP BY分组条件{HAVING 分组条件}}

{ORDER BY 排序的字段1,排序的字段2 ASC|DESC}

}

{WHERE 条件(s)}

{GROUP BY分组条件{HAVING 分组条件}}

{ORDER BY 排序的字段1,排序的字段2 ASC|DESC}

子查询类别:

单列子查询:返回的结果是一列的一个内容,出现几率最高

单行子查询:返回多个列,有可能是一条完整的记录

多行子查询:返回多条记录

范例:要求查询比7654工资要高的全部雇员的信息,要首先知道7654雇员的工资

Oracle从零开始07——SQL语句06——子查询 _Oracle

之后要以以上的结果作为后续查询的依据。只要是其他的工资大于sal,就符合条件

Oracle从零开始07——SQL语句06——子查询 _Oracle_02

范例:要求查询比7654工资要高,同时与7788从事相同工作的全部雇员的信息

Oracle从零开始07——SQL语句06——子查询 _从零开始_03

范例:要求查询出部门名称、部门员工数、部门的平均工资、部门的最低收入雇员的姓名

程序需要两张表关联:dept、emp

第一步:如果要像求出每个部门的员工数量及平均工资,则要按照deptno分组;

Oracle从零开始07——SQL语句06——子查询 _07_04

第二步:但是如果要想查出来部门的名称,则需要与dept表进行关联。红色部分是第一步的结果,以一个临时表的身份成为一个子查询

SELECT d.dname,ed.c,ed.a

FROM dept d,

(SELECT deptno,COUNT(empno) c,AVG(sal) a

FROM emp

GROUP BY deptno) ed

WHERE d.deptno=ed.deptno;

Oracle从零开始07——SQL语句06——子查询 _从零开始_05

第三步:部门的最低收入雇员的姓名

SELECT d.dname,ed.c,ed.a,e.ename

FROM dept d,emp e,(

    SELECT deptno,COUNT(empno) c,AVG(sal) a,MIN(sal) min

    FROM emp

    GROUP BY deptno) ed

WHERE d.deptno=ed.deptno AND e.sal=ed.min;

Oracle从零开始07——SQL语句06——子查询 _查询_06

如果此时在一个部门中同时存在两个工资最低的雇员,程序就会出现错误。

1)IN

指定查询的范围

范例:求出每个部门最低工资的雇员信息。每个部门的最低工资,返回值肯定是多个,所以此时可以使用IN制定一个操作的范围

    Oracle从零开始07——SQL语句06——子查询 _07_07

2)ANY

三种情况:

=ANY 与IN的操作符的功能完全一样

Oracle从零开始07——SQL语句06——子查询 _Oracle_08

>ANY 比里面最小的值要大

Oracle从零开始07——SQL语句06——子查询 _从零开始_09

<ANY 比里面最小的值要大

Oracle从零开始07——SQL语句06——子查询 _查询_10

3)ALL

>ALL 比最大的值要大

Oracle从零开始07——SQL语句06——子查询 _查询_11

<ALL 比最小的值要小

Oracle从零开始07——SQL语句06——子查询 _07_12

对于子查询来讲,还可以进行多列子查询,一个子查询中同时返回多个查询的列,但在开发中不建议使用。