谈谈sql语句中的group by
一.概述
我们经常使用sql语句来从数据库中查询一批数据出来,有时候我们需要把查询出来的数据分组,然后进行其他操作,比如统计,在实现这个需求的时候我们就会用到group by,从字面来解释按照XX来分组,到底按照什么来分组,需要我们在写sql语句的时候显式地指定,可以指定一个字段,也可以指定多个字段,通常group by和sql的函数结合起来使用。
二.语法
1 2 3 4 5 | SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name1...column_nameN
HAVING condition
|
注意:
- aggregate_function表示sql的一些内聚函数,例如count,sum等
- WHERE不是必须的
- GROUP BY后面可以指定多个字段,最后每个分组中,这几个字段的值都是一样的
- HAVING 可以选出符合某些条件的组,放弃一些不符合条件的组,在HAVING子句中我们也可以使用一些sql的内聚函数
三.实例
假如我们有如下的表member_trade_record
trade_type表示交易类型,线上or线下
id | member_id | trade_money | trade_type | |
---|---|---|---|---|
1 | nuaa_2012 | 1200 | ONLINE | |
2 | nuaa_2013 | 1201 | OFFLINE | |
3 | nuaa_2014 | 1202 | ONLINE | |
4 | nuaa_2012 | 200 | OFFLINE | |
5 | nuaa_2013 | 300 | OFFLINE |
现在需要统计每个人的交易总额,可以使用如下语句
1 | select memer_id, sum(trade_money) from member_trade_record group by member_id
|
输出如下:
member_id | sum(trade_money) | |
---|---|---|
nuaa_2012 | 1400 | |
nuaa_2013 | 1501 | |
nuaa_2014 | 1202 |
现在需要统计每个人线上线下的交易总额分别是多少,这时候就需要制定多个字段了
1 | select member_id, trade_type, sum(trade_money) from member_trade_record group by member_id, trade_type
|
输出如下:
member_id | trade_type | sum(trade_money) | |
---|---|---|---|
nuaa2012 | ONLINE | 1200 | |
nuaa2012 | OFFLINE | 200 | |
nuaa2013 | OFFLINE | 1501 | |
nuaa2014 | ONLINE | 1202 |
现在我们需要选出交易总额大于等于1500的会员
1 | select member_id, sum(trade_money) from member_trade_record group by member_id having sum(trade_money) >= 1500
|
输出如下:
member_id | sum(trade_money) | |
---|---|---|
nuaa_2013 | 1501 |
四.总结
我们不使用group by也可以实现上面的需求,但是使用group by我们能更快更优雅的实现上面的需求,要是想对group by后的组进行更细粒度的筛选,就必须使用having子句来实现了。