数据库如何分组数据

主要涉及两个新SELECT语句子句,分别是:GROUP BY子句和HAVING子句。
一、数据分组
分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。
二、创建分组
分组是在SELECT语句的GROUP BY子句中建立的。如下:

输入:SELECT vend_id,COUNT(*) AS num_prods
             FROM Products
             GROUP BY vend_id;

分析:因为使用了GROUP BY,就不必指定要计算和估值的每个组了。系统会自动完成。GROUP BY子句指示DBMS分组数据,然后对每个组而不是整个结果进行聚集。

在具体使用GROUP BY子句前,需要知道一些重要的规定:
1、GROUP BY子句可以包含任意数目的列。使得能对分组进行嵌套,为数据分组提供更细致的控制。
2、如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起进行计算(所以不能从个别的列取回数据)。
3、GROUP BY子句中列出的每个列都必须是检索或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。
4、大多数SQL实现不允许GROUP BY列带有长度可变的数据类型(如文本或备注型字段)。
5、除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出。
6、如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
7、GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

三、过滤分组
除了能用GROUP BY分组数据外,SQL还允许过滤分组,鬼sing包括哪些分组,排除哪些分组。例如:可能想要列出至少两个订单的所有顾客。为得出这种数据,必须基于完整的分组而不是个别的进行过滤。
HAVING子句非常类似于WHERE。事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代,唯一的差别是WHERE过滤行,而HAVING过滤分组。

输入:SELECT cust_id,COUNT(*) AS num_prods
             FROM Products
             GROUP BY cust_id
             HAVING COUNT(*)>=2;

分析:这条SELECT语句的前三行类似于上面的语句,最后一行增加了HAVING子句,它过滤COUNT(*)>=2(两个以上的订单)的那些分组。

WHERE过滤是基于特定行值而不是分组聚集值的。

HAVING和WHERE的差别:这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中,这可能会改变计算值,从而影响到HAVING子句中基于这些值过滤掉的分组。

同时用到WHERE和HAVING的语句:
输入:SELECT vend_id,COUNT(*) AS num_prods
             FROM Products
             WHERE prod_price>=4
             GROUP BY vend_id
             HAVING COUNT(*)>=2;

使用HAVING和WHERE非常类似,如果不指定GROUP BY,则大多数DBMS将把他们作为相同的东西对待,不过,自己要区分这一点,应该在仅与GROUP BY子句结合时才使用HAVING,而WHERE子句用于标准的行级过滤。

四、分组和排序
虽然GROUP BY和ORDER BY经常完成相同的工作,但它们是非常不同的。

        数据库如何分组数据_第1张图片


注意:不要忘记ORDER BY,一般在使用GROUP BY子句时,应该也会给出ORDER BY子句,这是保证数据正确排序的唯一方法,千万不要依赖于GROUP BY排序数据。

输入:SELECT vend_id,COUNT(*) AS num_prods
             FROM Products
             GROUP BY vend_id
             HAVING COUNT(*)>=2;

输入:SELECT vend_id,COUNT(*) AS num_prods
             FROM Products
             GROUP BY vend_id
             HAVING COUNT(*)>=2
             ORDER BY vend_id,num_prods;

最后多的ORDER BY将排序输出分组后的结果。

五、SELECT子句的顺序
回顾一下SELECT语句中子句的顺序。

数据库如何分组数据_第2张图片

你可能感兴趣的:(数据库,数据库)