`
DXL_xiaoli
  • 浏览: 69641 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

ORACLE子查询

阅读更多
Oracle子查询
子查询概念 :当一个查询的结果是另一个查询的条件时,称之为子查询。
使用子查询注意事项:
         子查询可以嵌套多层
         子查询需要圆括号()括起来
子查询语法:
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
       FROM table);
 子查询 (内查询) 在主查询之前一次执行完成。
 子查询的结果被主查询使用 (外查询)。
举例:查询员工的工资大于JONES的员工信息
分析过程如下:
首先:查询JONES的员工工资是多少 :结果2975
SQL>  select sal from emp where ename='JONES';
      SAL
---------
  2975.00

实际上我们要查询的是:薪资大于2975的员工的信息写法如下:
SQL> select * from emp where sal>2975;
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7788 SCOTT      ANALYST    7566 1982/12/9     3000.00               20
7839 KING       PRESIDENT       1981/11/17    5000.00               10
7902 FORD       ANALYST    7566 1981/12/3     3000.00               20

综合以上写出子查询的结果如下:
SQL> select * from emp where sal>(select sal from emp where ename='JONES');

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7788 SCOTT      ANALYST    7566 1982/12/9     3000.00               20
7839 KING       PRESIDENT       1981/11/17    5000.00               10
7902 FORD       ANALYST    7566 1981/12/3     3000.00               20
注意:
 子查询要包含在括号内。
 将子查询放在比较条件的右侧。

根据查询的结果(内部嵌套查询的结果)把子查询的类型分为单行子查询与多行子查询,
   注意:
 单行操作符对应单行子查询,多行操作符对应多行子查询。
单行操作符
>、>=、 <、 <= 、<>、=
举例:
//查询编号7876相同职位的员工信息 并且薪资大于编号为7521的薪资的员工信息
SQL> select * from emp where job=( select job from emp where empno=7876) and sal>( select sal from emp where empno=7521);
//子查询含有组函数
SQL> select * from emp where sal>(select avg(nvl(sal,0)) from emp);
//子查询含有having子句 查询部门的最小工资大于20号部门最小工资的部门号及最小工资数
SQL> select deptno,min(sal) from emp group by deptno having min(sal)>( select min(sal) from emp where deptno=20);

备注:子查询可以返回空行 没要查询到结果是可以的。

多行子查询
 返回多行。
 使用多行比较操作符。
操作符如下图:
操作符 描述
In 等于列表中的任何一个
Any 子查询返回的任意一个值比较 相同还有some
All 和子查询返回的所有值比较 
Exists

//查询薪水小于工作岗位CLERK的任何一个薪资的员工信息 并且不包含工作岗位为CLERK的员工信息
SQL> select * from emp where sal < any (select sal from emp where job='CLERK') and job<>'CLERK';
//all与所有值比较 >all 代表的是大于查询结果的最大值
SQL> select * from emp where sal > all (select sal from emp where job='CLERK') and job<>'CLERK';
//查询岗位与部门编号为10相同的员工信息 不包含自己。
SQL> select * from emp where job in(select job from emp where deptno=10) and deptno<>10;

只做思考?

SQL> select * from emp where exists(select * from dept);

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH      CLERK      7902 1980/12/17     800.00               20
7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30
7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30
7566 JONES      MANAGER    7839 1981/4/2      2975.00               20
7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30
7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30
7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10
7788 SCOTT      ANALYST    7566 1982/12/9     3000.00               20
7839 KING       PRESIDENT       1981/11/17    5000.00               10
7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30
7876 ADAMS      CLERK      7788 1983/1/12     1100.00               20
7900 JAMES      CLERK      7698 1981/12/3      950.00               30
7902 FORD       ANALYST    7566 1981/12/3     3000.00               20
7934 MILLER     CLERK      7782 1982/1/23     1300.00               10

14 rows selected

SQL> select * from emp where exists(select * from dept where deptno=80);

EMPNO ENAME  JOB        MGR HIREDATE       SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics