SQL中分组的一些用法group_concat

分组查询

  • 后面一篇文章我们将介绍MySQL的聚合函数(https://blog.csdn.net/qq_41453285/article/details/88318318),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进行分组,然后再计算每个组的数量

SQL中分组的一些用法group_concat

二、group_concat函数

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

演示案例

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

SQL中分组的一些用法group_concat

三、having过滤分组

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

演示案例

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

SQL中分组的一些用法group_concat

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

SQL中分组的一些用法group_concat

四、with rollup关键字

详细介绍:https://blog.csdn.net/hzp666/article/details/109483859

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

演示案例

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

SQL中分组的一些用法group_concat

五、多字段分组

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

演示案例

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

SQL中分组的一些用法group_concat

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

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

演示案例

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

SQL中分组的一些用法group_concat

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

SQL中分组的一些用法group_concat