Oracle之子查询

来源:互联网 发布:淘宝十大女装店 编辑:程序博客网 时间:2024/03/29 07:07

6.1.1
  在一个查询的内部嵌套另外一个查询,则此查询称为子查询
    语法结构如下:
   SELECT(DISTINCT)*|查询列1 别名1,查询列2 别名2...
   FROM 表名称1 别名1,表名称2 别名2(...一个完整的查询)
   (WHERE 条件)
   (...一个完整的查询)
   (GROUP BY 分组条件)(HAVING 分组条件)
   (ORDER BY 排序字段 ASC|DESC,排序字段 ASC|DESC)

范例:
  要求查询出比 empno 为7654工资要搞的全部雇员的信息
  
  分析:
  1、首先要查询出7654该员工的工资
  SELECT sal FROM emp WHERE empno=7654;
  
  2、查询比其工资高的雇员信息
  SELECT * FROM emp
  WHERE sal>(SELECT sal FROM emp WHERE empno=7654);
  
  所有的子查询必须在“()”中编写代码
  子查询在操作中分为以下三类:
   单列子查询:返回的结果是一列的一个内容(最多)
   单行子查询:返回多个列,有可能是一条完整的记录
   多行子查询:返回多条记录
 
范例;要求查询出工资比7654高,同时与7788从事相同工作的全部雇员的信息
 
 分析:1、查询出7654雇员的工资
     SELECT sal FROM emp WHERE empno=7654;
    
     2、查询出工作一样的雇员
     SELECT job FROM emp WHERE job=(SELECT job FROM emp WHERE empno=7788);
    
     3、综合查询
     SELECT * FROM EMP
     WHERE sal>(SELECT sal FROM emp WHERE empno=7654) and
     job =(SELECT job FROM emp WHERE empno=7788);

范例:要求查询出工资最低的雇员姓名、工作、和工资
     SELECT ename,job,sal
     FROM emp
     WHERE sal=(SELECT MIN(sal) FROM emp);
     
     以最低工资为条件进行下一步查询出其详细信息
     SELECT *
     FROM emp
     WHERE sal=(SELECT MIN(sal) FROM emp);

范例:要求查询出,部门名称、部门的员工数、部门的平均工资、部门的最低收入雇员的姓名;
  分析:程序需要两张表关联 dept emp
  1、如果要想求出每个部门的员工数量,及平均工资,则肯定需要使用分组统计,按照deptno进行分组,
  SELECT deptno ,COUNT(empno),AVG(sal)
  FROM emp
  GROUP BY deptno; 
  
  2、但是如果要查出来部门的名称,则需要与dept表进行关联,必须要去掉笛卡尔积
  所以我们要使用 第一步查询出来的结果(3条记录) 我们将它作为一张临时表 来查询
  我们给它一个别名为 ed
  
  SELECT d.dname,ed.c,ed.a
  FROM dept d,(SELECT deptno ,COUNT(empno) c,AVG(sal) a
         FROM emp
         GROUP BY deptno) ed
   WHERE d.deptno=ed.deptno;
   3、求出最高及最低收入的雇员姓名  因为关联了雇员姓名所以要通过sal字段来关联
   (如果此时在一个部门中同时出现2个工资最低的雇员则程序出错,该语句仅作语法研究)
   SELECT d.dname,ed.c,ed.a,e.ename
  FROM dept d,(SELECT deptno ,COUNT(empno) c,AVG(sal) a,
         MIN(sal) min
         FROM emp
         GROUP BY deptno) ed ,emp e
   WHERE d.deptno=ed.deptno and e.sal=ed.min;
   
在子查询中,存在以下三种查询的操作符号:
    1、IN
    2、ANY
    3、ALL
  
  IN 范例:求出每个部门的最低工资的雇员信息
     每个部门的最低工资,返回值肯定是多个,所以此时可以使用IN指定一个操作范围
    SELECT * FROM emp
    WHERE sal IN (SELECT MIN(sal) FROM emp GROUP BY deptno);
  
  ANY 操作
    =ANY:于IN德操作符功能完全一样
    >ANY: 比里面最小的值要大
    <ANY: 比里面最大的值要小
  
  ALL操作:
    >ALL: 比里面最大的值要大
    <ALL: 比里面最小的值要小
 
 对于子查询来讲,还可以进行多列子查询,一个子查询可以同时返回多个查询的列
 
 范例:
    SELECT sal,NVL(comm,-1)
    FROM emp
    WHERE (sal,NVL(comm,-1)) IN (SELECT sal,NVL(comm,-1) FROM emp WHERE deptno=20);

原创粉丝点击