MySQL GROUP BY
【 GROUP BY】
子句用于將結果集根據指定的字段或者表達式進行分組。
有時候,我們需要將結果集按照某個維度進行匯總。這在統計數據的時候經常用到,考慮以下的場景:
- 按班級求取平均成績。
- 按學生匯總某個人的總分。
- 按年或者月份統計銷售額。
- 按國家或者地區統計用戶數量。
GROUP BY
語法
【GROUP BY】
子句是 SELECT
語句的可選子句。 GROUP BY 子句語法如下:
SELECT column1[, column2, ...], aggregate_function(ci)
FROM table
[WHERE clause]
GROUP BY column1[, column2, ...];
[HAVING clause]
說明:
【column1[, column2, ...]】
是分組依據的字段,至少一個字段,可以多個字段。【aggregate_function(ci)】
是聚合函數。這是可選的,但是一般都用得到。【SELECT】
后的字段必須是分組字段中的字段。【WHERE 】
子句是可選的,用來過濾結果集中的數據。【HAVING】
子句是可選的,用來過濾分組數據。
經常使用的聚合函數主要有:
SUM()
: 求總和AVG()
: 求平均值MAX()
: 求最大值MIN()
: 求最小值COUNT()
: 計數
GROUP BY
實例
簡單的GROUP BY 實例
創建actor
表
DROP TABLE IF EXISTS `actor`;
CREATE TABLE `actor` (`actor_id` int(11) NOT NULL AUTO_INCREMENT,`last_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`first_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`gender` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '男',`age` int(11) NOT NULL,PRIMARY KEY (`actor_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
插入數據
INSERT INTO `actor` VALUES (1, '李', '小龍', '男', 33);
INSERT INTO `actor` VALUES (2, '劉', '德華', '男', 60);
INSERT INTO `actor` VALUES (3, '梁', '朝偉', '男', 58);
INSERT INTO `actor` VALUES (4, '張', '家輝', '男', 55);
INSERT INTO `actor` VALUES (5, '劉', '嘉玲', '女', 58);
INSERT INTO `actor` VALUES (6, '周', '潤發', '男', 60);
INSERT INTO `actor` VALUES (7, '古', '天樂', '男', 58);
INSERT INTO `actor` VALUES (8, '吳', '京', '男', 48);
INSERT INTO `actor` VALUES (9, '周', '也', '女', 24);
INSERT INTO `actor` VALUES (10, '周', '星馳', '男', 59);SET FOREIGN_KEY_CHECKS = 1;
查看actor
表中的姓氏列表
SELECT last_nameFROM actorGROUP BY last_name;
本例中,使用 【GROUP BY 】
句按照 last_name 字段對數據進行分組。
本例的輸出結果與以下使用 DISTINCT 的 SQL 輸出結果完全一樣:
SELECT DISTINCT last_name FROM actor;
GROUP BY 與聚合函數實例
我們使用 【GROUP BY 】
子句和聚合函數 【COUNT() 】
查看 actor 表中的姓氏列表以及每個姓氏的次數。
SELECT last_name, COUNT(*)
FROM actor
GROUP BY last_name
ORDER BY COUNT(*) DESC;
本例中,執行順序如下:
- 首先使用 GROUP BY 子句按照 last_name 字段對數據進行分組。
- 然后使用聚合函數 COUNT(*) 匯總每個姓氏的行數。
- 最后使用 ORDER BY 子句按照 COUNT(*) 降序排列。
這樣,數量最多的姓氏排在最前面。
GROUP BY 和 HAVING 實例
統計演員片酬大于【1500W】
的演員有哪些
SELECT *from actorGROUP BY actor_idHAVING salary > 1500ORDER BY salary DESC;
結論
在本文中,我們介紹了在 MySQL 中使用 GROUP BY 子句將結果集根據指定的列或者表達式進行分組。以下是 GROUP BY 子句的要點:
GROUP BY
子句用于將結果集根據指定的字段或者表達式進行分組。GROUP BY
子句的分組字段或表達式至少一個,可以多個。HAVING
子句是可選的,用來過濾分組數據。GROUP BY
子句經常用于數據統計匯總,通常使用聚合函數。