![](/img/trans.png)
[英]Order of execution in MySQL query with multiple JOINS of subqueries
[英]SQL newbie: execution order of subqueries?
警告:這是一個軟問題,您將在這里回答剛開始自學SQL
的人。 我尚未設置數據庫軟件,因此無法提供用於運行查詢的表。 需要一些耐心。
除了警告,我正在嘗試基本的SQL
但是我花了一些時間來獲得有關子查詢內部工作及其查詢順序的明確答案。
讓我們說我的查詢看起來像狗屎:
SELECT * FROM someTable
WHERE someFirstValue = someSecondValue
AND EXISTS (
SELECT * FROM someOtherTable
WHERE someTable.someFirstValue = someOtherTable.someThirdValue
)
;
我在這里的原因是因為我不完全了解此查詢中發生的情況。
現在,我不想顯得懶惰,所以我不再要你們“告訴我這里發生了什么”,因此,我將首先提供自己的理論:
在第一行someTable
檢查,以便查看是否someFirstValue
相同someSecondValue
那排。
如果不是,它將進入第二行並進行檢查。 這樣繼續下去,直到一行通過這個小檢查為止。
如果沒有通過,它將打開一個新查詢。 如果此查詢生成的表僅包含一行,則返回TRUE
,但如果為空,則返回FALSE
。
我的理論到此結束,我的困惑開始了。
現在,此內部查詢將僅比較通過第一個WHERE
的行嗎? 還是會檢查所有項目someTable
和someOtherTable
?
改寫; 將只在someTable.someFirstValue = someOtherTable.someThirdValue
子查詢中比較通過第一個WHERE
的行?
還是子查詢將someTable
中的所有元素與someOtherTable
所有元素進行比較,而不管哪個傳遞了第一個WHERE
,哪個沒有傳遞?
更新:假設我正在使用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
中有對應的行,其中表列someThirdValue
與someFirstValue
相同”。
處理此查詢的一種可能方法是掃描someTable
並首先檢查第一個條件。 當兩列匹配時,然后在someOtherTable(someThirdValue)
的索引中查找someFirstValue
,如果值匹配,則保留該行。 正如我所說,這是一種方法,還有其他方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.