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.
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
SELECT id, nombre, email
FROM clientes
ORDER BY email ASC NULLS LAST, id;| id | nombre | |
|---|---|---|
| 1 | Ana Torres | ana@example.test |
| 11 | Elena Rey | elena@example.test |
| 8 | Hugo Castro | hugo@example.test |
| … | … | … |
| 4 | Diego López | NULL |
| 6 | Pablo Sanz | NULL |
| 12 | Mario Gil | NULL |
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:
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
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.
id como segundo criterio.Solución razonada
SELECT id, nombre, email
FROM clientes
ORDER BY email ASC NULLS LAST, id;El primer criterio define el orden alfabético de los valores conocidos y mueve los NULL al final. El identificador completa un orden determinista.
Qué debes recordar
ASC/DESCy la posición de NULL son decisiones separadas.NULLS FIRSTyNULLS LASThacen 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.