一、子查询
在一个SQL语句中嵌套另一个SQL语句成为子查询。
当一个问题无法通过一部解决时可考虑使用子查询,一个出现在SELECT
语句的FROM子句中的子查询被称为"内嵌视图";一个出现在SELECT语
句的WHERE子句中的子查询被称为"内嵌子查询",一个子查询能够包含
另一个子查询,在一个顶级的查询中,Oracle数据库没有限制在FROM
子句中的嵌套层数,可以在一个WHERE子句中嵌套255层子查询
子查询可包括:
1、单行子查询(子查询只返回一行)
单行子查询可使用如下操作符:
> 大于
< 小于
= 等于
>= 大于等于
<= 小于等于
<> 不等于
2、多行子查询(子查询返回多行)
多行子查询可使用如下操作符:
IN 等于列表中的任何一个
ANY 和子句中返回的任意一个值比较
ALL 和子句中返回的所有值比较
出现在WHERE子句中的子查询语法
SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table);
查询scott用户下的emp表中工资比scott高的员工的信息(此操作中
的子查询只返回一行记录)
SQL> select * from emp 2 where sal>( 3 select sal from emp where ename='SCOTT'); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- 7839 KING PRESIDENT 17-11月-81 5000 10
查询scott用户下的emp表中所有的经理的信息(此操作子查询会返回
多行记录)
SQL> select * from emp 2 where empno in ( 3 select mgr from emp); EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- 7566 JONES MANAGER 7839 02-4月 -81 2975 20 7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 7782 CLARK MANAGER 7839 09-6月 -81 2450 10 7788 SCOTT ANALYST 7566 19-4月 -87 3000 20 7839 KING PRESIDENT 17-11月-81 5000 10 7902 FORD ANALYST 7566 03-12月-81 3000 20 已选择6行。
出现在FROM子句中的子查询语法
SELECT select_list FROM (SELECT select_list FROM table) WHERE expr;
将scott用户下的emp表中查询出的数据作为一个内嵌视图在FROM子句中
使用
SQL> select * 2 from (select empno,ename,job,sal from emp); EMPNO ENAME JOB SAL ---------- ---------- --------- ---------- 7369 SMITH CLERK 880 7499 ALLEN SALESMAN 1600 7521 WARD SALESMAN 1250 7566 JONES MANAGER 2975 7654 MARTIN SALESMAN 1250 7698 BLAKE MANAGER 2850 7782 CLARK MANAGER 2450 7788 SCOTT ANALYST 3000 7839 KING PRESIDENT 5000 7844 TURNER SALESMAN 1500 7876 ADAMS CLERK 1100 7900 JAMES CLERK 950 7902 FORD ANALYST 3000 7934 MILLER CLERK 1300 已选择14行。
子查询也可出现在SELECT列表中,但此时子查询只能是一个单行子查询
select (select job from emp where empno=7369) from emp;
子查询也可出现在HAVING子句中
SQL> select empno,ename, sal,deptno 2 from emp 3 group by deptno,empno,ename,sal 4 having deptno in ( 5 select deptno from emp 6 where deptno=10 or deptno=20) 7 order by deptno,sal; EMPNO ENAME SAL DEPTNO ---------- ---------- ---------- ---------- 7934 MILLER 1300 10 7782 CLARK 2450 10 7839 KING 5000 10 7369 SMITH 880 20 7876 ADAMS 1100 20 7566 JONES 2975 20 7902 FORD 3000 20 7788 SCOTT 3000 20 已选择8行。
如果子查询返回了一个空值,则主查询将不会查到任何结果
SQL> select * from emp 2 where empno=( 3 select empno from emp 4 where deptno=40); 未选定行
子查询注意的问题:
1>、要将子查询发在圆括号内
2>、子查询可出现在WHERE子句、FROM子句、SELECT列表(此处
只能是一个单行子查询)、HAVING子句中
3>、子查询不能出现在主查询的GROUP BY语句中
4>、子查询和主查询使用表可以不同,是要子查询返回的结果能够被
主查询使用即可
5>、一般不会在子查询中使用ORDER BY语句,但在TOP-N分析中
必须使用ORDER BY语句
6>、当行子查询只能使用单行操作符,多行子查询只能使用多行操作
符
7>、采用合理的缩进和换行来提过SQL语句的可读性
8>、子查询中的空值问题