Oracle学习之子查询(一)

2014-11-24 09:08:48 · 作者: · 浏览: 0

一、子查询
在一个SQL语句中嵌套另一个SQL语句成为子查询。
当一个问题无法通过一部解决时可考虑使用子查询,一个出现在SELECT
语句的FROM子句中的子查询被称为"内嵌视图";一个出现在SELECT语
句的WHERE子句中的子查询被称为"内嵌子查询",一个子查询能够包含
另一个子查询,在一个顶级的查询中,Oracle 数据库没有限制在FROM
子句中的嵌套层数,可以在一个WHERE子句中嵌套255层子查询

子查询可包括:
1、单行子查询(子查询只返回一行)
单行子查询可使用如下操作符:
> 大于
< 小于
= 等于
>= 大于等于
<= 小于等于
<> 不等于
2、多行子查询(子查询返回多行)
多行子查询可使用如下操作符:
IN 等于列表中的任何一个
ANY 和子句中返回的任意一个值比较
ALL 和子句中返回的所有值比较
出现在WHERE子句中的子查询语法
Sql代码
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
查询scott用户下的emp表中工资比scott高的员工的信息(此操作中
的子查询只返回一行记录)
Sql代码
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代码
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子句中的子查询语法
Sql代码
SELECT select_list
FROM (SELECT select_list
FROM table)
WHERE expr;
将scott用户下的emp表中查询出的数据作为一个内嵌视图在FROM子句中
使用
Sql代码
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列表中,但此时子查询只能是一个单行子查询
Sql代码
select (select job from emp where empno=7369)
from emp;
子查询也可出现在HAVING子句中
Sql代码
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
---------- ---