天天看點

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)      
TSQL 聚合函數忽略NULL值

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)      
TSQL 聚合函數忽略NULL值

 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)      
TSQL 聚合函數忽略NULL值

3,count(*)或count(0)的特殊之處,不檢查null值,傳回分組的總行數

select count(ft.ID),count(0),count(*)
from dbo.ftip ft with(NOLOCK)      
TSQL 聚合函數忽略NULL值

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      
TSQL 聚合函數忽略NULL值

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)      
TSQL 聚合函數忽略NULL值

二,聚合函數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)的差別和執行方式

作者

:悅光陰

出處

:http://www.cnblogs.com/ljhdo/

本文版權歸作者和部落格園所有,歡迎轉載,但未經作者同意,必須保留此段聲明,且在文章頁面醒目位置顯示原文連接配接,否則保留追究法律責任的權利。

繼續閱讀