English

Manual de campo · trampas de SQL

¿Por qué COUNT(columna) da menos que COUNT(*)?

COUNT(*) cuenta filas. COUNT(columna) cuenta valores no nulos de esa columna. Si la columna admite NULL, los dos números casi nunca coinciden, y la diferencia no es un error: son los nulos.

Cuándo aparece

Cualquier reporte que cuenta 'cuántas llamadas', 'cuántos clientes' o 'cuántos registros' usando COUNT sobre una columna en vez de COUNT(*). Pregunta habitual de entrevista porque la respuesta 'incorrecta' no da ningún error.

Ejemplo

Mal: se interpreta COUNT(columna) como el total de filas

SELECT COUNT(numero) AS llamadas
FROM llamadas;
-- la vecina jura que sonó 7 veces; esto devuelve 4:
-- las 3 llamadas con número oculto tienen numero = NULL

Bien: COUNT(*) para filas, COUNT(columna) sólo si de verdad quieres los no nulos

SELECT COUNT(*)      AS llamadas_totales,
       COUNT(numero) AS con_numero_visible
FROM llamadas;

COUNT(*) cuenta filas, sin mirar ninguna columna. COUNT(columna) cuenta cuántas de esas filas tienen un valor no nulo en esa columna concreta; salta cada NULL, como hace cualquier función de agregación salvo COUNT(*). Ninguna de las dos consultas falla ni avisa: si alguien pide 'cuántas llamadas hubo' y usa COUNT(numero) porque numero es la columna que tiene delante, el número que sale es real, sólo que responde a otra pregunta. La regla de oficio: para 'cuántas filas hay', COUNT(*); COUNT(columna) es para 'cuántas de esas filas tienen dato en esta columna', y esa es una pregunta distinta con una respuesta distinta.

El juego está lleno de trampas como esta, escondidas en casos con datos de verdad.

Jugar el caso 1 gratis →

Trampas relacionadas