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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值