TSQL 聚合函數忽略NULL值


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,則計數。

 

參照文檔:

COUNT (Transact-SQL)

Select count(*)和Count(1)的區別和執行方式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM