Volver a la lista de artículos Artículos
Lectura de 9 minutos

Cómo funcionan ORDER BY y NULL en SQL

¿Los valores NULL van al principio o al final cuando se usa ORDER BY? ¿Se consideran superiores o inferiores a los valores no NULL? En este artículo, explicaré cómo las diferentes bases de datos relacionales tratan los valores NULL al ordenar la salida, y cómo cambiar el comportamiento predeterminado de la cláusula ORDER BY.

Cuando los usuarios de LearnSQL practican la cláusula ORDER BY en nuestro curso SQL para principiantes, suelen preguntar por qué los valores NULL aparecen primero en la salida y cómo pueden cambiar este comportamiento. Inspirado por estas preguntas, voy a hacer una inmersión profunda en el tema de ordenar filas que contienen valores NULL.

¿Los valores NULL siempre van primero de manera predeterminada? ¿Es posible cambiar la forma en que ORDER BY ordena los valores NULL? ¿Cómo se pueden aplicar las opciones NULLS FIRST y NULLS LAST? ¡Averigüémoslo!

¿Cómo se ordenan los valores NULL de manera predeterminada?

El estándar SQL no define el ordenamiento predeterminado de valores NULL. ¿Qué significa esto?

Si aplicas la cláusula ORDER BY a una columna con valores NULL, los valores NULL se colocarán en primer o último lugar en el conjunto de resultados. El resultado depende del tipo de base de datos. Veamos cómo las diferentes bases de datos relacionales ordenan los valores NULL.

PostgreSQL

De manera predeterminada, PostgreSQL considera los valores NULL mayores que cualquier valor no NULL. Si ordenas tu salida en orden ascendente, añadiendo la palabra clave ASC o por defecto (es decir, sin especificar el orden), todos los valores NULL se mostrarán últimos en la salida. He aquí un ejemplo:

SELECT *
FROM paintings
ORDER BY year;
idpaintingauthoryear
4The Night WatchRembrandt1642
2The Starry NightVincent van Gogh1889
3The ScreamEdvard Munch1893
1Mona LisaLeonardo da VinciNULL
5The Birth of VenusSandro BotticelliNULL

Si utilizas la palabra clave DESC en ORDER BY para ordenar los valores en orden descendente, obtendrás los valores NULL en la parte superior de la tabla de resultados.

SELECT *
FROM paintings
ORDER BY DESC year;
idpaintingauthoryear
1Mona LisaLeonardo da VinciNULL
5The Birth of VenusSandro BotticelliNULL
3The ScreamEdvard Munch1893
2The Starry NightVincent van Gogh1889
4The Night WatchRembrandt1642

Oracle

Oracle trata los valores NULL de la misma manera que PostgreSQL. En concreto, la documentación de Oracle indica que "si no se especifica el ordenamiento de los valores nulos, el manejo de los valores nulos es NULLS LAST (nulos al final) si el ordenamiento es ASC, y NULLS FIRST (nulos al principio) si el ordenamiento es DESC". En efecto, Oracle considera que los valores NULL son mayores que cualquier valor no NULL.

SQLite

A diferencia de los tipos de bases de datos anteriores, SQLite considera que los NULL son menores que cualquier otro valor. Si ordenas una columna con valores NULL en orden ascendente, los NULL irán primero.

SELECT *
FROM paintings
ORDER BY year;
idpaintingauthoryear
1Mona LisaLeonardo da VinciNULL
5The Birth of VenusSandro BotticelliNULL
4The Night WatchRembrandt1642
2The Starry NightVincent van Gogh1889
3The ScreamEdvard Munch1893

En cambio, si añades la palabra clave DESC para obtener un orden descendente, los NULL aparecerán en último lugar.

SELECT *
FROM paintings
ORDER BY year DESC;
idpaintingauthoryear
3The ScreamEdvard Munch1893
2The Starry NightVincent van Gogh1889
4The Night WatchRembrandt1642
5The Birth of VenusSandro BotticelliNULL
1Mona LisaLeonardo da VinciNULL

MySQL

