SQL 語句的執行順序

weixin_34146805發表於2018-12-25

如下表(table1):

id  client
1   001
1   002
1   003
2   001
2   002
3   001
1   001

id 代表客服人員的 id,client 代表與該客服人員通話的客戶的 id,也是說,每有一條記錄,就代表一個客服與一位客戶進行了通話,相同的記錄,例如第一行和第七行,代表著 1 號客服與 001 號客戶在不同的時間進行了兩次通話,問:如下 SQL 可否統計出與客戶通話次數大於 1 客服 id?

SELECT id, COUNT(client) AS count
FROM table1
GROUP BY id
WHERE count > 1;

答案是不能,執行該 SQL 會報錯:

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE count > 1' at line 4

原因: WHERE 子句會比 SELECT 子句先執行,上面的 SQL 中 ,當 WHERE 子句被執行時,count 這個值尚不存在。直到 WHERE 子句執行完畢,count 才會被計算出來。

SQL 語句的書寫順序如下:

SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY

SQL 語句的執行順序如下:

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

其中 SELECT 和 FROM 是必須的,其他關鍵詞是可選的,這六個關鍵詞的執行順序
與SQL語句的書寫順序並不是一樣的,而是按照下面的順序來執行

  • FROM:需要從哪個資料表檢索資料
  • WHERE:過濾表中資料
  • GROUP BY:將上面過濾出的資料分組
  • HAVING:對上面已經分組的資料進行過濾
  • SELECT:檢視結果集中的哪個列,或列的計算結果
  • ORDER BY:按照什麼樣的順序來檢視返回的資料

所以本文開頭所說的查詢有兩種實現的 SQL:

# 使用 HAVING 過濾分組中的資料
SELECT id, COUNT(client) AS count
FROM table1
GROUP BY id
HAVING count > 1;

# 使用內嵌檢視(子查詢),讓 WHERE 可以引用別名
SELECT * FROM 
    (SELECT id, COUNT(client) AS count
    FROM byte_dance_table_1
    GROUP BY id) tmp
WHERE tmp.count > 1;

相關文章