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)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5SM3EjN4QzMxYTMtYTN1QjM3EzNxkDMxETNxAjMtQDOwgjM28CXxETNxAjMvwFN4ADOyYzLcd2bsJ2Lc12bj5ycn9Gbi52YuUTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.jpg)
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)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5SM3EjN4QzMxYTMtYTN1QjM3EzNxkDMxETNxAjMtQDOwgjM28CXxETNxAjMvwFN4ADOyYzLcd2bsJ2Lc12bj5ycn9Gbi52YuUTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.jpg)
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)的差別和執行方式
作者:悅光陰
出處:http://www.cnblogs.com/ljhdo/
本文版權歸作者和部落格園所有,歡迎轉載,但未經作者同意,必須保留此段聲明,且在文章頁面醒目位置顯示原文連接配接,否則保留追究法律責任的權利。