在MySQL中SELECT 2+NULL FROM tbl_name
將返回NULL
,因爲MySQL無法將NULL
解釋爲數字。總和,平均值,最大值,最小值,空值計數
但爲什麼SELECT SUM(quantity) FROM tbl_name
不返回NULL
如果其中一個值是NULL
? MIN
,MAX
,AVG
等等也是一樣。由於MySQL不知道NULL是什麼,它不應該爲所有指定的函數返回NULL嗎?
在MySQL中SELECT 2+NULL FROM tbl_name
將返回NULL
,因爲MySQL無法將NULL
解釋爲數字。總和,平均值,最大值,最小值,空值計數
但爲什麼SELECT SUM(quantity) FROM tbl_name
不返回NULL
如果其中一個值是NULL
? MIN
,MAX
,AVG
等等也是一樣。由於MySQL不知道NULL是什麼,它不應該爲所有指定的函數返回NULL嗎?
這是一個很好的問題,並沒有一個很好的答案。在你的兩個例子中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)
簡單,
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版本!
根據MySQL Reference,NULL值在集合函數中被忽略。以下是該頁面的直接引用:
除非另有說明,否則組函數將忽略NULL值。
聚合函數忽略空值'除非另有說明,組函數忽略NULL values' https://dev.mysql.com/doc/refman/5.6/en /組逐功能。html – Mihai
如果存在NULL值,那麼這些函數將會失敗。在這種情況下,MySQL不會將其解釋爲零,因爲聚合函數將簡單地忽略任何NULL。如果那就是你的意思。 – Nidhoegger