玩转Mysql系列 - 第9篇:分组查询详解(group by & having)

本文详细介绍了Mysql中的分组查询,包括分组查询语法、聚合函数、单字段与多字段分组、WHERE与HAVING的区别,以及分组后排序等。通过实例讲解了分组前筛选、分组后筛选以及WHERE、GROUP BY、HAVING、ORDER BY和LIMIT的配合使用。强调了在分组查询中,SELECT后的列必须遵循标准规范,避免MySQL早期版本的坑。文章最后还给出了Mysql系列和Java高并发系列的其他篇章链接。
摘要由CSDN通过智能技术生成

打算提升sql技能的,可以加我微信itsoku,带你成为sql高手。

这是Mysql系列第9篇。

环境:mysql5.7.25,cmd命令中进行演示。

本篇内容

  1. 分组查询语法

  2. 聚合函数

  3. 单字段分组

  4. 多字段分组

  5. 分组前筛选数据

  6. 分组后筛选数据

  7. where和having的区别

  8. 分组后排序

  9. where & group by & having & order by & limit 一起协作

  10. mysql分组中的坑

  11. in多列查询的使用

分组查询

语法:


      
      
      
  1. SELECT column, group_function,...  FROM table
  2. [ WHERE condition]
  3. GROUP  BY group_by_expression
  4. [ HAVING group_condition];

说明:

group_function:聚合函数。

group_by_expression:分组表达式,多个之间用逗号隔开。

group_condition:分组之后对数据进行过滤。

分组中,select后面只能有两种类型的列:

  1. 出现在group by后的列

  2. 或者使用聚合函数的列

聚合函数

函数名称 作用
max 查询指定列的最大值
min 查询指定列的最小值
count 统计查询结果的行数
sum 求和,返回指定列的总和
avg 求平均值,返回指定列数据的平均值

分组时,可以使用使用上面的聚合函数。

准备数据


      
      
      
  1. drop table  if exists t_order;
  2. -- 创建订单表
  3. create table  t_order(
  4.   id int not  null  AUTO_INCREMENT  COMMENT  '订单id',
  5.   user_id bigint not  null comment  '下单人id',
  6.   user_name  varchar( 16) not  null  default  '' comment  '用户名',
  7.   price  decimal( 10, 2) not  null  default  0 comment  '订单金额',
  8.   the_year  SMALLINT not  null comment  '订单创建年份',
  9.    PRIMARY  KEY (id)
  10. ) comment  '订单表';
  11. -- 插入数据
  12. insert into  t_order(user_id,user_name,price,the_year) values
  13.   ( 1001, '路人甲Java', 11.11, '2017'),
  14.   ( 1001, '路人甲Java', 22.22, '2018'),
  15.   ( 1001, '路人甲Java', 88.88, '2018'),
  16.   ( 1002, '刘德华', 33.33, '2018'),
  17.   ( 1002, '刘德华', 12.22, '2018'),
  18.   ( 1002, '刘德华', 16.66, '2018'),
  19.   ( 1002, '刘德华', 44.44, '2019'),
  20.   ( 1003, '张学友', 55.55, '2018'),
  21.   ( 1003, '张学友', 66.66, '2019');

      
      
      
  1. mysql> select *  from t_order;
  2. +----+---------+---------------+-------+----------+
  3. | id | user_id | user_name     | price | the_year |
  4. +----+---------+---------------+-------+----------+
  5. |   1 |     1001 | 路人甲 Java    |  11.11 |      2017 |
  6. |   2 |     1001 | 路人甲 Java    |  22.22 |      2018 |
  7. |   3 |     1001 | 路人甲 Java    |  88.88 |      2018 |
  8. |   4 |     1002 | 刘德华        |  33.33 |      2018 |
  9. |   5 |     1002 | 刘德华        |  12.22 |      2018 |
  10. |   6 |     1002 | 刘德华        |  16.66 |      2018 |
  11. |   7 |     1002 | 刘德华        |  44.44 |      2019 |
  12. |   8 |     1003 | 张学友        |  55.55 |      2018 |
  13. |   9 |     1003 | 张学友        |  66.66 |      2019 |
  14. +----+---------+---------------+-------+----------+
  15. 9 rows  in set ( 0.00 sec)

单字段分组

需求:查询每个用户下单数量,输出:用户id、下单数量,如下:


      
      
      
  1. mysql>  SELECT 
  2.             user_id 用户id,  COUNT(id) 下单数量
  3.          FROM
  4.             t_order
  5.          GROUP  BY user_id;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值