max,min,sum,avg聚合函數會忽略null值,但不代表聚合函數不返回null值,如果表為空表,或聚合列都是null,則返回null。count 聚合函數忽略null值,如果聚合列都是null或表為空表,則返回0。
共性:Null values are ignored.
一,聚合函數忽略NULL值
示例數據表
create table dbo.ftip ( ID int)
1,當表中沒有任何數據時,聚合函數的返回值
select max(ft.ID),min(ft.ID),sum(ft.ID),AVG(ft.ID),count(ft.ID) from dbo.ftip ft with(NOLOCK)
2,當表中存在數據時,聚合函數對null值得處理
2.1, 表中數據只有null
insert into dbo.ftip values(null)
select max(ft.ID),min(ft.ID),sum(ft.ID),AVG(ft.ID),count(ft.ID) from dbo.ftip ft with(NOLOCK)
2.2 表中的數據含有null,也含有非null
insert into dbo.ftip values(1) select max(ft.ID),min(ft.ID),sum(ft.ID),AVG(ft.ID),count(ft.ID) from dbo.ftip ft with(NOLOCK)
3,count(*)或count(0)的特殊之處,不檢查null值,返回分組的總行數
select count(ft.ID),count(0),count(*) from dbo.ftip ft with(NOLOCK)
4,在group by子句中,SQL Server 認為所有的null值是相同的,所有的null值分到同一個組中。
select ft.ID,count(ft.ID),count(0),count(*),max(ft.ID),min(ft.ID),sum(ft.ID),AVG(ft.ID) from dbo.ftip ft with(NOLOCK) group by ft.ID
5,聚合函數會忽略Null值,對非NULL的值進行聚合。
insert into dbo.ftip values(2) select max(ft.ID),min(ft.ID),sum(ft.ID),AVG(ft.ID),count(ft.ID) from dbo.ftip ft with(NOLOCK)
二,聚合函數Count的不同寫法
Count有三種寫法:count(*),count(expression),count(column_name),計數說明:
- Count(expression) ,count(column_name)計數的機制是:計算 expression,或表中column_name的值是否為NULL,如果為NULL則不計數,如果不是NULL則會計數;
- count(*),返回表中行的數目。Specifies that all rows should be counted to return the total number of rows in a table,即使有null或duplicate value,也會計算在內;
- 如果Expression或column_name的值不是null,count(expression),count(column_name)和count(*)返回的結果是相同的;
1,創建示例數據
create table dbo.test (id int) insert into dbo.test values(1),(2),(null)
2,測試 count(expression)
DECLARE @var int=null select count(@var) from dbo.test
結果分析:返回的結果是0,原因是expression是null,count函數對null值不計數。
3,測試count(0),count(*)
select count(*), count(0) from dbo.test
結果分析:返回的結果都是3,說明count(*)計算表的行數,不排除null值或duplicate值。由於0是非null值,count(0)和count(*)執行結果是相同的。
4,測試count(column_name)
select count(id) from dbo.test
結果分析:返回的結果是2,從表中取出id值,如果為null,則不計數;如果不是null,則計數。
參照文檔: