何为关联子查询?这里引用《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中的表子查询和关联子查询是SQL查询中两种重要的技术,它们在处理复杂的数据查询时发挥着关键作用。本文将深入探讨这两种子查询的概念、用法和优化策略。 首先,我们来看表子查询。表子查询指的是在一个查询中...
【Update语句更新与关联子查询】在数据库操作中,Update语句用于更新表中的已有数据,而关联子查询则是将一个查询嵌套在另一个查询的WHERE子句中,以根据某个条件从关联的表中获取数据。在某些复杂的场景下,我们...
SQL关联子查询是一种复杂但强大的查询机制,它允许在主查询中嵌套子查询,并根据主查询中的每一行数据来动态地执行子查询。在关联子查询中,信息的流动是双向的,这意味着外部查询的每一行数据都会传递一个值给内部...
在本篇文章中,我们将深入探讨MySQL子查询的用法,包括单行子查询、多行子查询、关联子查询以及它们在实际应用中的示例。 1. 单行子查询 单行子查询返回单个值,常用于WHERE子句中与外部查询的字段进行比较。例如,...
在数据库查询优化中,关联子查询是一种常见的操作,但它的性能往往不如预期。当涉及到大型数据表时,关联子查询可能导致显著的延迟。本文将深入探讨MySQL关联子查询的优化方法,通过实例来展示如何改进查询效率。 ...
单行子查询返回单个值,多行子查询返回一组值,而关联子查询则涉及到与外部查询的行进行比较。 1. **单行子查询**: 单行子查询返回一个单一的、确定的值,这个值可以用于与外部查询的字段进行比较。例如,我们...
子查询还可以分为三种子类型:多列子查询、关联子查询和嵌套子查询。多列子查询向外部的SQL语句返回多列。关联子查询引用外部的SQL语句中的一列或多列。在关联子查询中,可以使用EXISTS和NOT EXISTS操作符。嵌套子...
4. **关联子查询**:子查询可以与主查询的关联一起使用,用于更复杂的条件判断。 **原生SQL查询** 虽然Hibernate提供了ORM的方式,但有时我们可能需要使用原生的SQL查询来访问数据库,尤其是当ORM无法满足复杂需求...
- 关联子查询依赖于外部查询的每一行数据,每次执行时都会根据外部查询的当前行计算子查询。 - 常用于找出满足特定条件的最近、最大、最小等值。 5. **优化子查询**: - 使用索引:确保子查询涉及的列有适当的...
- **关联子查询**:子查询与外部查询之间有相关性,子查询的结果依赖于外部查询的值。 2. **子查询的使用示例:** 在给定的例子中,有三个表——T_YZCODE(颜值参数表)、T_SCCODE(身材参数表)和T_GIRL(超女...
ResolveSubquery可能涉及到将子查询与外部查询关联起来,以便正确地处理关联子查询。 2. **Analyze: CheckAnalysis**: 在这个阶段,SparkSQL会进行语义分析,确保查询的语法和逻辑正确。这包括检查子查询是否满足...
3. **关联子查询**:关联子查询,也称为嵌套循环子查询,涉及两个或更多表之间的关联。它将主查询的每一行与子查询的每一行进行比较。例如,找出每个部门的最高工资: ```sql SELECT e.department_id, MAX(e.salary...
此外,还有多列子查询(返回多列结果)、关联子查询(涉及外部查询的列)和嵌套子查询(子查询中包含子查询)。 在WHERE子句中使用子查询是一种常见做法,其基本结构为:SELECT...FROM...WHERE...OPERATOR (SELECT....
3. **关联子查询**:也称为嵌套查询,它将外部查询和内部查询关联起来,根据内部查询的结果来处理外部查询。例如,找出每个部门中工资最高的员工。 4. **存在子查询**:检查内部查询是否返回至少一行数据。如果返回...
yiibaidb.sql文件可能包含的示例将涵盖这些情况和其他复杂用法,比如嵌套子查询、使用IN和NOT IN操作符、比较子查询以及关联子查询等。通过实践这些示例,你可以深入理解如何在实际环境中有效地使用MySQL子查询来...
- **关联子查询**:在JOIN操作中,子查询可以帮助简化复杂的表关联逻辑。 3. **Java中的子查询操作**: - **预编译语句(PreparedStatement)**:Java通过PreparedStatement对象可以安全高效地执行包含子查询的...
- **关联子查询**:也称为嵌套查询,其结果与外部查询的每一行进行比较。 - **集合子查询**:返回一个集合,可以与主查询的集合操作符(如UNION、INTERSECT、EXCEPT)配合使用。 2. **子查询位置**: - **SELECT...