MySQL數據庫——分組數據

上一節我們說到,SQL聚集函數可以用來彙總數據。這使我們能夠對 行 進行計數 ,計算和 與 平均值 ,獲得 最大 和 最小 值 而不用檢索所有數據!

到目前來說,我們的所有數據都要匹配WHERE子句的數據 基礎上來進行。 例如 我們要返回 id 爲 5 的行 where users_id = 5 但是,如果要返回年紀爲15的行的 代碼作品,或者返回具有10個以上作品的 行(程序員) 怎麼辦?

這時候就能用上分組了,分組允許把數據分爲多個邏輯組,以便能對每個組進行聚集計算。

part 1 創建分組
分組實在SELECT語句的GROUP BY子句中建立的。
看一個例子:

SELECT users.user_id,COUNT(*) AS ID FROM users GROUP BY users.user_id;

上面的SQL語句將會返回 user_id出現的次數 ,GROUP BY子句指示MySQL按user_id 排序並分組數據 。這導致每個user_id而不是整個表計算 ID 一次。

因爲使用了GROUP BY,就不必指定要計算和估值的每個組了。系統會自動完成。GROUP BY 子句 指示MySQL分組數據,然後對每個組而不是整個結果集進行聚集。

GROUP BY子句可以包含任意數目的列。這使得能對分組進行嵌套,爲數據分組提供更細緻的控制。

如果在GROUP BY子句中嵌套了分組,數據將在最後規定的分組上進行彙總。換句話說,在建立分組時,指定的所有列都在一起計算。

GROUP BY子句中列出的每個列都必須是檢索列或有效的表達式(但不能使聚集函數)。如果在SELECT中使用表達式,則必須在GROUP BY子句中指定相同的表達式,不能使用別名。

GROUP BY 子句必須出現在WHERE子句之後,ORDER BY 子句之前!

part 2 過濾分組

我們知道在WHERE子句中可以完成過濾數據的作用,同樣,我們的分組也能完成,過濾分組。 但是需要注意的是,我們這裏使用的是HAVING而不是WHERE。爲什麼呢?因爲WHERE過濾 針對的是行 而不是分組 ,但是 HAVING 支持行 也支持分組。所學過有關WHERE 的所有技術和 選項 都適用與 HAVING 。 看下面的例子:

SELECT code_id,COUNT(*) AS NUM FROM coder GROUP BY CODER.code_id HAVING COUNT(*) >=2;

上面的語句將會檢索 code_id 和所有的行數 並且以code_id進行分組,這樣不同的code_id就會有不同的行數,相同的code_id行數就會加一 然後用 HAVING 對分組中 累計行數 達標的 行 進行過濾,篩選出來。

part 3 分組和排序

聰明的你可能已經發現了,GROUP BY 和 ORDER BY 經常完成相同的工作,但是他們是非常不同的!

他們之間存在一個非常重要的差別!ORDER BY 排序產生的輸出;GROUP BY 是分組行!但輸出可能不是分組的順序

我們完全可以在分組,然後過濾,之後,在加上ORDER BY 子句 !

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章