2015-05-11 239 views
2

在MySQL中SELECT 2+NULL FROM tbl_name將返回NULL,因爲MySQL無法將NULL解釋爲數字。總和,平均值,最大值,最小值,空值計數

但爲什麼SELECT SUM(quantity) FROM tbl_name不返回NULL如果其中一個值是NULLMINMAXAVG等等也是一樣。由於MySQL不知道NULL是什麼,它不應該爲所有指定的函數返回NULL嗎?

+0

聚合函數忽略空值'除非另有說明,組函數忽略NULL values' https://dev.mysql.com/doc/refman/5.6/en /組逐功能。html – Mihai

+0

如果存在NULL值,那麼這些函數將會失敗。在這種情況下,MySQL不會將其解釋爲零,因爲聚合函數將簡單地忽略任何NULL。如果那就是你的意思。 – Nidhoegger

回答

3

這是一個很好的問題,並沒有一個很好的答案。在你的兩個例子中NULL的處理是不同的。

基本問題是NULL的含義。通常,它用於表示缺少值。但是,在ANSI標準中,它代表未知的值。我敢肯定,哲學家可以致力於「失蹤」與「未知」之間的區別。

在一個簡單的表達式(布爾或算術或其他類型的標量)中,ANSI幾乎在所有操作數都是「未知」的情況下定義了「未知」的結果。有一些例外情況:NULL AND FALSE爲假,NULL IS NULL爲真,但這些情況很少見。

對於聚合操作,將SUM()設想爲「總和所有已知值」,依此類推。 SUM()對待NULL的值與+不同。但是,這種行爲也是標準的,因此所有數據庫的工作方式都是如此。

如果你想對一個聚合一個NULL值時操作數的任何NULL,那麼你需要使用CASE。我覺得對於一個列的最簡單的方法是:

(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END) 
0

簡單,

2 + NULL,可能與一行只涉及...

其中,作爲SUM(2 and NULL)將與2個不同行。所以,NULL s簡單地被忽略,而你組!對於僅在同一行的null發生的情況,將再次解析爲NULL。

所以

COUNT(NULL,1) = 1 (not 2) 
MAX(NULL,1) = 1 
MIN(NULL,1) = 1 
AVG(NULL,1) = 1 (not .5) 

此行爲是相同的大多數DBMS版本!

3

根據MySQL Reference,NULL值在集合函數中被忽略。以下是該頁面的直接引用:

除非另有說明,否則組函數將忽略NULL值。

相關問題