重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4340|回复: 2
打印 上一主题 下一主题

【课堂笔记】【SQL】17.Retrieving Data Using Subqueries

[复制链接]
跳转到指定楼层
楼主
发表于 2012-11-5 17:09:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

IN的主查询,成对比较。

……WHERE (manager_id,department_id) in ((1,2),(3,4),……);

 

标量子查询:

示例:

SQL> select employee_id,last_name from employees e
  2  order by (select department_name from departments d
  3  where e.department_id=d.department_id);

EMPLOYEE_ID LAST_NAME
----------- -------------------------
        205 Higgins
        206 Gietz
        200 Whalen
        100 King
        101 Kochhar
        102 De Haan
        112 Urman
        108 Greenberg
        109 Faviet
        110 Chen
        111 Sciarra

EMPLOYEE_ID LAST_NAME
----------- -------------------------
        113 Popp
        203 Mavris
        107 Lorentz
        105 Austin
        103 Hunold

 

关联子查询:

语句的解析过程如图

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

沙发
 楼主| 发表于 2012-11-5 17:21:43 | 只看该作者

续:

EXISTS存在:功能有点类似IN。  NOT EXISTS就是不存在。

如果找到一条匹配的记录,则不再继续往子查询的查找。与IN比起来还是有很大优点的。

示例: 

SELECT employee_id, last_name, job_id, department_id
FROM   employees outer
WHERE  EXISTS ( SELECT 'X'
                 FROM   employees
                 WHERE  manager_id =
                        outer.employee_id);
 
关联更新:
示例:
 
UPDATE empl6 e
SET    department_name =
              (SELECT department_name
       FROM   departments d
       WHERE  e.department_id = d.department_id);
 
关联删除:
示例:
 
DELETE FROM empl6 E
WHERE employee_id = 
           (SELECT employee_id
            FROM   emp_history
            WHERE  employee_id = E.employee_id);

 

 

WITH,将同样的查询块定义起来将其结果放在临时表空间中,这样重复使用可以提供效率。注意,必须先定义再使用。

示例:


SQL> with
  2  dept_costs as
  3  (select d.department_name,sum(e.salary) as dept_total
  4  from employees e join departments d
  5  on e.department_id=d.department_id
  6  group by d.department_name),
  7  avg_cost as
  8  (select sum(dept_total)/count(*) as dept_avg
  9  from dept_costs)
 10  select * from dept_costs where dept_total>(select dept_avg
 11  from avg_cost)
 12  order by department_name;

DEPARTMENT_NAME                DEPT_TOTAL
------------------------------ ----------
Sales                              304500
Shipping                           156400

 

 

 

 

 
 
回复 支持 反对

使用道具 举报

板凳
发表于 2013-5-6 11:55:22 | 只看该作者

另外一个说法 是exists操作符  只要子查询返回结果 不论这个结果是null 还是其他值 立刻返回。

同样 in  无论是否已经找到结果 会遍历子查询的结果集

实际工作中,exists和in都可以使用情况下,针对oltp,前者和后则的表现查询非常巨大。

子查询返回结果集越大,in就性能就越差。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-5-16 09:29 , Processed in 0.118090 second(s), 23 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表