mysql 组内计数_MySQL 分组计数

练习 group by 和 count 语句

情景一

假设有 student 表,如下:

+----+------+-----+

| id | name | age |

+----+------+-----+

| 1 | 刘备 | 23 |

| 2 | 关羽 | 22 |

| 3 | 张飞 | 21 |

| 4 | 刘表 | 43 |

| 5 | 刘璋 | 43 |

| 6 | 刘蝉 | 3 |

| 7 | 曹操 | 33 |

| 8 | 曹植 | 13 |

| 9 | 曹丕 | 15 |

| 10 | 关平 | 17 |

+----+------+-----+

问题 1:求各个姓氏出现的次数

提示:group by 后不只限于跟一个列名,还可以可以跟一个 ''记录的函数''

解:select left(name, 1), count(*) from student group by left(name, 1);

得:

+---------------+----------+

| left(name, 1) | count(*) |

+---------------+----------+

| 关 | 2 |

| 刘 | 4 |

| 张 | 1 |

| 曹 | 3 |

+---------------+----------+

问题 2:求各个姓氏出现的次数,并按出现次数由高到低排序

解:select left(name, 1), count(*) from student group by left(name, 1) order by count(*) desc;

得:

+---------------+----------+

| left(name, 1) | count(*) |

+---------------+----------+

| 刘 | 4 |

| 曹 | 3 |

| 关 | 2 |

| 张 | 1 |

+---------------+----------+

情景二

假设有 student 表,如下:

+----+--------+---------------------+

| id | name | birthday |

+----+--------+---------------------+

| 1 | Alice1 | 1997-01-15 16:21:19 |

| 2 | Alice2 | 1998-03-18 17:19:54 |

| 3 | Alice3 | 1996-06-07 03:15:30 |

| 4 | Alice4 | 1998-03-08 10:10:42 |

| 5 | Alice5 | 1997-05-04 07:12:37 |

| 6 | Alice6 | 1998-01-28 09:09:17 |

+----+--------+---------------------+

问题 :按年进行分组计数

解:select year(birthday), count(*) from student group year(birthday);

得:

+----------------+----------+

| year(birthday) | count(*) |

+----------------+----------+

| 1996 | 1 |

| 1997 | 2 |

| 1998 | 3 |

+----------------+----------+

group by 后可以跟多列,请看情景三...

情景三

假设有 student 表,

表结构:

+----------+-----------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+----------+-----------------+------+-----+---------+----------------+

| id | int(11) | NO | PRI | NULL | auto_increment |

| name | varchar(30) | NO | | NULL | |

| sex | enum('男','女') | NO | | NULL | |

| class_id | int(11) | NO | | NULL | |

+----------+-----------------+------+-----+---------+----------------+

数据如下:

+----+---------+-----+----------+

| id | name | sex | class_id |

+----+---------+-----+----------+

| 1 | 张三1 | 男 | 1 |

| 2 | 张三2 | 男 | 2 |

| 3 | 张三3 | 男 | 3 |

| 4 | 李四1 | 男 | 1 |

| 5 | 王五1 | 男 | 1 |

| 6 | 林黛玉1 | 女 | 1 |

| 7 | 王熙凤1 | 女 | 1 |

| 8 | 李四2 | 男 | 2 |

| 9 | 王五2 | 男 | 2 |

| 10 | 刘备2 | 男 | 2 |

| 11 | 关羽2 | 男 | 2 |

+----+---------+-----+----------+

问题 :统计每个班级的男、女生人数

提示:group by 可以跟多个''记录的函数''

解 1:select class_id, sex, count(*) from student group by class_id, sex;

得:

+----------+-----+----------+

| class_id | sex | count(*) |

+----------+-----+----------+

| 1 | 男 | 3 |

| 1 | 女 | 2 |

| 2 | 男 | 5 |

| 3 | 男 | 1 |

+----------+-----+----------+

带排序效果:select class_id, sex, count(*) from student group by class_id, sex order by class_id asc, sex asc;

得:

+----------+-----+----------+

| class_id | sex | count(*) |

+----------+-----+----------+

| 1 | 男 | 3 |

| 1 | 女 | 2 |

| 2 | 男 | 5 |

| 3 | 男 | 1 |

+----------+-----+----------+

也可以将class_id 和 sex 合并为一列显示:

解 2:select concat(class_id, '班', sex, '生人数'), count(*) from student group by class_id, sex;

+---------------------------------------+----------+

| concat(class_id, '班', sex, '生人数') | count(*) |

+---------------------------------------+----------+

| 1班男生人数 | 3 |

| 1班女生人数 | 2 |

| 2班男生人数 | 5 |

| 3班男生人数 | 1 |

+---------------------------------------+----------+

带排序效果:select concat(class_id, '班', sex, '生人数'), count(*) from student group by class_id, sex order by class_id asc, sex asc;

+---------------------------------------+----------+

| concat(class_id, '班', sex, '生人数') | count(*) |

+---------------------------------------+----------+

| 1班男生人数 | 3 |

| 1班女生人数 | 2 |

| 2班男生人数 | 5 |

| 3班男生人数 | 1 |

+---------------------------------------+----------+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 MySQL 中的 GROUP_CONCAT 函数结合子查询来实现按计数分割的效果。具体步骤如下: 1.使用子查询对数据进行分组计数。 例如,假设你有一个表叫做 orders,其中包含订单信息和订单的商品列表,你想要按订单中商品数量的不同进行分组统计。你可以使用以下查询语句: ``` SELECT COUNT(*) AS count, GROUP_CONCAT(product_name) AS products FROM ( SELECT order_id, COUNT(*) AS count, product_name FROM orders GROUP BY order_id, product_name ) AS t GROUP BY count; ``` 这个查询语句中的子查询使用 GROUP BY 子句按照订单 ID 和商品名称分组计数。然后在外部查询中,使用 GROUP BY 子句按照商品数量分组,并使用 GROUP_CONCAT 函数将相同数量的商品名称连接起来,形成一个逗号分隔的字符串。 2.使用字符串函数将逗号分隔的字符串分割成多个字段。 如果你想要将逗号分隔的字符串拆分成多个字段,可以使用 MySQL 中的字符串函数。例如,使用 SUBSTRING_INDEX 函数可以在逗号分隔的字符串中提取前 n 个子串。下面是一个示例查询语句: ``` SELECT COUNT(*) AS count, SUBSTRING_INDEX(products, ',', 1) AS product1, SUBSTRING_INDEX(SUBSTRING_INDEX(products, ',', 2), ',', -1) AS product2, SUBSTRING_INDEX(SUBSTRING_INDEX(products, ',', 3), ',', -1) AS product3 FROM ( SELECT order_id, COUNT(*) AS count, GROUP_CONCAT(product_name) AS products FROM orders GROUP BY order_id ) AS t GROUP BY count; ``` 这个查询语句中,使用 SUBSTRING_INDEX 函数将逗号分隔的字符串分割成多个字段。例如,SUBSTRING_INDEX(products, ',', 1) 表示提取 products 字段中第一个逗号前的子串,即第一个商品名称;SUBSTRING_INDEX(SUBSTRING_INDEX(products, ',', 2), ',', -1) 表示提取 products 字段中第二个逗号后的子串,即第二个商品名称。你可以根据需要添加更多的 SUBSTRING_INDEX 函数来提取更多的子串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值