Mysql

對執行SQL的順序感到困惑

  • December 27, 2021

我有這個 SQL 查詢,誰能幫我確定執行順序,比如先執行哪個子句,然後最後執行:

SELECT COUNT(*),
      (SELECT COUNT(*)
         FROM recent_grads
      )
 FROM recent_grads
WHERE ShareWomen > (SELECT AVG(ShareWomen)
                      FROM recent_grads
                   );
  1. 我知道第 5 行中的“FROM”子句首先執行,因為它告訴我們的查詢我們將使用的表或數據集稱為“recent_grads”。
  2. 然後我認為“WHERE”子句第二個執行,而在 WHERE 子句中,子查詢首先執行。當子查詢執行時,子查詢被某個值替換。然後我們有一個適當的過濾器語句。
  3. 我認為執行的第三個子句是第一行的“SELECT”子句,在該子句中,語句“SELECT COUNT()”首先執行,它返回過濾的行數。然後執行子查詢,它返回數據集中沒有過濾器的行數,即原始行數。

有人可以告訴我我的執行順序是否正確,當呼叫“SELECT”子句時我不確定第三個,我想知道 SELECT 子句中的子查詢是先執行還是 COUNT() 函式本身首先被執行。

(我說的幾乎和你說的一樣,但我說的更籠統地說是關於 a 的執行SELECT。)

如果沒有任何子查詢,則 a 的子句SELECT必須按照它們被查看的順序排列。(而且您不能打亂順序。)例外情況是 中的列SELECT至少在 . 之後才會使用FROM

子查詢可以是“相關的”,這意味著它引用外部查詢中的列,也可以是“不相關的”,就像您的兩個子查詢一樣。對於“相關”,子查詢必須重複執行。

沒有 a的“聚合”(第一個COUNT(*))的存在GROUP BY表示“遍歷整個表 ( FROM) 以計算值。

作為“常量”的子查詢(您的兩個子查詢)將被視為SELECT在 main 之前單獨執行SELECT。(不確定這兩個中的哪一個先出現——因為這無關緊要。)在那之後,你有類似的東西:

SELECT COUNT(*),
      1234
   FROM recent_grads
   WHERE ShareWomen > 25.678;

這與你所看到的一致嗎?

引用自:https://dba.stackexchange.com/questions/305427