Al igual que SQLite, MySQL considera que los valores NULL son inferiores a cualquier valor no NULL. Si utilizas esta base de datos, espera el mismo tratamiento de valores NULL que el ilustrado anteriormente: los NULL aparecerán en primer lugar si se utiliza el orden ascendente y en último lugar si se utiliza el orden descendente.

SQL Server

SQL Server también trata los valores NULL como menores que cualquier valor no NULL. Verás los valores NULL primeros cuando una columna esté ordenada de manera ascendente y últimos cuando la columna está ordenada de manera descendente.

Resumamos cómo se ordenan los valores NULL de manera predeterminada en diferentes bases de datos:

ASCDESC
Los valores NULL aparecen al principioSQL Server, MySQL, SQLitePostgreSQL, Oracle
Los valores NULL aparecen al finalPostgreSQL, OracleSQL Server, MySQL, SQLite

Cómo cambiar el comportamiento predeterminado de ORDER BY

Ahora que conoces el comportamiento predeterminado de varias bases de datos en la ordenación de los valores NULL, quizás te preguntes si es posible cambiarlo.

La respuesta varía según el tipo de base de datos. El estándar SQL ofrece las opciones NULLS FIRST / NULLS LAST (nulos al principio/nulos al final) que cambian el ordenamiento de los valores NULL cuando se añaden a ORDER BY.

Desafortunadamente, no todas las bases de datos aceptan este estándar. Profundicemos en ello.

PostgreSQL y Oracle

Como hemos visto, PostgreSQL y Oracle tratan los valores NULL como mayores, y los ponen al final de un ordenamiento ascendente y al principio de un ordenamiento descendente. Sin embargo, puedes cambiar fácilmente este comportamiento añadiendo NULLS FIRST (nulos al principio) o NULLS LAST (nulos al final) a la cláusula ORDER BY.

SELECT *
FROM paintings
ORDER BY year NULLS FIRST;
idpaintingauthoryear
1Mona LisaLeonardo da VinciNULL
5The Birth of VenusSandro BotticelliNULL
4The Night WatchRembrandt1642
2The Starry NightVincent van Gogh1889
3The ScreamEdvard Munch1893

Arriba vemos una tabla ordenada en forma ascendente pero con los valores NULL primero. A continuación, haremos lo contrario: ordenaremos en orden descendente y los NULL irán al final:

SELECT *
FROM paintings
ORDER BY year DESC NULLS LAST;
idpaintingauthoryear
3The ScreamEdvard Munch1893
2The Starry NightVincent van Gogh1889
4The Night WatchRembrandt1642
1Mona LisaLeonardo da VinciNULL
5The Birth of VenusSandro BotticelliNULL

SQLite

A diferencia de PostgreSQL y Oracle, SQLite trata los valores NULL como valores pequeños, y los pone primeros en una ordenación ascendente y últimos en una ordenación descendente. A partir de la versión 3.30.0 de SQLite, este comportamiento puede cambiarse fácilmente utilizando la opción NULLS FIRST / NULLS LAST.

SELECT *
FROM paintings
ORDER BY year NULLS LAST;
idpaintingauthoryear
4The Night WatchRembrandt1642
2The Starry NightVincent van Gogh1889
3The ScreamEdvard Munch1893
1Mona LisaLeonardo da VinciNULL
5The Birth of VenusSandro BotticelliNULL

Arriba, la palabra clave NULLS LAST nos da una ordenación ascendente con los valores NULL en último lugar. Invirtamos esto:

SELECT *
FROM paintings
ORDER BY year DESC NULLS FIRST;
idpaintingauthoryear
1Mona LisaLeonardo da VinciNULL
5The Birth of VenusSandro BotticelliNULL
3The ScreamEdvard Munch1893
2The Starry NightVincent van Gogh1889
4The Night WatchRembrandt1642

Una vez más, la opción NULLS FIRST pone los valores NULL al principio del orden descendente.

MySQL

De forma similar a SQLite, MySQL trata los valores NULL como inferiores a cualquier valor no NULL; por lo tanto, por defecto, pone estos valores en primer lugar cuando se ordena de forma ascendente y en último lugar cuando se ordena de forma descendente. Sin embargo, MySQL no admite las opciones NULLS FIRST / NULLS LAST, lo que hace más difícil cambiar el comportamiento predeterminado.

