本篇文章是MySQL的第四篇教程,对于MySQL来说,对于后端开发人员来说是必不可少的东西,我是深受MySQL的折磨和打击,不管是面试的工程中,还是在日常的开发工作当中都是如此。所以写这一系列的文章就是和一些新手小伙伴们共同进步共同学习,把我在日常所遇到的一些坑,在这里展示给大家,希望大家能有所收获,感兴趣的小伙伴们也希望能点赞关注一下。
本篇文章主要将主要介绍分组数据,以及便于能汇总表的内容,分别是group by和having字句,主要内容就是这两个,以及我会介绍给大家从如何创建分组,过滤分组和分组的排序,这几个具体的操作给大家来演示一下。
创建分组分组是在SELECT语句的GROUP BY子句里面建立的,理解分组的最好办法就是看下面一个例子。
上面的SELECT语句中指定了两个列,vend_id和num_prods用count进行连接,GROUP BY指的是MySQL按照vend_id排序分组的数据,因为使用了GROUP BY就没有必要指定要计算和估值的没个组了,系统会自动完成.在使用GROUP BY的时候需要注意下面几个问题。
GROUP BY子句可以包含任意数目的列,这使得能对分组进行嵌套,为数据提供跟细致的控制。
如果在GROUP BY子句里面嵌套分组,数据将在最后规定的分组上面进行汇总,欢聚话说就是,在建立分组的时候指定的所有列都会在一起进行计算。
GROUP BY子句中列出的每个列都必须是检索列或者有效的表达式,但不能是聚集函数,如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式,不能使用别名。
如果分组列中具有NULL值,则null值将作为一个分组返回,还有就是GROUP BY子句必须出现在WHERE子句之后,ORDER BY之前。
2.过滤分组
除了使用GROUP BY分组数据外,MySQL还允许过滤分组,也就是筛序数据,根据条件,规定哪些分组,排除哪些分组,比如对于一个订单表来说,最少让你列出两个顾客的订单出来,为了得到这种数据,那就是必须基于完整的分组而不是个别的进行过滤。
在MySQL里面提供了另外一个子句,那即是HAVING子句,他非常类似于WHERE,实际上目前我们使用的大多数select语句都是在过滤数据过滤行,而不是过滤分组。HAVING他也是支持所有的where操作符的。看下面的例子。
在这条语句当中,第一行是使用了聚集函数的最基本的SELECT,他与之前的例子很像,然后使用GROUP BY进行对数据的分组,但是后面哟紧跟着一个HAVING子句,这个就是对分组进行的过滤。只显示出num_prods大于等于2的值。
3.分组和排序
虽然GROUP BY和ORDER BY经常完成相同的工作,但是他们之间是非常不同的
可以看得出来,两者之间的饿第一条差距是你很大的,我们经常发现用GROUP BY分 组的数据确实是以分组顺序输出的。但情况并不总是这样,它并不是SQL 规范所要求的。此外,用户也可能会要求以不同于分组的顺序排序。仅 因为你以某种方式分组数据(获得特定的分组聚集值),并不表示你需要 以相同的方式排序输出。应该提供明确的ORDER BY子句,即使其效果等 同于GROUP BY子句也是如此。
还有一个需要注意的就是,一般在使用GROUP BY子句时,应该也给 出ORDER BY子句。这是保证数据正确排序的唯一方法。千万 不要仅依赖GROUP BY排序数据。为了跟好的理解两者之间的区别看下面的例子。
在这个例子中,GROUP BY子句用来按订单号(order_num列) 分组数据,以便SUM(*)函数能够返回总计订单价格。HAVING子 句过滤数据,使得只返回总计订单价格大于等于50的订单。最后,用ORDER BY子句排序输出。
今天的数据的分组大概就是这么多,到此结束,还是那句话,后面会持续输出关于MySQL的相关知识,希望大家多多支持,点赞关注一下。