Понимание 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 в этом случае?
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 как не указанный значение и мало практического использования для включения нулей в агрегатную функцию, поэтому агрегатные функции определяются для игнорирования нулей.