《MySQL必知必会学习笔记》:数据分组
2016-03-28 20:59
316 查看
数据分组
根据上一篇博文中所看到的,SQL聚集函数可用来汇总数据。这使我们能够对行进行计数,计算和与平均数,获得最大和最小值而不用检索所有数据。目前为止的所有计算都是在表的所有数据或匹配特定的where子句的数据上进行的。
例如,在一门公共选修课中,我们需要统计来自每个班的人数各有多少个?应该怎么做呢?
可能有的人像下面这样做:
select class,count(*) from student3 where class=1001;
但是,这样你只能够得到一个班级选择这门公选课的人数,并不能得到选择这门可选课其它班级的人数。
因此,group by就排上用场了。
创建分组:group by
为更好的实践group by,建立了如下的student3表。用group by分组如下:
select class ,count(*) from student3 group by class;//按照班级进行分组
注意:因为使用了group by,就不必指定要计算和估值的每个组了,系统会自动完成。group by子句指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。
使用group by子句前,需要注意如下的规定:
group by 子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。
如果在group by子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算。
group by子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在select中使用表达式,则必须在group by子句中指定相同的表达式。不能使用别名。
如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多个NULL值,它们将会被分为一组。
group by必须出现在where子句之后,在order by之前。
过滤分组:HAVING
除了能用group by分组数据外,还可以用HAVING来过滤分组,即包括哪些分组,排除哪些分组。HAVING非常类似于WHERE,HAVING支持所有WHERE操作符,它们唯一的区别为:WHERE过滤行,而HAVING是过滤分组。
以一个例子来进行说明:找出在这门公选课中大于等于两个人的班级。
select class,count(*) from student3 group by class having count(*)>=2;
上面这条语句的 having count(*)>=2就过滤了人数在2个以上的结果出来。
HAVING 和WHERE差别理解的另一种方法:WHERE是在数据分组前进行过滤,而HAVING是在数据分组后进行过滤
为更好的理解这句话,看如下的例子:
select class,count(*) from student3 where score>60 group by class having count(*)>=2;
上面的语句的含义就是:第一步先通过where score>60来从表中过滤行数据,第二步就是group by对第一步处理后的数据进行分组,最后,having count(*)>=2来过滤分组。
实践结果如下:
分组和排序
我们经常发现用group by分组的数据是以分组的顺序输出的,但是情况并不总是这样,它并不是SQL的规范。因此,但你想要对分组后的数据以某种方式排序,应该提供明确的order by语句,即使其效果等同于group by子句也如此。千万不要忘记order by:一般在使用group by子句时,应该也给出order by子句。这是保证数据正确排序的唯一方法,前往不要依赖group by排序数据。
select class,count(*) from student3 group by class order by class;//分组后用class来进行排序。
小结
最后,对select语句中子句的顺序进行如下的截图记录:相关文章推荐
- 《MySQL必知必会学习笔记》:聚集函数
- mac安装mysql和修改mysql密码
- MySQL 数据库实现远程连接
- Wampserver #1045 无法登录 mysql 服务器
- Mysql Explain 详解
- mysql查看表结构的几种方式
- Mysql To Charts(五)--routers文件
- Navicat for MySQL每次打开数据库时,总是弹出“取得ER图表信息”框的解决方法
- 针对mysql基础数据类型测试
- MySQL 分区表
- Mysql中文乱码问题(unbutu)
- MySQL 5.7 版本登录报 error 1524: plugin ... in not loaded
- mysql-用户管理 用户无法本地登陆
- Mysql 语句汇总(性能篇)
- mysql5.6源码安装
- mysql note
- mysql error code '1064' 排查过程
- MySQL常用命令
- mysql定时创建MERGE分表
- 小白求解C环境的问题