MySQL的数据操作2(GROUP BY、GROUP_CONCAT())

假设当前数据库记录如下:

CREATE TABLE IF NOT EXISTS mytest(
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',
    username VARCHAR(20) NOT NULL UNIQUE COMMENT '用户名',
    sex ENUM('男','女','保密') NOT NULL DEFAULT '保密' COMMENT '性别',
    age TINYINT UNSIGNED NOT NULL COMMENT '年龄'
)ENGINE=INNODB CHARSET=UTF8;



INSERT mytest VALUE(NULL,'king',1,18);
INSERT mytest VALUES(NULL,'Jhon','男',19),(NULL,'Mike',1,20),(NULL,'Jack',1,26);

INSERT mytest VALUE(NULL,'hing','女',18);
INSERT mytest(username,age) VALUE('Mary',17);

INSERT mytest SET username='Black',sex='男',age=19;

INSERT mytest VALUE(DEFAULT,'hung','女',18);

SELECT * FROM mytest;

输出为:

id  username sex age
1   king    男   18
2   Jhon    男   19
3   Mike    男   20
4   Jack    男   26
5   hing    女   18
6   Mary    保密  17
7   Black   男   19
8   hung    女   18

对记录进行分组——GROUP BY与GROUP_CONCAT()

GROUP BY 字段名:根据字段名中记录的不同进行分组
例如:

SELECT id,username,sex FROM mytest
GROUP BY sex;//按照性别的不同进行分组

输出为:

id  username sex
1   king    男
5   hing    女
6   Mary    保密

但是,我们会发现,输出中仅有三个记录,并没有看到其他的记录,因为这里只显示每个组中一条记录,如果要看到组内的记录,要结合GROUP_CONCAT()使用。

输入:

SELECT GROUP_CONCAT(id),GROUP_CONCAT(username),sex FROM mytest
GROUP BY sex;//在分组成功后,列出所有的id和用户名

输出:

group_concat(id)    GROUP_concat(username)      sex
1,2,3,4,7           king,Jhon,Mike,Jack,Black   男
5,8                 hing,hung                   女
6                   Mary                        保密

GROUP BY函数还可以配合其他聚合函数使用:
例如:COUNT()、SUM()、MAX()、MIN()、AVG()
COUNT()统计记录总数(如果写的是COUNT(字段名称),字段名称的记录中的NULL不计入总数,而COUNT(*)会统计NULL值)
SUM()、MAX()、MIN()、AVG()分别求和、最大值、最小值、平均值

例如:
按照sex分组,得到用户名详情,并且分别统计组中的总人数
输入:

SELECT id,GROUP_CONCAT(username) AS usersDetail,sex, COUNT(*) AS totalusers FROM mytest
GROUP BY sex;

输出

id  usersDetail                 sex  totalusers
1   king,Jhon,Mike,Jack,Black   男   5
5   hing,hung                   女   2
6   Mary                        保密 1

将上面所有的方法一起使用:
输入:

SELECT id,
GROUP_CONCAT(username) AS usersDetail,
sex, 
COUNT(*) AS totalusers,
SUM(age),
MAX(age),
MIN(age),
AVG(age) 
FROM mytest
GROUP BY sex;

输出:

id  usersDetail                sex  totalusers  sum(age)    max(age)    min(age)    avg(age)
1   king,Jhon,Mike,Jack,Black   男      5         102         26           18        20.4000
5   hing,hung                   女      2         36          18           18        18.0000
6   Mary                       保密     1         17          17           17        17.0000

在上面分组的条件下,还可以对得到的分组再进行筛选:
用HAVING字段,输入如下:

SELECT id,GROUP_CONCAT(username) AS usersDetail,sex, COUNT(*) AS totalusers FROM mytest
GROUP BY sex 
HAVING COUNT(*) > 3;//从各个分组中,筛选出分组成员数大于3的分组

或者可以写为;
SELECT id,GROUP_CONCAT(username) AS usersDetail,sex, COUNT(*) AS totalusers FROM mytest
GROUP BY sex 
HAVING  totalusers> 3;//从各个分组中,筛选出分组成员数大于3的分组

输出为:

id  usersDetail                sex  totalusers
1   king,Jhon,Mike,Jack,Black   男   5
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。