Ответ 1
Это правильное поведение, потому что NULL
не совпадает с числом 0
.
Концептуально, NULL
означает "пропущенное неизвестное значение", и оно трактуется несколько иначе, чем другие значения. Вот почему агрегатные функции, такие как AVG()
игнорируют NULL
.
AVG()
вычисляет среднее значение только по всем известным значениям. (= это не NULL = не неизвестно)
Из документов MySQL:
Если не указано иное, групповые функции игнорируют значения NULL.
Также ознакомьтесь с концепцией NULL
в разделе "3.3.4.6 Работа со значениями NULL" руководства MySQL.
Чтобы получить то, что вы хотите, вы могли бы сделать
SELECT AVG(IFNULL(marks, 0)) FROM sample GROUP BY(name);
IFNULL()
возвращает второй аргумент для вычислений, если значение равно NULL
или проходит через значение в противном случае.
Есть более распространенные недоразумения относительно концепции NULL
. Это также объясняется в разделе "5.5.3 Проблемы с NULL" руководства:
-
В SQL значение "NULL" никогда не является истинным по сравнению с любым другим значением, даже "NULL". Выражение, содержащее "NULL", всегда создает значение "NULL", если иное не указано в документации для операторов и функций, участвующих в выражении.
то есть: "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 специально. Если вы вставите "NULL" в столбец "TIMESTAMP", будут вставлены текущие дата и время.
-
Если вы вставите 'NULL' в столбец с целыми числами или с плавающей запятой, который имеет атрибут 'AUTO_INCREMENT', вставляется следующий номер в последовательности.
-
Столбец, для которого определен ключ UNIQUE, может содержать несколько значений NULL.