相关子查询

相关子查询是指在查询过程中,子查询的执行依赖于外层查询的记录。本文介绍了相关子查询的概念、实例和执行过程,包括如何找出每个部门薪水最高的雇员以及判断哪些代码的工作没有雇员。相关子查询在SQL中用于复杂的数据筛选,虽然效率较低,但能解决特定查询问题。
相关子查询

1.概念:

子查询分为两种类型:独立子查询和相关子查询

      ①独立子查询是单独执行,其结果参与外层的查询,

         整个查询中子查询只执行一次,执行完后再执行外层查询;

      ②相关子查询是指子查询(内层查询)中引用了外层查询所引用表的字段,

         因此外层查询处理每一条记录时都必须执行一次子查询
         因为子查询中引用的字段的值发生了变化。


2. 例子:

例:找出每个部门中薪水最高的雇员,显示姓和薪水。
SELECT last_name,salary_amount
FROM employee ee
WHERE salary_amount =
(
SELECT MAX (salary_amount)
FROM employee em
WHERE ee.department_number = em.department_number
);

该子查询语句的执行过程如下:
1.读取雇员表的一条记录
2.执行子查询,得到该雇员所在部门的最高薪水数目
3.比较该雇员薪水和最高薪水
4.如果相等,输出该行信息
5.转到1

再举一个例子:查找薪水高于部门平均薪水的所有员工,显示姓和薪水。
SELECT last_name,salary_amount (Format ''$$$,$99.99'')
FROM  employee ee
WHERE salary_amount >
(
SELECT AVG (salary_amount)
FROM employee em
WHERE ee.department_number = em.department_number
);

该子查询的执行过程如下:

 1.读取employee表的一条记录

 2.执行子查询,得到该记录的雇员的所在部门的平均工资

 3.比较该雇员的薪水和部门平均薪水

 4.如果雇员薪水比部门平均薪水高,就输出该行信息

 5.转到1

用相关子查询的例子:
哪些代码的工作没有雇员?
  SELECT job_code
  FROM job
  WHERE job_code NOT IN  (SELECT job_code FROM employee) ;
 全部取出后  判定是否存在
 
如果使用NOT EXISTS表达式,可以写成:
  SELECT job_code
  FROM job
  WHERE NOT EXISTS (SELECT * FROM employee ee WHERE ee.job_code = job.job_code);
 
转自:http://blog.sina.com.cn/s/blog_49cb8da80100nh1r.html

=======================================================
以下来自另一文
=======================================================

Oracle子查询分类

1.非相关子查询:子查询的查询能够独立运行,不依赖于外部查询的数据和结果。
2.相关子查询:子查询引用了外部查询的列.
3.相关子查询的执行顺序:首先执行一次外部查询,对于外部查询中的每一行分别执行一次子查询,而且每次执行子查询时都会引用外部查询中当前的值,使用子查询的结果确定外部查询的结果集。

转自:http://blog.sina.com.cn/s/blog_63cf1113010160ea.html

=======================================================
以下来自另一文
       ======================================================= 
       

一、子查询:
为什么要学习使用子查询?
    1、弥补分组查询的限制
    2、体现SQL的“结构化”
    3、锻炼逻辑思维能力
    
二、子查询:嵌套在其他查询中的查询。又称内部查询,包含子查询的查询语句成为外部查询。
  所有的子查询可以被分为两个类型:相关子查询和非相关子查询。
 
三、相关/非相关子查询的特点和区别:
    1、非相关子查询:只执行一次;
    2、相关子查询:外部返回一条,内部执行一次。
    3、区分:相关查询依赖外面查询,不能单独查询。
    
四、子查询最简单的形式:内部查询为外部查询的每行返回一个单值,他通常做个一个结果插入到一个计算列。

五、 子查询返回结果集必须加别名;子查询同时也可以用于修改、删除。

六、where后的子查询:
    1、返回一个值
    2、返回多个值
    
七、针对子查询返回集合的操作符:
    1、使用not exists代替not in提供性能,exists后面总是跟着一个子查询,只要子查询返回了行,exists的值就为真。
    2、all运算符与子查询和比较运算符(如=、>或<=)一起使用。如果子查询返回的所有值都满足比较运算,那么比较表达式就为真。
    3、any与all的工作方式相同,不同的是:在子查询返回的值中,只要有一行满足比较运算,那么比较表达式就为真。
    
八、为什么子查询这么强大但是工作中却用得不多?
    因为子查询的效率低。

转自:http://blog.csdn.net/dujiayuan/article/details/5845568
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值