Oracle 子查询

子查询:在一个查询的内部还包括另外一个查询,则此查询称为子查询,子查询的格式:

SELECT {DISTINCT} * | 查询列 1 别名 1,查询列 2 别名 2,…
FROM 表名称 1 别名 1 , 表名称 2 别名 2 ,
(
SELECT {DISTINCT} * | 查询列 1 别名 1,查询列 2 别名 2,…
FROM 表名称 1 别名 1 , 表名称 2 别名 2 ,…
{WHERE 条件(s)}
{GROUP BY 分组条件 {HAVING 分组条件}}
{ORDER BY 排序字段 ASC|DESC , 排序字段 ACS | DESC ,…}
) 别名,
…
{WHERE 条件(s)
    (
        SELECT {DISTINCT} * | 查询列 1 别名 1,查询列 2 别名 2,…
        FROM 表名称 1 别名 1 , 表名称 2 别名 2 ,…
        {WHERE 条件(s)}
        {GROUP BY 分组条件 {HAVING 分组条件}}
        {ORDER BY 排序字段 ASC|DESC , 排序字段 ACS | DESC ,…}
    )
}
{GROUP BY 分组条件 {HAVING 分组条件}}
{ORDER BY 排序字段 ASC|DESC , 排序字段 ACS | DESC ,…}            

范例:要求查询出比 7654 工资要高的全部雇员的信息

  • · 要首先清楚的知道 7654 雇员的工资是多少
SELECT sal FROM emp WHERE empno=7654 ;

  • · 之后要以以上的结果最为后续查询的依据,只要是其他的工资大于 sal,则表示符合条件。
SELECT * FROM emp
WHERE sal>(SELECT sal FROM emp WHERE empno=7654) ;

所有的子查询必须在“()”中编写代码。
子查询在操作中有分为以下三类:

  • · 单列子查询:返回的结果是一列的一个内容,出现几率最高
  • · 单行子查询:返回多个列,有可能是一条完整的记录
  • · 多行子查询:返回多条记录

在子查询中,存在以下三种查询的操作符号:

  • · IN
  • · ANY
  • · ALL

IN 操作符,指定一个查询的范围
范例:求出每个部门的最低工资的雇员信息

  • · 每个部门的最低工资,返回的值肯定是多个,所以此时可以使用 IN 指定一个操作的范围。
SELECT * FROM emp
WHERE sal IN (SELECT MIN(sal) FROM emp GROUP BY deptno) ;

ANY 操作:

  • · =ANY:与 IN 的操作符功能完全一样
SELECT * FROM emp
WHERE sal =ANY (SELECT MIN(sal) FROM emp GROUP BY deptno) ;

  • · >ANY:比里面最小的值要大
SELECT * FROM emp
WHERE sal >ANY (SELECT MIN(sal) FROM emp GROUP BY deptno) ;

  • · <ANY:比最大的值要小
SELECT * FROM emp
WHERE sal <ANY (SELECT MIN(sal) FROM emp GROUP BY deptno) ;

ALL 操作:

  • · >ALL:比最大的值要大
SELECT * FROM emp
WHERE sal >ALL (SELECT MIN(sal) FROM emp GROUP BY deptno) ;

  • · <ALL:比最小的值要小
SELECT * FROM emp
WHERE sal <ALL (SELECT MIN(sal) FROM emp GROUP BY deptno) ;

对于子查询来讲,还可以进行多列子查询,一个子查询中同时返回多个查询的列。

SELECT *
FROM emp
WHERE (sal,NVL(comm,-1)) IN (
    SELECT sal,NVL(comm,-1) FROM emp WHERE deptno=20) ;


 

  • · 在一个查询中继续包含另外一个查询,称为子查询
  • · 子查询可以出现在任意的位置:SELECT、FROM 、WHERE
  • · 子查询可以结合分组统计、多表关联完成复杂的查询功能
原文地址:https://www.cnblogs.com/aaron911/p/7764724.html