警告:这是一个软问题,您将从刚开始自学SQL
的人那里回答。{1}}。我还没有设置我的数据库软件,所以我无法提供表来运行查询。需要一些耐心。
除了警告之外,我正在尝试基本的SQL
,但我有一点点粗略的时间在我的查询中得到关于子查询的内部工作方式及其执行顺序的明确答案
让我们说我的查询看起来像狗屎:
SELECT * FROM someTable
WHERE someFirstValue = someSecondValue
AND EXISTS (
SELECT * FROM someOtherTable
WHERE someTable.someFirstValue = someOtherTable.someThirdValue
)
;
我在这里的原因是因为我不认为我完全理解这个查询中发生了什么。
现在我不想看起来很懒,所以我不会要求你们告诉我这里发生了什么"所以相反,我和#39;首先提出我自己的理论:
检查someTable
中的第一行,看看someFirstValue
是否与该行中的someSecondValue
相同。
如果不是,它会进入第二行并检查它。它继续这样,直到一行通过这个小检查。
如果某行确实通过,则会打开一个新查询。如果此查询生成的表包含单行,则返回TRUE
,但如果它为空,则返回FALSE
。
我的理论在此结束,我的困惑开始了。
此内部查询现在只比较传递第一个WHERE
的行吗?或者它会检查所有项目someTable
和someOtherTable
?
改写;只会在WHERE
子查询中比较通过第一个someTable.someFirstValue = someOtherTable.someThirdValue
的行吗?
或者,子查询会将someTable
中的所有元素与someOtherTable
中的所有元素进行比较,无论哪个元素通过了第一个WHERE
,哪个没有?
更新:假设我使用的是MySQL 5.5.32。如果那很重要。
答案 0 :(得分:3)
答案是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
获取所有列,并在someThirdValue
中有相应的行,其中的表格列为someFirstValue
与someTable
"。
处理此查询的一种可能方法是扫描someFirstValue
并首先检查第一个条件。当两列匹配时,在someOtherTable(someThirdValue)
的索引中查找{{1}},如果值匹配则保留该行。正如我所说,这是一种方法,还有其他方法。