Понимание SUM (NULL) в MySQL

обычно, когда NULL участвует в любом уравнении, тогда весь результат разрешается в NULL (например,SELECT 2 + NULL + 5 возвращает NULL)

то же самое относится к следующему случаю:

SELECT SUM(NULL) возвращает NULL. Proposition #1

что происходит, когда SUM используется для агрегирования столбец и столбец может содержать NULL ценности ?

на основе proposition #1 почему выход не приводит к NULL.

CREATE TABLE t (age INT NULL);

INSERT INTO t (age)  VALUES (15),(20), (NULL), (30), (35);

SELECT 
SUM(age)
FROM t;

выход: 100

но я ожидал NULL.

MySQL молча пропускает эти значения NULL в этом случае?

http://sqlfiddle.com/#!9/3f99bb/2

2 ответов


Ну, это объясняется в руководство

SUM ([DISTINCT] expr)
Возвращает сумму expr. Если возвращаемый набор не имеет строк, SUM () возвращает НОЛЬ. Ключевое слово DISTINCT может использоваться для суммирования только значений distinct из выраж.

SUM () возвращает NULL, если не было совпадающих строк.

более того, он также сказал, что:

в этом разделе описывается группа (aggregate) функции, которые работают на набор значений. Если не указано иное, функции группы игнорируют NULL ценности.

другими словами, SUM ведет себя так, потому что так это определено.


вы правы, агрегатные функции обрабатывают нулевые значения иначе, чем не агрегатные функции:

select 2 + NULL + 5

возвращает NULL, потому что NULL в этом контексте означает неизвестное значение, поэтому результат также будет NULL (unknown).

это вернет 7 вместо:

select SUM(n)
from (
  select 2 as n
  union all select null
  union all select 5
) s

потому что в этом контексте значение NULL, даже если оно неизвестно, можно рассматривать как "не указанное значение". Причина в том, что очень часто использовать NULL как не указанный значение и мало практического использования для включения нулей в агрегатную функцию, поэтому агрегатные функции определяются для игнорирования нулей.