我經常看到有人回答MySQL的問題與疑問是這樣的:用MySQL消除SELECT和HAVING /組間公共子BY子句
SELECT DAY(date), other columns
FROM table
GROUP BY DAY(date);
SELECT somecolumn, COUNT(*)
FROM table
HAVING COUNT(*) > 1;
我總是喜歡給列一個別名,指的是在GROUP BY
或HAVING
子句,例如
SELECT DAY(date) AS day, other columns
FROM table
GROUP BY day;
SELECT somecolumn, COUNT(*) AS c
FROM table
HAVING c > 1;
是MySQL的足夠聰明,在後來的條款的表述都一樣SELECT
,只有做一次?我不知道如何測試 - EXPLAIN
沒有顯示任何區別,但它似乎沒有顯示它是如何進行分組或過濾的;它似乎主要用於優化連接和WHERE
子句。
我傾向於對MySQL優化感到悲觀,所以我想給予我所有的幫助。
萬一你需要一個直接的答案,作爲一個權宜之計,直到我可以找到一個權威性的參考(我懷疑它可能必須來自源代碼),我很確定解析器能夠識別調用確定性函數(甚至是表達式)並緩存結果以便在查詢中重用。 – eggyal
+1一個連貫而有用的問題! –
@eggyal我不需要任何東西,它更加好奇。我想知道是否應該在看到這種冗餘時建議人們改進他們的答案。我打算繼續以第二種方式編寫我的查詢,因爲我發現它們更具可讀性。 – Barmar