mysql 在計算avg() 時 會自動將null值過濾掉不參與計算,
因爲NULL
與數字不同0
。
從概念上講,它NULL
意味着“缺失的未知值”,並且與其他值的處理方式略有不同。這就是像ignore s 這樣的聚合函數。AVG()
NULL
AVG()
僅計算所有已知值的平均值。(= 不是 NULL =未知)
來自MySQL文檔:
除非另有說明,否則組函數會忽略NULL值。
另外,請閱讀 MySQL手冊“3.3.4.6使用NULL值”一節中的NULL
s 概念。
爲了得到你想要的東西,你可能會這樣做
SELECT AVG(IFNULL(marks, 0)) FROM sample GROUP BY(name);
IFNULL()
如果值爲NULL
或通過該值,則返回計算的第二個參數。
關於概念存在更多常見的誤解NULL
。這些也在本手冊的“5.5.3 NULL的問題”一節中進行了解釋:
-
在SQL中,與任何其他值相比,“NULL”值永遠不會爲真,即使是“NULL”。包含“NULL”的表達式總是產生一個“NULL”值,除非在文檔中爲表達式中涉及的運算符和函數另有說明。
ie:`NULL == 0`導致NULL而不是`true`。“NULL == NULL”也會導致NULL,而不是true。 -
要搜索“NULL”的列值,不能使用`expr = NULL`測試。要查找“NULL”值,必須使用`IS NULL`測試。
-
當使用`DISTINCT`,`GROUP BY`或`ORDER BY`時,所有`NULL`值都被視爲相等。
-
使用`ORDER BY`時,首先顯示`NULL`值,如果指定`DESC`按降序排序則返回最後一個值。
-
對於某些數據類型,MySQL特別處理NULL值。如果在`TIMESTAMP`列中插入`NULL`,則插入當前日期和時間。
-
如果將“NULL”插入到具有“AUTO_INCREMENT”屬性的整數或浮點列中,則插入序列中的下一個數字。
-
定義了“UNIQUE”鍵的列仍然可以包含多個“NULL”值。