相关子查询(correlated subquery) 与非相关子查询

来源:互联网 发布:砸金蛋程序源码 编辑:程序博客网 时间:2024/05/22 15:15

 

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 NOTIN  (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);


l另一个例子

SELECT o1.CustomerID, o1.OrderID, o1.OrderDate
FROM Orders o1
WHERE o1.OrderDate =
(SELECT Max(OrderDate)
FROM Orders o2
WHERE o2.CustomerID = o1.CustomerID)



0 0
原创粉丝点击