2014-10-19 64 views
0

警告:這是一個軟性問題,您將從剛剛開始教導自己SQL的人那裏回答問題。我還沒有設置數據庫軟件,所以我無法提供表來運行查詢。需要一些耐心。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

換句話說;只有通過第一個WHERE的行才能在someTable.someFirstValue = someOtherTable.someThirdValue子查詢中進行比較?

或者子查詢將someTable中的所有元素與someOtherTable中的所有元素進行比較,而不管哪個元素通過了第一個WHERE,哪個沒有通過?

更新:假設我使用MySQL 5.5.32。如果這很重要。

+3

優化器是一個複雜的玩具。所以它很大程度上取決於多種因素(包括mysql版本號),並且在某些情況下甚至可能會重寫查詢以成爲「JOIN」,然後改變它們的順序 – zerkms 2014-10-19 09:39:50

+0

S-so人們的結論是......我們不會,知道嗎? – ViRALiC 2014-10-19 09:56:35

+3

結論是:除非您考慮到數百萬個不同的因素(包括 - mysql配置,硬件,mysql版本,統計數據庫,數據庫模式...),否則您無法確定優化器將如何執行給定查詢。在另一種情況下,計劃可能看起來像是一件事情,在另一種情況下 - 就像完全不同的東西。 – zerkms 2014-10-19 10:01:23

回答

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並首先檢查第一個條件。當兩列匹配時,請在someOtherTable(someThirdValue)的索引中查找someFirstValue,如果值匹配,則保留行。正如我所說,這是一種方法,還有其他方法。