Mysql
對執行SQL的順序感到困惑
我有這個 SQL 查詢,誰能幫我確定執行順序,比如先執行哪個子句,然後最後執行:
SELECT COUNT(*), (SELECT COUNT(*) FROM recent_grads ) FROM recent_grads WHERE ShareWomen > (SELECT AVG(ShareWomen) FROM recent_grads );
- 我知道第 5 行中的“FROM”子句首先執行,因為它告訴我們的查詢我們將使用的表或數據集稱為“recent_grads”。
- 然後我認為“WHERE”子句第二個執行,而在 WHERE 子句中,子查詢首先執行。當子查詢執行時,子查詢被某個值替換。然後我們有一個適當的過濾器語句。
- 我認為執行的第三個子句是第一行的“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;
這與你所看到的一致嗎?