Подтвердить что ты не робот

Понимание СУММ (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

4b9b3361

Ответ 1

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

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

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

Что еще он сказал, что:

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

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

Ответ 2

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

select 2 + NULL + 5

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

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

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

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