您的位置:首页 > 数据库 > MySQL

Mysql| Mysql分组函数

2017-11-27 20:32 183 查看
分组数据: (GROUP BY,HAVING )

分组是对查询出来的所有结果行再进行分组,所以GROUP BY 应该在过滤条件WHERE之后.对数据分完组之后再在组内进行数据的排序.所以GROUP BY在ORDER BY子句之前.

文章内容:

如何使用GROUP BY子句对数据组进行这些汇总计算,返回每个组的结果。我们看到了如何使用HAVING子句过滤特定的组,还知道了ORDER BY和GROUP BY之间以及WHERE和HAVING之间的差异。

数据分组

GROUP BY子句指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。

对数据进行分组,主要的用途也是为了对组内的数据进行聚集运算(也就是针对不同的组可以使用聚集函数.)

GROUP BY子句的重要的规定:

①GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。

②如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)。

③GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。

④除聚集计算语句外, SELECT语句中的每个列都必须在GROUP BY子句中给出。

⑤如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。

⑥GROUP BY子句必须出现在WHERE子句之后, ORDER BY子句之前。

创建分组

GROUP BY
子句指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。


SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id;


+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1001 |         4 |
|    1002 |         2 |
|    1003 |         7 |
|    1005 |         2 |
+---------+-----------+


SQL解释:

上面的SELECT语句指定了两个列, vend_id包含产品供应商的ID,num_prods为计算字段(用
COUNT(*)
函数建立)。
GROUP BY
子句指示MySQL按vend_id排序并分组数据。这导致对每个vend_id而不是整个表计算num_prods一次。从输出中可以看到,供应商1001有3个产品,供应商1002有2个产品,供应商1003有7个产品,而供应商1005有2个产品。

关于ROLLUP的使用:

SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id WITH ROLLUP;


使用ROLLUP 使用WITH ROLLUP关键字,可以得到每个分组以及每个分组汇总级别(针对每个分组)的值,在一下结果中,可以知道vend_id为NULL的一行数据,后面的num_prods是以上所有数据的汇总.

+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1001 |         4 |
|    1002 |         2 |
|    1003 |         7 |
|    1005 |         2 |
|    NULL |        15 |
+---------+-----------+


过滤分组

HAVING支持所有WHERE操作符.

HAVING和WHERE的差别

这里有另一种理解方法,WHERE在数据分组前进行过滤, HAVING在数据分组后进行过滤。这是一个重要的区别, WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: