123sw 发表于 2018-9-13 10:52:32

oracle子查询详解1-bckong

  原文出处:http://www.linuxidc.com/Linux/2012-03/56649.htm###
  子查询概念 :当一个查询的结果是另一个查询的条件时,称之为子查询。
  使用子查询注意事项:
  子查询可以嵌套多层
  子查询需要圆括号()括起来
  子查询语法:
  SELECT   select_list
  FROM       table
  WHERE    expr operator
  (SELECT    select_list
  FROM                  table);
  l子查询 (内查询) 在主查询之前一次执行完成。
  l子查询的结果被主查询使用 (外查询)。
  举例:查询员工的工资大于JONES的员工信息
  分析过程如下:
  首先:查询JONES的员工工资是多少 :结果2975
  SQL> select sal from emp where ename='JONES';
  实际上我们要查询的是:薪资大于2975的员工的信息写法如下:
  SQL> select * from emp where sal>2975;
  //综合以上写出子查询的结果如下:
  SQL> select * from emp where sal>(select sal from emp where ename='JONES');
  注意:
  l子查询要包含在括号内。
  l将子查询放在比较条件的右侧。
  根据查询的结果(内部嵌套查询的结果)把子查询的类型分为单行子查询与多行子查询,
  注意:
  l单行操作符对应单行子查询,多行操作符对应多行子查询。
  单行操作符
  >、>=、 ( 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);
  备注:子查询可以返回空行 没要查询到结果是可以的。
  多行子查询
  l   返回多行。
  l使用多行比较操作符。
  操作符如下图:
  操作符
  描述
  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 deptno10;

页: [1]
查看完整版本: oracle子查询详解1-bckong