先来看看语法sum的使用吧。
语句: select sum(age)from member
这个sql语句的会返回一个字段,那就是members表中的所有人的年龄和,就是所有人的总年龄。
那group by呢,它可以按照一定的条件使members表中的数据分组,然后分几组就会返回几行数据,并且字段是那些集合函数所得到的值,一般group by语句都和集合函数用在一起。
如下例:
select count(name)from member group by sex
此语句的意思就是从member表中按sex(性别)分组,然后查出每组的总人数。
Group By语句最常见的用法了,Group By + [分组字段](可以有多个)。在执行了这个操作以后,数据集将根据分组字段的值将一个数据集划分成各个不同的小组。比如有如下数据集,其中水果名称(FruitName)和出产国家(ProductPlace)为联合主键:
FruitName |
ProductPlace |
Price |
Apple |
China |
$1.1 |
Apple |
Japan |
$2.1 |
Apple |
USA |
$2.5 |
Orange |
China |
$0.8 |
Banana |
China |
$3.1 |
Peach |
USA |
$3.0 |
如果我们想知道每个国家有多少种水果,那么我们可以通过如下SQL语句来完成:
SELECT COUNT(*) AS 水果种类, ProductPlace AS 出产国
FROM T_TEST_FRUITINFO
GROUP BY ProductPlace
这个SQL语句就是使用了Group By + 分组字段的方式,那么这句SQL语句就可以解释成“我按照出产国家(ProductPlace)将数据集进行分组,然后分别按照各个组来统计各自的记录数量。”很好理解对吧。这里值得注意的是结果集中有两个返回字段,一个是ProductPlace(出产国), 一个是水果种类。
2.2 Group By All [expressions] :
Group By All + 分组字段, 这个和前面提到的Group By [Expressions]的形式多了一个关键字ALL。这个关键字只有在使用了where语句的,且where条件筛选掉了一些组的情况才可以看出效果。在SQL Server 2000的联机帮助中,对于Group By All是这样进行描述的:
如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生的所有组,即使某些组没有符合搜索条件的行。没有 ALL 关键字,包含 GROUP BY 子句的 SELECT 语句将不显示没有符合条件的行的组
其中有这么一句话“如果使用ALL关键字,那么查询结果将包含由Group By子句产生的所有组...没有ALL关键字,那么不显示不符合条件的行组。”这句话听起来好像挺耳熟的,对了,好像和LEFT JOIN 和 RIGHT JOIN 有点像。其实这里是类比LEFT JOIN来进行理解的。还是基于如下这样一个数据集:
首先我们不使用带ALL关键字的Group By语句:
SELECT COUNT(*) AS 水果种类, ProductPlace AS 出产国
FROM T_TEST_FRUITINFO
WHERE (ProductPlace <> 'Japan')
GROUP BY ProductPlace
那么在最后结果中由于Japan不符合where语句,所以分组结果中将不会出现Japan。
现在我们加入ALL关键字:
SELECT COUNT(*) AS 水果种类, ProductPlace AS 出产国
FROM T_TEST_FRUITINFO
WHERE (ProductPlace <> 'Japan')
GROUP BY ALL ProductPlace
重新运行后,我们可以看到Japan的分组,但是对应的“水果种类”不会进行真正的统计,聚合函数会根据返回值的类型用默认值0或者NULL来代替聚合函数的返回值。
查询每天信息数量
select count(*) as '信息数量',CONVERT(CHAR(8),n_addtime,112) as '时间' from zy_news group by CONVERT(CHAR(8),n_addtime,112) order by '时间' desc
下面我们再来看HAVING子句,HAVING子句可以让我们筛选成组后的各组数据,WHERE子句只能聚合前先筛选记录.但是不能筛选聚合后的组记录,where只能作用在GROUP BY 子句和HAVING子句前。但是HAVING子句能在聚合后对组记录进行筛选。
下面来看一个例子:
select sum(age) from member group by sex having sum(age)>400
这条申请量语句的意思就是:从member表中按sex(性别)分组,然后求出各组的年龄总和,至于后面的having是筛选出那些年龄总和大于400的组,在这样的sql语句中我们不能用where来筛选超过年龄超过400的组,因为表中不存在这样一条记录。这时只能用HAVING子句筛选成组后的各组数据。