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
- · 子查询可以结合分组统计、多表关联完成复杂的查询功能
没有高深的知识,没有进阶的技巧,万丈高楼平地起~!