SQL极简核心:GROUP BY 分组

概念

GROUP BY allows you to separate data into groups, which can be aggregated independently of one another.

GROUP BY 语句作用于某一列或者多列(分组列),然后按照分组列的不同值对表格进行分组(分组=分区+去重
为什么强调”去重“,因为窗口函数没有去重 ,只有分区功能

如何理解去重GROUP BY city 就是选出 City 的值作为分组对象,这个值必然是不重复的。

namecity
Robinsh
Bobhz
Lilysh
Alicesz

分组对象为

City
sh
hz
sz

用法

  • 字段去重

    SELECT col_name
    FROM t
    WHERE condition
    GROUP BY col_name
    
  • 分组聚合
    GROUP BY 更常用的是聚合函数配合使用,将全局聚合变成分组聚合结果由原来的一行,变为多行

如:

SELECT city, COUNT(name) cnt
FROM t
GROUP BY city

结果则为:

namecnt
sh2
hz1
sz1

聚合函数COUNT统计的是在分组的情况下,分组以外字段的数量

注意事项

  • 不论语法还是实际执行顺序GROUP BY分组操作 在 行过滤WHERE进行

  • 使用了GROUP BY 之后对SELECT的限制:SELECT 之后的字段必须是分组字段或者聚合字段,不允许有其它多余字段。再强调一遍,所有SELECT之后的字段不是分组字段,就必须在聚合函数中!
    新手大忌:

    SELECT * FROM table_a GROUP BY col
    

    牢记GROUP BY 与通配符 *水火不容!

  • 如果包含分组对象的值含有 NULL,那么NULL也会作为最终分组结果之一。

  • 如果需要对聚合项的聚合值进行行过滤要使用HAVING,而不是对特定行进行行过滤的WHERE
    WHERE进行普通行过滤,而HAVING分组行过滤)

  • HAVING 可以使用SELECT 中字段的别名,虽然HAVINGSELECT 之前执行(奇怪!)
    例如:

    SELECT m.s_id, AVG(IFNULL(m.s_score, 0)) avg_score
    FROM 
    		(
    		SELECT st.s_id, 
    		       sc.s_score
    		FROM Student st 
    		LEFT JOIN Score sc 
    		ON st.s_id = sc.s_id
    		) m 
    GROUP BY m.s_id
    -- HAVING AVG(IFNULL(m.s_score, 0)) < 60 
    HAVING avg_score < 60  # why this also OK ?
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值