2016-07-27 82 views
0

我在MySQL相當新手在學習GROUP BY/HAVING我面對這個查詢:MySQL首先執行什麼操作:SELECT或HAVING?

SELECT author_id, COUNT(author_id) FROM posts GROUP BY author_id HAVING COUNT(author_id) > 2; 

我發現關於SQL的執行順序的物品,其表示,序列如下:

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

但是,如果是這樣,下一個查詢如何成功執行?

SELECT author_id, COUNT(author_id) AS posts_count 
    FROM posts 
    GROUP BY author_id 
    HAVING posts_count > 2; 

如何HAVING知道 「POSTS_COUNT」 的別名,如果SELECTHAVING後執行?我發現的信息是不正確的還是這是某種與SQL標準不同的MySQL特定行爲?

而且,如果HAVING使用從SELECTposts_count」的別名在第二個查詢,我可以做一個野生猜測,HAVING將不再運行COUNT()篩選組,將只取「POST_COUNT」列必要的數據。但是,HAVING會在第一個查詢中做同樣的事情,還是會爲每個組運行COUNT()兩次(SELECT中的第一個和HAVING中的第一個),從而使查詢執行時間更長?

我很抱歉可能調用一些事情錯了名字,我只在我的MySQL學習:)

回答

0

的beginnig你是正確的執行順序是:

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. 選擇
  6. ORDER BY

問題是,如果你運行你的查詢別名將在T-SQL(SQL Server)中無效,因爲HAVING引用了SELECT別名posts_count。

但是,在MySQL中是不同的。 MySQL擴展標準SQL行爲以允許在聚合列的HAVING子句中使用別名。

檢查最後一個例子在這裏:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

+0

謝謝你的解釋,這正是我一直在尋找! – Eyeless

相關問題