GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
sqlyog
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`number` int(11) DEFAULT NULL,
`sex` varchar(4) COLLATE utf8_unicode_ci DEFAULT NULL,
`salary` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
根据性别 sex
来进行分组,查询 user
表中的姓名,年龄,性别。虽然是分组了,但只显示一个用户,其他的不显示。
SELECT NAME,age,sex FROM USER GROUP BY sex;
GROUP BY
语句中的GROUP_CONCAT
函数()根据 sex
字段,来查询 name
字段和 age
字段的详细信息。
SELECT sex ,GROUP_CONCAT(NAME), GROUP_CONCAT(age)FROM USER GROUP BY sex;
count
函数来查询性别的总人数根据 sex
字段来查询 name
字段的详细信息和 sex
字段性别的人数。
SELECT sex ,GROUP_CONCAT(NAME),COUNT(sex) FROM USER GROUP BY sex;
where
语句根据 sex
字段进行分组,用 where
语句来查询年龄大于25的人数
SELECT sex ,GROUP_CONCAT(NAME),COUNT(sex) FROM USER WHERE age >25 GROUP BY sex;
SUM
MAX
MIN
AVG
函数根据 sex
用 SUM
MAX
MIN
AVG
函数来查询用户的总资金,最大资金,最小资金,平局资金
SELECT sex ,GROUP_CONCAT(NAME),COUNT(sex),SUM(salary),MAX(salary),MIN(salary),AVG(salary) FROM USER GROUP BY sex;
HAVING
子句在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
HAVING 子句可以让我们筛选分组后的各组数据。
根据 sex
语句进行分组,来查询各组中资金大于1500的组
SELECT sex ,GROUP_CONCAT(NAME),COUNT(sex) FROM USER GROUP BY sex HAVING SUM(salary)>1500;
WITH ROLLUP
子句:WITH ROLLUP
可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
SELECT sex ,GROUP_CONCAT(NAME),COUNT(sex),SUM(salary),MAX(salary),MIN(salary),AVG(salary) FROM USER GROUP BY sex WITH ROLLUP;