创建分组:分组是在select语句的group by子句中建立的。在具体使用group by子句前,需要知道的一些重要的规定:
1)group by子句可以包含任意数目的列,这使得能对分组进行嵌套,为数据分组提供更细致的控制。
2)如果group by子句中嵌套了分组,数据将在最后规定的分组上进行汇总。也就是说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)。
3)group by子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在select中使用表达式,则必须在group by子句中指定相同的表达式,不能使用别名。
4)除聚集计算语句外,select语句中的每个列都必须在group by子句中给出。
5)如果分组列中具有null值,则null将作为一个分组返回。如果列中有多行null值,它们将分为一组。
6)group by子句必须出现在where子句之后,order by子句之前。
7)使用rollup,使用with rollup关键字,可以得到每个分组以及每个分组汇总级别(针对每个分组)的值。
where过滤行,而having过滤分组。where和having的差别,还有另一种理解方法。where在数据分组前进行过滤,having在数据分组后进行过滤。这是一个重要的区别,where排除的行不包括在分组中,这可能会改变计算值,从而影响having子句中基于这些值过滤掉的分组。
order by和group by之间的差别如下:
要注意,一般在使用group by子句时,应该给出order by子句。这是保证数据正确排序的唯一方法。千万不要依赖group by排序数据。
select语句中子句及其顺序如下: