oracle9i学习笔记之十六 高级子查询

2023-12-16 21:32

本文主要是介绍oracle9i学习笔记之十六 高级子查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 1.子查询回顾
 
  SELECT   select_list
  FROM     table
  WHERE    expr operator(SELECT  select_list
                         FROM    table);

例1:查询emp表,显示薪水大于平均薪水的雇员信息

     SELECT *
     FROM   emp
     WHERE  sal>(SELECT AVG(sal)
                 FROM   emp);

例2:显示雇员的细节信息,要求这些雇员的经理和部门与雇员号为7521或7698是相同的,但不包括empno为7521或7698的雇员信息
   
   SELECT *
   FROM   emp
   WHERE  (mgr,deptno) IN(SELECT mgr,deptno
                          FROM   emp
                          WHERE  empno IN(7521,7698))
   AND    empno NOT IN(7521,7698);

例3:显示与薪水大于2900元的雇员相同部门、相同工作类型的其他雇员信息
     
     SELECT *
     FROM   emp
     WHERE  (deptno,job) IN(SELECT deptno,job
                            FROM   emp
                            WHERE  sal>2900)
     AND    sal<=2900;

例4:显示与薪水大于2900元的雇员相同部门、相同工作类型的其他雇员信息(在FROM子句中使用子查询)

    SELECT *
    FROM   emp e,(SELECT deptno,job,sal
                  FROM   emp
                  WHERE  sal>2900) s
    WHERE e.deptno=s.deptno
    AND   e.job=s.job
    AND   e.sal!=s.sal;

2.相关子查询
1)相关子查询是一种读表中每一行并且依靠相关数据比较每行的值的方法,相关子查询被用于row-by-row处理。对外查询的每一行,每个子查询被执行一次。
2)嵌套子查询与相关子查询
  (1)嵌套子查询的执行
     -内查询首先执行并且查找值
     -外查询用内查询的值执行一次
  (2)相关子查询的执行
     -用外查询取得候选行
     -用候选行的值执行内查询
     -用来自内查询的值确认或取消候选行
     -重复直到无剩余的候选行  

   SELECT column1,column2,...
   FROM   table1 outer
   WHERE  column1 operator(SELECT column1,column2
                           FROM   table2
                           WHERE  expr1=outer.expr2)                    

例:找出所有的雇员,他们挣的薪水高于该部门的平均薪水

    SELECT ename,deptno,sal
    FROM   emp outer
    WHERE  sal>(SELECT AVG(sal)
                FROM   emp
                WHERE  deptno=outer.deptno);
结果:
      ENAME  DEPTNO  SAL 
      ALLEN    30    1600 
      JONES    20    2975 
      BLAKE    30    2850 
      SCOTT    20    3000 
      KING     10    5000 
      FORD     20    3000 
      小王     10    3000 


3.EXISTS操作
  EXISTS操作对在子查询的结果集中存在的行进行检验:
  1)如果一个子查询行值被找到:
    -在内查询中的搜索不再继续
    -条件被标记为TRUE
  2)如果一个子查询行值未找到
    -条件被标记为FALSE
    -在内查询中的搜索继续

例:查找至少有一个雇员的经理信息
   
    SELECT *
    FROM   emp outer
    WHERE  EXISTS(SELECT 'X'
                  FROM   emp
                  WHERE  mgr=outer.empno);
结果:
     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 


4.NOT EXISTS操作
例:查找部门编号不在雇员表中的部门信息

   SELECT *
   FROM   dept
   WHERE  NOT EXISTS(SELECT *
                     FROM   emp
                     WHERE  emp.deptno=dept.deptno);
  

5.相关UPDATE
  -用一个相关子查询来更新一个表中的行,该表中的行基于另一个表中的行

  UPDATE table1 alias1
  SET    column=(SELECT expression
                 FROM   table2 alias2
                 WHERE  alias1.column=alias2.column);

例:1.在雇员表中增加部门名称列
  
     ALTER TABLE emp
     ADD   (dname VARCHAR2(14));

   2.使用部门表中的部门名称更新雇员表中的部门名称

     UPDATE emp e
     SET    dname=(SELECT dname
                   FROM   dept d
                   WHERE  e.deptno=d.deptno);

6.相关delete
  -用一个相关子查询来删除一个表中的行,该表中的行基于另一个表中的行
 
  DELETE FROM table1 alias1
  WHERE  column operator(SELECT expression
                         FROM   table2 alias2
                         WHERE  alias1.column=alias2.column);

例:用一个相关子查询删除emp表中的数据,被删除的数据是emp表和job_history表中有相同empno列值的数据
   
    DELETE FROM emp e
    WHERE  empno IN (SELECT empno
                     FROM   job_history
                     WHERE  empno=e.empno);

