第20章 MySQL GROUP BY 语句教程

GROUP BY 语句根据一个或多个列对结果集进行分组。

在分组的列上咱们可以使用 COUNT, SUM, AVG,等函数。

GROUP BY 语法


    SELECT column_name, function(column_name)
    FROM table_name
    WHERE column_name operator value
    GROUP BY column_name;


实例演示

本章节实例使用到了以下表结构及数据,使用前咱们可以先将以下数据导入database中。


    SET NAMES utf8;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    --  Table structure for `employee_tbl`
    -- ----------------------------
    DROP TABLE IF EXISTS `employee_tbl`;
    CREATE TABLE `employee_tbl` (
      `id` int(11) NOT NULL,
      `name` char(10) NOT NULL DEFAULT '',
      `date` datetime NOT NULL,
      `signin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    --  Records of `employee_tbl`
    -- ----------------------------
    BEGIN;
    INSERT INTO `employee_tbl` VALUES ('1', '小明', '2023-04-22 15:25:33', '1'), ('2', '小王', '2023-04-20 15:25:47', '3'), ('3', '小丽', '2023-04-19 15:26:02', '2'), ('4', '小王', '2023-04-07 15:26:14', '4'), ('5', '小明', '2023-04-11 15:26:40', '4'), ('6', '小明', '2023-04-04 15:26:54', '2');
    COMMIT;
    
    SET FOREIGN_KEY_CHECKS = 1;

导入成功后,执行以下 SQL 语句:


    mysql> set names utf8;
    mysql> SELECT * FROM employee_tbl;
    +----+--------+---------------------+--------+
    | id | name   | date                | signin |
    +----+--------+---------------------+--------+
    |  1 | 小明 | 2023-04-22 15:25:33 |      1 |
    |  2 | 小王 | 2023-04-20 15:25:47 |      3 |
    |  3 | 小丽 | 2023-04-19 15:26:02 |      2 |
    |  4 | 小王 | 2023-04-07 15:26:14 |      4 |
    |  5 | 小明 | 2023-04-11 15:26:40 |      4 |
    |  6 | 小明 | 2023-04-04 15:26:54 |      2 |
    +----+--------+---------------------+--------+
    6 rows in set (0.00 sec)

接下来咱们使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:


    mysql> SELECT name, COUNT(*) FROM   employee_tbl GROUP BY name;
    +--------+----------+
    | name   | COUNT(*) |
    +--------+----------+
    | 小丽 |        1 |
    | 小明 |        3 |
    | 小王 |        2 |
    +--------+----------+
    3 rows in set (0.01 sec)

使用 WITH ROLLUP

WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。

例如咱们将以上的数据表按名字进行分组,再统计每个人登录的次数:


    mysql> SELECT name, SUM(signin) as signin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;
    +--------+--------------+
    | name   | signin_count |
    +--------+--------------+
    | 小丽 |            2 |
    | 小明 |            7 |
    | 小王 |            7 |
    | NULL   |           16 |
    +--------+--------------+
    4 rows in set (0.00 sec)

其中记录 NULL 表示所有人的登录次数。

咱们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:


    select coalesce(a,b,c);

参数说明:如果anull,则选择b;如果bnull,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则return 为null(没意义)。

以下实例中如果名字为空咱们使用总数代替:


    mysql> SELECT coalesce(name, '总数'), SUM(signin) as signin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;
    +--------------------------+--------------+
    | coalesce(name, '总数') | signin_count |
    +--------------------------+--------------+
    | 小丽                   |            2 |
    | 小明                   |            7 |
    | 小王                   |            7 |
    | 总数                   |           16 |
    +--------------------------+--------------+
    4 rows in set (0.01 sec)

本专栏所有文章

第1章 MySQL 教程第2章 MySQL 安装教程
第3章 MySQL 管理教程第4章 MySQL PHP 语法教程
第5章 MySQL 连接教程第6章 MySQL 创建数据库教程
第7章 MySQL 删除数据库教程第8章 MySQL 选择数据库教程
第9章 MySQL 数据类型教程第10章 MySQL 创建数据表教程
第11章 MySQL 删除数据表教程第12章 MySQL 插入数据教程
第13章 MySQL 查询数据教程第14章 MySQL WHERE 子句教程
第15章 MySQL UPDATE 更新教程第16章 MySQL DELETE 语句教程
第17章 MySQL LIKE 子句教程第18章 MySQL UNION教程
第19章 MySQL 排序教程第20章 MySQL 分组教程
第21章 MySQL 连接的使用教程第22章 MySQL NULL 值处理教程
第23章 MySQL 正则表达式教程第24章 MySQL 事务教程
第25章 MySQL ALTER命令教程第26章 MySQL 索引教程
第27章 MySQL 临时表教程第28章 MySQL 复制表教程
第29章 MySQL 元数据教程第30章 MySQL 序列使用教程
第31章 MySQL 处理重复数据教程第32章 MySQL 及 SQL 注入教程
第33章 MySQL 导出数据教程第34章 MySQL 导入数据教程
第35章 MySQL 函数教程第36章 MySQL 运算符教程

寄语

本文有榴莲酱CSDN原创,欢迎点赞、转载,博客地址:https://blog.csdn.net/qq441540598

  • 友谊使欢乐倍对我们帮助最大的,并不是朋友们的实际帮助,而是我们坚信得到他们的帮助的信念。
  • 我今天的早餐是昨天的隔夜餐,中餐是自己一个人做一个吃的,晚餐是猪肠粉。不要为我难过,因为至少临睡前我陆续从短信、电话、微博里得到部分真心人的祝福了,尽管跟你的守护者的人数比起来是亿万分之一,我还是觉得比去年今天幸福多了。
  • 一个人如果使自己旳母亲伤心,无论他旳地位多么显赫,无论他多么有名,他都是一个卑劣旳人。
  • 每个人都有自己的烦恼,自己的伤痛,我不懂,亦如你不懂我。
  • 没有希望可以创造希望,有了希望就有了信心,有了信心,生命便会蓬勃灿烂、生生不息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榴莲酱csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值