分组查询

  • 后面一篇文章我们将介绍MySQL的聚合函数\,group by通常与聚合函数放在一起使用
  • 分组查询允许把数据分为多个逻辑组,然后对每个组进行聚合计算
  • 使用group by之前,先说明一下重要的规则:
  • 1.group by子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制
  • 2.如果在group by子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)
  • 3.group by子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在select中使用表达式,则必须在group b子句中指定相同的表达式,不能使用别名
  • 4.除聚集计算语句外,select语句中的每个列都必须在group by子句中给出
  • 5.如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL组,它们将分为一组
  • 6.group by子句必须出现在where子句之后,order by子句之前

一、group by基本使用


演示案例

  • 将产品供应商的ID进行分组,然后再计算每个组的数量

MySQL表分组查询:group by、having、with rollup、group_concat_MySQL分组排序


二、group_concat函数

  • group_concat函数:​可以将括号内的指定字段显示出来


演示案例

  • 将vend_id分组,然后显示每种vend_id中的prod_name

MySQL表分组查询:group by、having、with rollup、group_concat_having_02


三、having过滤分组

  • group by可以对数据进行分组,分组之后还​允许进行过滤分组​(例如规定包括哪些分组、排除哪些分组)
  • having与where的联系:
  • having可以支持所有where操作符。我们在前面所用的where语法对于having来说同样可以(语法是相同的,只是关键字不同)
  • 但是where是过滤指的是行而不是分组(事实上,where没有分组的概念),而having过滤分组。因此分组查询的过滤不可以使用where
  • 最重要的区别:​where是在数据是在分组前进行过滤,havinf是在数据分组后进行过滤


演示案例

  • 对cust_id进行分组,然后查询其数量大于等于2的分组

MySQL表分组查询:group by、having、with rollup、group_concat_having_03

  • 配合where使用:先用where过滤掉所有prod_price至少为10的行,然后按vend_id进行分组,分完组之后之后having过滤掉总数大于等于2的行,最终显示结果

MySQL表分组查询:group by、having、with rollup、group_concat_group_concat_04


四、with rollup关键字

  • with rollup关键字:​可以的哦到每个分组以及每个分组汇总级别(针对每个分组)的值(在最后一行)


演示案例

  • 先按照vend_id分组查询,然后算出vend_id的总数

MySQL表分组查询:group by、having、with rollup、group_concat_with rollup_05


五、多字段分组

  • group by后面跟多个分组字段。分组层次从左到右,即先按第1个字段分组,然后再根据第2个字段进行分组


演示案例

  • 先按s_id分组,然后再按f_name分组

MySQL表分组查询:group by、having、with rollup、group_concat_with rollup_06


六、分组和排序一起使用(order by)

  • 先根据group by将字段分组,然后再根据order by后面的字段排序


演示案例

  • 检索总计订单价格大于等于50的订单的订单号和总计订单价格

MySQL表分组查询:group by、having、with rollup、group_concat_group_concat_07

  • 然后我们按总计订单价格排序输出(加上order by子句)

MySQL表分组查询:group by、having、with rollup、group_concat_group_concat_08