`
米奈希尔
  • 浏览: 268810 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

关联子查询

阅读更多

    何为关联子查询?这里引用《Oracle Database 10g SQL开发指南》中的解释:

  关联子查询会引用外部查询中的一列或多列。这种子查询之所以被称为关联子查询,是因为子查询的确与外部查询有关。当问题的答案需要依赖于外部查询中包含的每一行中的值时,通常就需要使用关联子查询。

 

    products表中有如下数据:

SQL> SELECT * FROM products;
 
PRODUCT_ID PRODUCT_TYPE_ID NAME                   DESCRIPTION            PRICE
---------- --------------- ---------------------- -------------------- -------
         1               1 Modern Science         A description of mod   19.95
                                                  ern science          
 
         2               1 Chemistry              Introduction to Chem   30.00
                                                  istry                
 
         3               2 Supernova              A star explodes        25.99
         4               2 Tank War               Action movie about a   13.95
                                                   future war          
 
         5               2 Z Files                Series on mysterious   49.99
                                                   activities          
 
         6               2 2412: The Return       Aliens return          14.95
         7               3 Space Force 9          Adventures of heroes   13.49
         8               3 From Another Planet    Alien from another p   12.99
                                                  lanet lands on Earth 
 
         9               4 Classical Music        The best classical m   10.99
                                                  usic                 
 
        10               4 Pop 3                  The best popular mus   15.99
                                                  ic                   
 
        11               4 Creative Yell          Debut album            14.99
        12                 My Front Line          Their greatest hits    13.49
 
12 rows selected

    现在,我们想查询检索那些价格高于同类产品的平均价格的产品。

 

1. 联表查询

    最初,我写查询时想到的是联表查询,SQL如下:

SELECT product_id, name, price
  FROM products p,
       (SELECT product_type_id, AVG(price) avg_price
          FROM products
         GROUP BY product_type_id) pa
 WHERE p.product_type_id = pa.product_type_id
   AND p.price > pa.avg_price;

    将同类产品的平均价格作为内联视图,然后联表查询。这种方式很容易想到,写起来也不难。

 

2. 关联子查询

    SQL如下:

SELECT product_id, name, price
  FROM products
 outer WHERE price >
             (SELECT AVG(price)
                FROM products
               inner WHERE outer.product_type_id = inner.product_type_id
             );

现在对这个SQL做个解释,来自上面提到的书:

  这个查询中使用了两个别名:outer用来标记外部查询,inner用来标记内部查询。内部查询和外部查询使用product_type_id列关联起来。
  在关联子查询中,外部查询中的每一行都被一次一行地传递给子查询。子查询依次读取外部查询中的每一行的值,并将其应用到子查询上,直到外部查询中的所有的行都被处理完为止。然后返回整个查询结果。
  在前面这个例子中,外部查询从products表中检索出所有的行,并将其传递给内部查询。内部查询依次读取外部查询传递来的每一行数据,并对内部查询中product_type_id等于外部查询中product_type_id值得每种产品计算平均价格。

 

一点思考

    按照上面的解释,使用关联子查询时,每种产品的平均价格会被多次计算,因为products表中有重复的product_type_id列,而使用联表查询只会被计算1次。那么哪种性能高呢?

    在PLSQL上测试发现,两种方法时间相同,都是0.016 seconds。

    也许,SQL语句被优化了,也可能是关联子查询缓存了每次子查询的结果。

分享到:
评论

相关推荐

    MySQL中表子查询与关联子查询的基础学习教程

    MySQL中的表子查询和关联子查询是SQL查询中两种重要的技术,它们在处理复杂的数据查询时发挥着关键作用。本文将深入探讨这两种子查询的概念、用法和优化策略。 首先,我们来看表子查询。表子查询指的是在一个查询中...

    利用带关联子查询Update语句更新数据的方法

    【Update语句更新与关联子查询】在数据库操作中,Update语句用于更新表中的已有数据,而关联子查询则是将一个查询嵌套在另一个查询的WHERE子句中,以根据某个条件从关联的表中获取数据。在某些复杂的场景下,我们...

    SQL关联子查询的详解

    SQL关联子查询是一种复杂但强大的查询机制,它允许在主查询中嵌套子查询,并根据主查询中的每一行数据来动态地执行子查询。在关联子查询中,信息的流动是双向的,这意味着外部查询的每一行数据都会传递一个值给内部...

    mysql子查询的用法

    在本篇文章中,我们将深入探讨MySQL子查询的用法,包括单行子查询、多行子查询、关联子查询以及它们在实际应用中的示例。 1. 单行子查询 单行子查询返回单个值,常用于WHERE子句中与外部查询的字段进行比较。例如,...

    mysql关联子查询的一种优化方法分析

    在数据库查询优化中,关联子查询是一种常见的操作,但它的性能往往不如预期。当涉及到大型数据表时,关联子查询可能导致显著的延迟。本文将深入探讨MySQL关联子查询的优化方法,通过实例来展示如何改进查询效率。 ...

    25.6 MySQL 子查询

    单行子查询返回单个值,多行子查询返回一组值,而关联子查询则涉及到与外部查询的行进行比较。 1. **单行子查询**: 单行子查询返回一个单一的、确定的值,这个值可以用于与外部查询的字段进行比较。例如,我们...

    Oracle数据库应用教程--子查询与高级查询.pptx

    子查询还可以分为三种子类型:多列子查询、关联子查询和嵌套子查询。多列子查询向外部的SQL语句返回多列。关联子查询引用外部的SQL语句中的一列或多列。在关联子查询中,可以使用EXISTS和NOT EXISTS操作符。嵌套子...

    oracle子查询相关帮助

    - 关联子查询依赖于外部查询的每一行数据,每次执行时都会根据外部查询的当前行计算子查询。 - 常用于找出满足特定条件的最近、最大、最小等值。 5. **优化子查询**: - 使用索引:确保子查询涉及的列有适当的...

    Hibernate 函数 ,子查询 和原生SQL查询

    4. **关联子查询**:子查询可以与主查询的关联一起使用,用于更复杂的条件判断。 **原生SQL查询** 虽然Hibernate提供了ORM的方式,但有时我们可能需要使用原生的SQL查询来访问数据库,尤其是当ORM无法满足复杂需求...

    25.Oracle子查询1

    - **关联子查询**:子查询与外部查询之间有相关性,子查询的结果依赖于外部查询的值。 2. **子查询的使用示例:** 在给定的例子中,有三个表——T_YZCODE(颜值参数表)、T_SCCODE(身材参数表)和T_GIRL(超女...

    SparkSQL子查询源码阅读1

    ResolveSubquery可能涉及到将子查询与外部查询关联起来,以便正确地处理关联子查询。 2. **Analyze: CheckAnalysis**: 在这个阶段,SparkSQL会进行语义分析,确保查询的语法和逻辑正确。这包括检查子查询是否满足...

    03.hive查询语法--子查询.zip

    3. **关联子查询**:关联子查询,也称为嵌套循环子查询,涉及两个或更多表之间的关联。它将主查询的每一行与子查询的每一行进行比较。例如,找出每个部门的最高工资: ```sql SELECT e.department_id, MAX(e.salary...

    子查询与高级查询PPT学习教案.pptx

    此外,还有多列子查询(返回多列结果)、关联子查询(涉及外部查询的列)和嵌套子查询(子查询中包含子查询)。 在WHERE子句中使用子查询是一种常见做法,其基本结构为:SELECT...FROM...WHERE...OPERATOR (SELECT....

    易语言学习进阶子查询

    3. **关联子查询**:也称为嵌套查询,它将外部查询和内部查询关联起来,根据内部查询的结果来处理外部查询。例如,找出每个部门中工资最高的员工。 4. **存在子查询**:检查内部查询是否返回至少一行数据。如果返回...

    MySQL子查询示例数据库

    yiibaidb.sql文件可能包含的示例将涵盖这些情况和其他复杂用法,比如嵌套子查询、使用IN和NOT IN操作符、比较子查询以及关联子查询等。通过实践这些示例,你可以深入理解如何在实际环境中有效地使用MySQL子查询来...

    MLDN魔乐科技JAVA培训_Oracle课堂11_子查询.rar

    - **关联子查询**:在JOIN操作中,子查询可以帮助简化复杂的表关联逻辑。 3. **Java中的子查询操作**: - **预编译语句(PreparedStatement)**:Java通过PreparedStatement对象可以安全高效地执行包含子查询的...

    MLDN魔乐科技_Oracle课堂11_子查询

    - **关联子查询**:也称为嵌套查询,其结果与外部查询的每一行进行比较。 - **集合子查询**:返回一个集合,可以与主查询的集合操作符(如UNION、INTERSECT、EXCEPT)配合使用。 2. **子查询位置**: - **SELECT...

Global site tag (gtag.js) - Google Analytics