SQL ORDER BY: ordenar los resultados de una consulta
Lección 2.6 · Tiempo de lectura: ~6 min · Tareas de práctica ↓
La cláusula SQL ORDER BY ordena las filas del resultado de una consulta por una o varias columnas o expresiones. En esta lección aprenderás el orden ascendente y descendente, a ordenar por varias columnas, por expresiones y por alias, y cómo se ordenan los valores NULL.
Una tabla no tiene un orden de filas incorporado. Sin ORDER BY, la base de datos devuelve las filas en el orden que le resulta más cómodo, y ese orden puede cambiar de una ejecución a otra. Cuando el orden importa -en un informe, un ranking o un registro cronológico-, hay que pedirlo de forma explícita.
La cláusula ORDER BY
ORDER BY se escribe al final de una sentencia SELECT y enumera las claves de ordenamiento.
Sintaxis básica
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
ASCordena de forma ascendente: de menor a mayor, de la A a la Z, de la fecha más antigua a la más reciente. Es el orden predeterminado.DESCordena de forma descendente.
Ordenar por una columna
SELECT first_name, last_name
FROM actor
ORDER BY last_name;
Resultado: todos los actores en orden alfabético por apellido.
Para invertir el orden, agrega DESC:
SELECT title, length
FROM film
ORDER BY length DESC;
Resultado: las películas de la más larga a la más corta.
Ordenar por varias columnas
Cuando la primera clave de ordenamiento tiene valores iguales, la base de datos usa la segunda clave para ordenar esas filas, luego la tercera, y así sucesivamente:
SELECT first_name, last_name
FROM actor
ORDER BY last_name, first_name;
Resultado: actores ordenados por apellido; los que tienen el mismo apellido se ordenan por nombre.
Cada columna tiene su propia dirección. ASC o DESC se aplica solo a la columna a la que sigue:
SELECT title, rating, length
FROM film
ORDER BY rating, length DESC;
Resultado: películas agrupadas por clasificación; dentro de cada clasificación, primero las más largas.
Ordenar por expresiones
Puedes ordenar por un valor calculado, no solo por una columna almacenada. La expresión se evalúa para cada fila y las filas se ordenan según el resultado:
SELECT title, rental_rate, rental_duration
FROM film
ORDER BY rental_rate * rental_duration DESC;
Resultado: películas ordenadas por el costo de un alquiler completo, las más caras primero.
Una comparación también puede ser una clave de ordenamiento. Es útil para poner ciertas filas arriba:
SELECT title, rating
FROM film
ORDER BY rating = 'G' DESC, title;
Resultado: las películas con clasificación G arriba y luego todas las demás; cada grupo ordenado por título.
En MySQL y MariaDB, una comparación devuelve 1 o 0, por lo que DESC pone primero las filas que coinciden. No todas las bases de datos pueden ordenar por una comparación; la forma portable usa CASE, que aprenderás en la lección 3.5.
Ordenar por alias y por posición de columna
ORDER BY se procesa después de SELECT, así que puede usar los alias de columna definidos allí:
SELECT title, rental_rate * rental_duration AS full_rental_cost
FROM film
ORDER BY full_rental_cost DESC;
También puedes ordenar por la posición de una columna en la lista del SELECT:
SELECT first_name, last_name
FROM actor
ORDER BY 2, 1;
Resultado: actores ordenados por la segunda columna (last_name) y luego por la primera (first_name).
Ordenar por posición es práctico en consultas rápidas, pero deja de funcionar sin avisar cuando alguien cambia la lista de columnas. En consultas que se guardan, usa nombres o alias.
Ordenamiento y valores NULL
NULL significa "sin valor", así que la base de datos tiene que decidir dónde poner esas filas. En MySQL, MariaDB y SQL Server, los valores NULL van primero en orden ascendente y al final en orden descendente. En PostgreSQL y Oracle es al revés.
SELECT rental_id, rental_date, return_date
FROM rental
ORDER BY return_date
LIMIT 10;
Resultado: en MySQL aparecen primero los alquileres que todavía no se devolvieron (return_date es NULL).
Conclusiones clave:
- Sin
ORDER BY, el orden de las filas de un resultado no está garantizado. ASC(el predeterminado) ordena de forma ascendente yDESCde forma descendente.- Con varias claves de ordenamiento, cada clave siguiente ordena las filas que son iguales en la anterior.
ASCyDESCse aplican a cada columna por separado.- Puedes ordenar por expresiones, alias y posiciones de columna; los nombres y alias son más fiables que las posiciones.
- Dónde aparecen los valores
NULLdepende de la base de datos.
Preguntas frecuentes
¿Cuál es el orden predeterminado en SQL?
Ascendente (ASC). ORDER BY last_name y ORDER BY last_name ASC devuelven el mismo resultado.
¿Cómo ordeno por varias columnas en direcciones distintas?
Escribe la dirección después de cada columna: ORDER BY rating ASC, length DESC. Una dirección se aplica solo a la columna a la que sigue.
¿Puedo usar un alias de columna en ORDER BY?
Sí. ORDER BY se procesa después de SELECT, así que los alias definidos en la lista del SELECT están disponibles allí. Es distinto de WHERE, donde no se pueden usar alias.