SQL · ordenación y NULL

NULLS FIRST y NULLS LAST en ORDER BY

Decide de forma explícita si los valores ausentes deben aparecer al principio o al final y evita depender del comportamiento predeterminado de cada motor.

Lectura: 6–8 minSQL comprobadoPráctica con pistas
Contenido de esta guía

Respuesta rápida

NULLS FIRST y NULLS LAST indican si los valores NULL deben aparecer antes o después de los valores conocidos dentro de un ORDER BY.

Orden explícito de NULL
ORDER BY columna ASC NULLS LAST;
ORDER BY columna DESC NULLS FIRST;

El objetivo es no depender del orden predeterminado del motor cuando la posición de los valores ausentes forma parte de la lógica de presentación.

Modelo mental: dirección y posición de NULL son decisiones distintas

ASC o DESC define cómo se ordenan los valores conocidos. La posición de NULL puede tener un valor predeterminado diferente según el motor. Si tu requisito dice «correos conocidos primero» o «fechas sin informar al final», conviene expresarlo.

No confíes en una observación casual. Que un conjunto pequeño muestre siempre los NULL al final no significa que esa sea una regla portable entre bases de datos.

Ejemplo comprobado: correos conocidos antes que los ausentes

Clientes ordenados por email
SELECT id, nombre, email
FROM clientes
ORDER BY email ASC NULLS LAST, id;
Resultado comprobado en SQLite 3.46.1
idnombreemail
1Ana Torresana@example.test
11Elena Reyelena@example.test
8Hugo Castrohugo@example.test
………
4Diego LópezNULL
6Pablo SanzNULL
12Mario GilNULL

email ASC ordena alfabéticamente los correos conocidos y NULLS LAST desplaza los tres valores ausentes al final. id resuelve el orden entre filas que comparten el mismo email o el mismo NULL.

Alternativa con CASE cuando el motor no admite la sintaxis

Una expresión de orden puede separar primero las filas con NULL y después ordenar el valor real:

Patrón con CASE
SELECT id, nombre, email
FROM clientes
ORDER BY
  CASE WHEN email IS NULL THEN 1 ELSE 0 END,
  email ASC,
  id;

El primer criterio devuelve 0 para correos conocidos y 1 para NULL. Como el orden es ascendente, los valores conocidos aparecen primero. Esta forma es más larga, pero deja la intención explícita incluso donde NULLS LAST no está disponible.

Compatibilidad entre motores

PostgreSQL permite NULLS FIRST y NULLS LAST y documenta que, por defecto, los NULL se consideran mayores que los valores no nulos: con ASC quedan al final y con DESC al principio. SQLite también admite las dos opciones; su orden predeterminado considera NULL menor que otros valores.

MySQL documenta otro comportamiento predeterminado: NULL aparece primero con orden ascendente y al final con descendente. Si necesitas el mismo resultado en varios motores, una expresión con CASE evita depender de esas diferencias.

Con varias columnas, cada criterio tiene su propia regla

En ORDER BY fecha NULLS LAST, id DESC, la regla de NULL pertenece a fecha. El segundo criterio solo desempata filas que ya quedaron en la misma posición según el primero.

Errores frecuentes

Suponer el mismo valor predeterminado en todos los motores

PostgreSQL, SQLite y MySQL no parten de la misma regla. Escribe una intención explícita cuando el orden de los valores ausentes importe.

Olvidar un desempate

Todas las filas con NULL pueden quedar empatadas. Añade una clave estable, como id, si necesitas resultados reproducibles.

Práctica guiada

Básica · ORDER BY

Clientes sin email al final

Devuelve id, nombre y email. Ordena primero por email ascendente, coloca NULL al final y usa id para desempatar.

Criterio de éxito: los correos conocidos aparecen antes de los tres NULL.

Qué debes recordar

  • ASC/DESC y la posición de NULL son decisiones separadas.
  • NULLS FIRST y NULLS LAST hacen explícita esa posición cuando el motor los admite.
  • Los valores predeterminados cambian entre motores.
  • CASE WHEN columna IS NULL... ofrece una alternativa explícita.
  • Añade un desempate cuando necesites un orden reproducible.

Conceptos relacionados

Fuentes técnicas consultadas