gpt4 book ai didi

mysql - SQL 新手 : execution order of subqueries?

转载 作者:太空宇宙 更新时间:2023-11-03 12:06:17 24 4
gpt4 key购买 nike

警告:这是一个软问题,您将在这里回答刚开始从头开始自学 SQL 的人。我还没有设置我的数据库软件,所以我不能提供表来运行查询。需要一些耐心。

撇开警告不谈,我正在试验基本的 SQL,但我在获得有关子查询的内部工作及其在我的查询中的执行顺序的明确答案时遇到了一些困难。

假设我的查询看起来很糟糕:

SELECT * FROM someTable

WHERE someFirstValue = someSecondValue

AND EXISTS (

SELECT * FROM someOtherTable

WHERE someTable.someFirstValue = someOtherTable.someThirdValue
)

;

我来这里的原因是因为我不认为我完全理解这个查询中发生了什么。

现在我不想显得懒惰,所以我不会要求你们“告诉我这里发生了什么”,所以我先提供我自己的理论:

  1. 检查 someTable 中的第一行,查看 someFirstValue 是否与该行中的 someSecondValue 相同。

  2. 如果不是,它会转到第二行并进行检查。如此继续下去,直到一行通过这个小小的检查。

  3. 如果一行确实通过,它会打开一个新查询。如果此查询生成的表只包含一行,则返回 TRUE,但如果为空,则返回 FALSE

我的理论到此结束,我的困惑开始了。

这个内部查询现在是否只比较通过第一个 WHERE 的行?或者它会检查所有项目 someTablesomeOtherTable 吗?

改写;在 someTable.someFirstValue = someOtherTable.someThirdValue 子查询中是否只比较通过第一个 WHERE 的行?

或者子查询会将 someTable 中的所有元素与 someOtherTable 中的所有元素进行比较,而不管哪个通过了第一个 WHERE 而哪个没有通过't?

更新:假设我使用的是 MySQL 5.5.32。如果这很重要。

最佳答案

答案是 SQL 是一种描述性语言,用于描述查询生成的结果集。它没有指定查询将如何运行。

在您的情况下,查询有几个关于它可能如何运行的选项,具体取决于数据库引擎、表的外观和索引。查询本身:

SELECT t.*
FROM someTable t
WHERE t.someFirstValue = t.someSecondValue AND
EXISTS (SELECT *
FROM someOtherTable t2
WHERE t.someFirstValue = t2.someThirdValue
);

说:“从 SomeTable 中获取所有列,其中 someFirstValue = someSecondValue 并且在 someOtherTable 中有一个对应的行,这是表列 someThirdValuesomeFirstValue 相同。

处理此查询的一种可能方法是扫描 someTable 并首先检查第一个条件。当两列匹配时,然后在 someOtherTable(someThirdValue) 的索引中查找 someFirstValue,如果值匹配则保留该行。正如我所说,这是一种方法,还有其他方法。

关于mysql - SQL 新手 : execution order of subqueries?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26449208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com