《Oracle Database 11g SQL 开发指南》学习笔记——第六章__子查询

6.1、子查询类型:  

         单行子查询、多行子查询、多列子查询、关联子查询、嵌套子查询

6.2、编写单行子查询: 不向外部SQL语句返回结果,或者值返回一行。

                                      可放在where、having、from子句中。
 6.2.1、where子句中一般使用“=”操作符,也可以使用<>、>、<、>=、<=等单行操作符。
 6.2.2、在having子句中使用子查询;  可以基于子查询返回结果对行组进行过滤。
   select   product_id   AVG(price)   from   products
   group  by   product_id   
   having    AVG(price)  <   (select  MAX(AVG(price))  from  products  group by   product_id )
   order by   product_id;
 6.2.3、在from子句中使用子查询(内联视图)如:
   在外部查询中从products表中检索product_id和price列,在子查询中检索一种产品已经被购买的次数:
   SELECT  prds.product_id , price , purchases_data.pri=product_count
   FROM  products prds , ( SELECT product_id , COUNT( product_id ) product_count
              FROM  purchases
              GROUP  BY  product_id )  purchases_data
   WHERE  prds.product_id = purchases_data.product_id ;
 6.2.4、可能遇到的错误;
    1、单行子查询最多返回一行     2、子查询不能包含ORDER BY 子句
    
6.3、编写多行子查询:可以向外部的SQL语句返回一行或多行记录。

                                      外部查询可以使用IN、 ANY 、ALL操作符
  SELECT employee_id ,name FROM employees
   WHERE salary < ANY  ( SELECT low_salary FROM salary_grades )
  
6.4、编写多列子查询:   

          SELECT product_id ,product_type_id, name, price
          FROM products
          WHERE  ( product_type_id, price )  IN

                         ( SELECT  product_type_id, MIN(price)

                         FROM  products   GROUP BY product_type_id );
                         
6.5、编写关联子查询:  引用外部SQL语句中的一列或者多列。
  关联子查询对于外部查询的每一行都会运行一次,和可以解决空值问题,

  而非关联子查询只在运行外部查询之前运行一次
 6.5.1、EXISTS操作符用于检查子查询返回的行的存在性。

            虽然它也可以用在非关联子查询,但是EXISTS通常用于关联子查询。
  由于EXISTS只检查子查询返回行的存在性,因此子查询不必返回一列,

  可以只返回一个常量;这样可以提高查询性能。
  例如:SELECT employee_id , name  FROM  employees outer 
         Where  EXISTS  ( SELECT  1  FROM employees inner
                   WHERE  inner.manager_id = outer.employee_id );
 6.5.2、EXISTS 与IN 不同:EXISTS只检查行的存在性,而IN则要检查实际值的存在性。
    1、通常来讲,EXISTS的性能高于IN,因此尽可能使用EXISTS。
    2、当一个值列表包含一个空值时NOT EXISTS返回TRUE,而 NOT IN则返回FALSE。
    
6.6、编写嵌套子查询:

        在子查询内部可以嵌套其他子查询,嵌套层次做多为255;但编程时应尽量避免使用。

6.7、编写包含子查询的UPDATE 和DELETE 语句;
   UPDATE  employees

   SET  salary = ( SELECT  AVG(high_salary)  FROM  salary_grades ) 

    WHERE  employee_id = 4;
   删除工资高于从子查询中返回的高工资级别平均值的员工记录:
   DELETE  FROM emplyees 

   WHERE  salary > ( SELECT  AVG(high_salary)  FROM  salary_grades ) 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介   本书是专门为oracle应用开发人员提供的sqlpl/sql编程指南。通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法,而且可以掌握sql语句和pl/sql的各种基础知识和高级特征(记录类型、集合类型、对象类型、大对象类型)。   除了为读者提供编写sql语句和开发pl/sql块的方法外,本书还为应用开发人员提供了一些常用的pl/sql系统包。通过使用这些pl/sql系统包,应用开发人员可以开发出功能更强大的数据库应用程序。本书不仅适合sqlpl/sql初学者,也适合于有经验的oracle应用开发人员。 前言 第一部分 sqlpl/sql相关工具  第1章 在windows 平台上安装oracle database 11g  第2章 配置网络服务名  第3章 使用sql database  第4章 使用sql*plus 第二部分 sql  第5章 sqlpl/sql综述  第6章 简单查询  第7章 sql单行函数  第8章 操纵数据  第9章 复杂查询  第10章 管理常用对象 第三部分 pl/sql  第11章 pl/sql基础  第12章 访问oracle  第13章 编写控制结构  第14章 使用复合数据类型  第15章 使用游标  第16章 异常处理 . 第17章 本地动态sql  第18章 pl/sql过程  第19章 pl/sql函数  第20章 pl/sql包  第21章 触发器  第22章 使用对象类型 第四部分 pl/sql系统包  第23章 使用大对象  第24章 读写os文件  第25章 开发多媒体应用  第26章 开发web应用  第27章 dbms_sq动态sql  第28章 管理统计  第29章 使用数据库资源管理器  第30章 数据加密和解密  第31章 使用调度程序  第32章 使用flashback  第33章 使用重定义联机表  第34章 修正损坏块  第35章 使用日里民挖掘  第36章 使用管道  第37章 使用精细访问控制  第38章 使用精细审计  第39章 使用预警事件  第40章 转换rowid  第41章 其他常用包 习题答案

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值