MySQL表分组查询:group by、having、with rollup、group_concat
原创
©著作权归作者所有:来自51CTO博客作者董哥的黑板报的原创作品,请联系作者获取转载授权,否则将追究法律责任
分组查询
- 后面一篇文章我们将介绍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进行分组,然后再计算每个组的数量
二、group_concat函数
- group_concat函数:可以将括号内的指定字段显示出来
演示案例
- 将vend_id分组,然后显示每种vend_id中的prod_name
三、having过滤分组
- group by可以对数据进行分组,分组之后还允许进行过滤分组(例如规定包括哪些分组、排除哪些分组)
- having与where的联系:
- having可以支持所有where操作符。我们在前面所用的where语法对于having来说同样可以(语法是相同的,只是关键字不同)
- 但是where是过滤指的是行而不是分组(事实上,where没有分组的概念),而having过滤分组。因此分组查询的过滤不可以使用where
- 最重要的区别:where是在数据是在分组前进行过滤,havinf是在数据分组后进行过滤
演示案例
- 对cust_id进行分组,然后查询其数量大于等于2的分组
- 配合where使用:先用where过滤掉所有prod_price至少为10的行,然后按vend_id进行分组,分完组之后之后having过滤掉总数大于等于2的行,最终显示结果
四、with rollup关键字
- with rollup关键字:可以的哦到每个分组以及每个分组汇总级别(针对每个分组)的值(在最后一行)
演示案例
- 先按照vend_id分组查询,然后算出vend_id的总数
五、多字段分组
- group by后面跟多个分组字段。分组层次从左到右,即先按第1个字段分组,然后再根据第2个字段进行分组
演示案例
六、分组和排序一起使用(order by)
- 先根据group by将字段分组,然后再根据order by后面的字段排序
演示案例
- 检索总计订单价格大于等于50的订单的订单号和总计订单价格
- 然后我们按总计订单价格排序输出(加上order by子句)