Solución:
Este es el comportamiento correcto, porque NULL
no es lo mismo que el número 0
.
Para algunas personas que no hablan inglés, esto puede resultar sorprendente, porque en muchos idiomas “nulo” es equivalente a “cero”.
Conceptualmente NULL
se refiere a un “valor desconocido” y, como tal, se trata de manera diferente a otros valores. Es por eso que funciones agregadas como AVG()
ignorar NULL
s.
AVG()
calcula el promedio de todos los valores “conocidos” únicamente. (= que son no NULO)
De los documentos de MySQL:
A menos que se indique lo contrario, las funciones de grupo ignoran los valores NULL.
Además, lea sobre el concepto de NULL
s en la Sección “3.3.4.6 Trabajar con valores NULL” del manual de MySQL.
Para conseguir lo que quieres, puedes hacer
SELECT AVG(IFNULL(marks, 0))
FROM sample
GROUP BY name;
IFNULL()
devuelve el segundo argumento para los cálculos si el valor es NULL
o pasa por el valor de otra manera.
Hay malentendidos más comunes con respecto al concepto de NULL
. También se explican en la sección “5.5.3 Problemas con NULL” del manual:
- En SQL, el
NULL
El valor nunca es verdadero en comparación con cualquier otro valor, inclusoNULL
. Una expresión que contieneNULL
siempre produce unNULL
valor a menos que se indique lo contrario en la documentación para los operadores y funciones involucradas en la expresión.es decir:
NULL == 0
da como resultado NULL en lugar detrue
. TambiénNULL == NULL
da como resultado NULL, en lugar de verdadero.- Para buscar valores de columna que son
NULL
, no puedes usar unexpr = NULL
prueba. BuscarNULL
valores, debe utilizar elIS NULL
prueba.- Cuando usas
DISTINCT
,GROUP BY
, oORDER BY
, todosNULL
los valores se consideran iguales.- Cuando usas
ORDER BY
,NULL
los valores se presentan primero, o al final si especificaDESC
para ordenar en orden descendente.- Para algunos tipos de datos, MySQL maneja valores NULL especialmente. Si inserta
NULL
en unTIMESTAMP
columna, se inserta la fecha y hora actuales.- Si inserta
NULL
en una columna entera o de punto flotante que tiene elAUTO_INCREMENT
atributo, se inserta el siguiente número de la secuencia.- Una columna que tiene un
UNIQUE
La clave definida todavía puede contener múltiplesNULL
valores.
Tratar:
select avg(case marks when null then 0 else marks end) from sample group by name;
O intente evitar nulos en la tabla;)
Puedes hacer esto en su lugar:
SELECT SUM(marks) / COUNT(name)
FROM sample
GROUP BY name;