COUNT(*)返回所有行数,包括值为NULL的行数。
COUNT(address)返回address不为NULL的行数。
AVG,SUM,MAX,MIN都会忽略值为NULL的行。
MIN如果对非数值数据操作。将返回该列排序最前面的行。
MAX如果对非数值数据操作。将返回该列排序最后面的行。
ALL和DISTINCT
ALL是聚合函数的默认行为,如果不指定DISTINCT,则默认为对所有行执行计算。
SELECT COUNT(ALL address) FROM Users 等价于 SELECT COUNT(address) FROM Users
SELECT SUM(DISTINCT price) FROM Products
DISTINCT可以用于MIN或者MAX,但是这样做没有意义。
因为不管取最大值还是最小值都和数据是否重复无关。
DISTINCT后面必须有列名,所以COUNT(DISTINCT *)是不合法的。
GROUP BY
如果分组列中包含NULL的值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
GROUP BY 子句中列出的必须是列或者有效的表达式(聚合函数除外)。不能使用别名。
SQLSERVER不支持按列的相对位置分组。
GROUP BY ALL--这是个有意思的功能,看下面的例子:
(
[D_NAME] CHAR(10) NOT NULL PRIMARY KEY,
[D_ADDRESS] NVARCHAR(MAX) NULL
)
GO
VALUES('AAA'),('CCC'),('DDD')
GO
VALUES('BBB','Software Square A'),
('EEE','Software Square A'),
('FFF','Software Square B')
GO
可以看到NULL作为一组被分了出来。
SELECT D_ADDRESS,COUNT(D_ADDRESS) AS ADDRESS_COUNT FROM T_DEMO GROUP BY D_ADDRESS
可以看到NULL这个组COUNT聚合函数不去计算它。
SELECT D_ADDRESS,COUNT(D_ADDRESS) AS ADDRESS_COUNT FROM T_DEMO
WHERE D_ADDRESS='Software Square A'
GROUP BY D_ADDRESS
加了一个WHERE语句,这个结果没什么好说的。注意下面:
SELECT D_ADDRESS,COUNT(D_ADDRESS) AS ADDRESS_COUNT FROM T_DEMO
WHERE D_ADDRESS='Software Square A'
GROUP BY ALL D_ADDRESS
加了一个ALL关键字在GROUP BY 的后面,结果将所有分组都拿了出来,但是聚合函数没有计数。