警告:這是一個軟性問題,您將從剛剛開始教導自己SQL
的人那裏回答問題。我還沒有設置數據庫軟件,所以我無法提供表來運行查詢。需要一些耐心。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
?
換句話說;只有通過第一個WHERE
的行才能在someTable.someFirstValue = someOtherTable.someThirdValue
子查詢中進行比較?
或者子查詢將someTable
中的所有元素與someOtherTable
中的所有元素進行比較,而不管哪個元素通過了第一個WHERE
,哪個沒有通過?
更新:假設我使用MySQL 5.5.32。如果這很重要。
優化器是一個複雜的玩具。所以它很大程度上取決於多種因素(包括mysql版本號),並且在某些情況下甚至可能會重寫查詢以成爲「JOIN」,然後改變它們的順序 – zerkms 2014-10-19 09:39:50
S-so人們的結論是......我們不會,知道嗎? – ViRALiC 2014-10-19 09:56:35
結論是:除非您考慮到數百萬個不同的因素(包括 - mysql配置,硬件,mysql版本,統計數據庫,數據庫模式...),否則您無法確定優化器將如何執行給定查詢。在另一種情況下,計劃可能看起來像是一件事情,在另一種情況下 - 就像完全不同的東西。 – zerkms 2014-10-19 10:01:23