7.WITH子句
1)当一个查询块在一个复杂的查询中出现多次时,使用WITH子句,能够用在SELECT语句中使用相同查询块
2)WITH子句取回查询块的结果,并且将它存在用户的临时表空间中
3)WITH子句可以改善性能 

例:用WITH子句,写一个查询来显示部门名称和该部门的合计薪水,那些人的合计薪水高于各部门的平均薪水

   WITH
   dept_costs AS(
       SELECT   d.dname,SUM(e.sal) AS dept_total
       FROM     emp e,dept d
       WHERE    e.deptno=d.deptno
       GROUP BY d.dname),
   avg_costs AS(
       SELECT SUM(dept_total)/COUNT(*) AS dept_avg
       FROM   dept_costs)
   SELECT *
   FROM   dept_costs
   WHERE  dept_total>(SELECT dept_avg
                      FROM   avg_costs)
   ORDER BY dname;
结果:
      DNAME        DEPT_TOTAL 
      ACCOUNTING   11750 
      RESEARCH     14075 

练习
1.显示变换过至少两次工作的雇员的详细情况(emp和job_history)

 

2.写一个子查询显示任何一个其部门号和薪水都与任何挣佣金的雇员的部门号和薪水相匹配的雇员的名字、部门号和薪水

  SELECT ename,deptno,sal
  FROM   emp
  WHERE  (deptno,sal) IN(SELECT deptno,sal
                         FROM   emp
                         WHERE  comm IS NOT NULL);

3.显示任何其薪水和佣金与任何位于loc为CHICAGO的雇员薪水和佣金相匹配的雇员的名字、部门名和薪水
 
  SELECT ename, dname, sal
  FROM emp e, dept d
  WHERE e.deptno = d.deptno
  AND (sal, NVL(comm,0)) IN (SELECT sal, NVL(comm,0)
        FROM emp e, dept d
        WHERE e.deptno = d.deptno
        AND d.loc = 'CHICAGO');

4.创建一个查询来显示所有其薪水和佣金与SCOTT相同的雇员的名字、受雇日期和薪水(不显示SCOTT的信息)
 
  SELECT ename,hiredate,sal
  FROM   emp
  WHERE  (sal,NVL(comm,0)) IN (SELECT sal,NVL(comm,0)
                                 FROM emp
                                WHERE ename='SCOTT')
  AND   ename!='SCOTT';


5.创建一个查询来显示那些所挣薪水高于所有经理(job='MANAGER')的雇员的名字、工作岗位和薪水。依据薪水从最高到最低排序结果集

  SELECT ename,job,sal
  FROM   emp
  WHERE  sal>ALL (SELECT sal
                  FROM   emp
                  WHERE  job='MANAGER')
  ORDER BY sal DESC;

6.显示那些住在城市名字以N开头的城市的雇员的ID、名字和部门号

  SELECT empno,ename,deptno
  FROM   emp
  WHERE  deptno IN(SELECT deptno
                   FROM   dept
                   WHERE  loc LIKE 'N%');


7.写一个查询来查找所有其薪水多于他所在部门的平均薪水的雇员,显示名字、部门号和部门的平均薪水,按平均薪水排序

  SELECT ename,e.deptno,sal,a.avg
  FROM   emp e,(SELECT   deptno,AVG(sal) avg
                  FROM    emp
                 GROUP BY deptno) a
  WHERE e.deptno=a.deptno
  AND   e.sal>a.avg
  ORDER BY a.avg;

8.写一个查询显示所挣薪水低于他们所在的部门平均薪水的雇员名

  SELECT ename
 FROM emp outer
 WHERE sal< (SELECT AVG(sal)
      FROM emp inner
             WHERE deptno = outer.deptno);
  或:
  SELECT ename
         FROM emp outer
  WHERE outer.sal< (SELECT AVG(inner.sal)
      FROM   emp inner
             WHERE  inner.deptno = outer.deptno);

9.查找所有不是管理人员的雇员(雇员编号不在经理编号列的雇员)

  SELECT *
  FROM   emp
  WHERE  empno NOT IN(SELECT mgr
                      FROM   emp
                      WHERE  mgr IS NOT NULL);
  或:
  SELECT *
  FROM   emp outer
  WHERE  NOT EXISTS(SELECT 'X'
                    FROM   emp
                    WHERE  mgr=outer.empno);
  或:
  SELECT *
  FROM   emp
  WHERE  empno NOT IN (SELECT NVL(mgr,0)
                       FROM   emp);

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/luyangever/archive/2008/12/13/3510764.aspx

这篇关于oracle9i学习笔记之十六 高级子查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/501957

相关文章

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

mysql中的group by高级用法详解

《mysql中的groupby高级用法详解》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,本文给大家介绍mysql中的groupby... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4