Sql 复习(3)

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--这是个有意思的功能,看下面的例子:

CREATE TABLE T_DEMO
(
[D_NAME] CHAR(10) NOT NULL PRIMARY KEY,
[D_ADDRESS] NVARCHAR(MAX) NULL
)
GO
--加三个没有地址的数据
INSERT INTO T_DEMO(D_NAME)
VALUES('AAA'),('CCC'),('DDD')
GO
--加两个地址相同,一个地址不同的数据
INSERT INTO T_DEMO(D_NAME,D_ADDRESS)
VALUES('BBB','Software Square A'),
('EEE','Software Square A'),
('FFF','Software Square B')
GO
 
SELECT D_ADDRESS FROM T_DEMO GROUP BY D_ADDRESS

可以看到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 的后面,结果将所有分组都拿了出来,但是聚合函数没有计数。

原文地址:https://www.cnblogs.com/grady1028/p/10660677.html