De todos modos, hay algunos trucos que podemos utilizar para obtener los valores NULL donde queremos:

Usar el operador menos. (Nota: Esto sólo funciona para números o fechas). Para ordenar los valores en orden ascendente con los valores NULL en último lugar, podemos utilizar la siguiente consulta:

SELECT *
FROM paintings
ORDER BY -year DESC;

Aquí, el operador menos antes del nombre de la columna hace que MySQL ordene los valores no NULL en orden inverso. Si añadimos la palabra clave DESC, volvemos al orden ascendente de los valores no NULL. Los valores NULL no se ven afectados por el operador menos, mientras que la palabra clave DESC hace que aparezcan en último lugar al ordenar en orden descendente. Por lo tanto, este truco funciona de la misma manera que la opción NULLS LAST en SQLite.

Para ordenar los valores en orden descendente pero con los valores NULL en primer lugar, podemos utilizar la siguiente consulta en MySQL:

SELECT *
FROM paintings
ORDER BY -year;

La consulta resultará en la salida ordenada por la columna del año en orden descendente. Aquí, los valores NULL aparecen primero, el mismo resultado que obtenemos con la opción NULLS FIRST en SQLite.

Usar el operador IS (NOT) NULL. (Funciona para todos los tipos de datos). Con este truco, podemos confiar en el hecho de que IS NULL devuelve un 1 para todas las expresiones NULL y un 0 en caso contrario. Para hacer que los NULL aparezcan en último lugar al ordenarse de forma ascendente, podemos utilizar la siguiente consulta:

SELECT *
FROM paintings
ORDER BY year IS NULL, year;

De la misma manera, también podemos ordenar la salida en orden descendente y hacer que los valores NULL aparezcan en primer lugar. Esta vez, utilizaremos IS NOT NULL:

SELECT *
FROM paintings
ORDER BY year IS NOT NULL, year DESC;

Los operadores IS NULL e IS NOT NULL pueden ser muy útiles para cambiar el comportamiento predeterminado de MYSQL para ordenar los valores NULL.

Usar la función COALESCE. (Funciona para todos los tipos de datos). Si no estás familiarizado con esta función, lee nuestra guía sobre el manejo de valores NULL con la función COALESCE. Básicamente, podemos ordenar los valores NULL en último lugar al ordenar los valores no NULL en orden ascendente proporcionando el valor más alto posible como sustituto de los valores NULL:

SELECT *
FROM paintings
ORDER BY COALESCE(year, 2021);

En este caso, utilizamos 2021 como valor más alto posible para la columna del año. (Podemos estar seguros de que ninguno de los cuadros que aparecen en nuestra tabla fue hecho en el futuro. Podríamos utilizar cualquier número por encima de 2020 para lograrlo).

Del mismo modo, para ordenar primero los valores NULL y al mismo tiempo ordenar los valores no NULL en orden descendente, podemos utilizar la siguiente consulta:

SELECT * 
FROM paintings
ORDER BY COALESCE(year, 2021) DESC;

El resultado de las dos consultas anteriores será idéntico al de utilizar las opciones NULLS FIRST / NULLS LAST en SQLite.

SQL Server

Al igual que MySQL, SQL Server no admite las opciones NULLS FIRST / NULLS LAST. Sin embargo, los trucos con el operador menos y la función COALESCE funcionan en SQL Server de la misma manera que en MySQL. Puedes usar estas opciones para cambiar el comportamiento predeterminado de SQL Server al ordenar valores NULL.

Es hora de practicar el uso de ORDER BY con valores NULL

Ahora ya sabes que el comportamiento predeterminado de la cláusula ORDER BY al ordenar valores NULL varía según la base de datos que se esté utilizando. En la mayoría de los casos, se puede cambiar fácilmente este comportamiento predeterminado. Utiliza la opción NULLS FIRST / NULLS LAST con SQLite, Postgres y Oracle. Para MySQL y SQL, utiliza los otros trucos que hemos visto.

Para manejar con confianza los valores NULL, consulta estos cursos interactivos de LearnSQL:

¡Feliz aprendizaje!