ORDER BY ordena las filas que devuelve una consulta según una o más columnas o expresiones, en orden ascendente o descendente. Sin él, la base de datos devuelve las filas en el orden que le resulte más rápido. Los ejemplos funcionan en PostgreSQL, MySQL, SQLite y SQL Server.
Cómo usar ORDER BY
Pon ORDER BY al final de la consulta, después de WHERE, GROUP BY y HAVING; solo LIMIT va después. Enumera las columnas por las que quieres ordenar. Cada una se ordena de forma ascendente a menos que agregues DESC:
SELECT columns
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC];
-- Input: customers
-- customer_id | name | signup_date
-- ------------+-------------+------------
-- 1 | Olivia Hart | 2024-03-12
-- 2 | Marcus Lee | 2023-11-05
-- 3 | Zara Ahmed | 2024-01-27
-- 4 | Ben Carter | 2023-08-19
SELECT customer_id, name, signup_date
FROM customers
ORDER BY signup_date;
-- Output:
-- customer_id | name | signup_date
-- ------------+-------------+------------
-- 4 | Ben Carter | 2023-08-19
-- 2 | Marcus Lee | 2023-11-05
-- 3 | Zara Ahmed | 2024-01-27
-- 1 | Olivia Hart | 2024-03-12
SELECT customer_id, name, signup_date
FROM customers
ORDER BY signup_date DESC;
-- Output:
-- customer_id | name | signup_date
-- ------------+-------------+------------
-- 1 | Olivia Hart | 2024-03-12
-- 3 | Zara Ahmed | 2024-01-27
-- 2 | Marcus Lee | 2023-11-05
-- 4 | Ben Carter | 2023-08-19
Reglas que debes conocer
-
DESC solo se aplica a la columna que tiene justo antes.
ORDER BY author, published DESCordena los autores de la A a la Z y luego los libros de cada autor del más reciente al más antiguo:
-- Input: books
-- title | author | published
-- --------------------+-----------------+----------
-- Emma | Jane Austen | 1815
-- Bleak House | Charles Dickens | 1853
-- Pride and Prejudice | Jane Austen | 1813
-- Hard Times | Charles Dickens | 1854
SELECT title, author, published
FROM books
ORDER BY author, published DESC;
-- Output:
-- title | author | published
-- --------------------+-----------------+----------
-- Hard Times | Charles Dickens | 1854
-- Bleak House | Charles Dickens | 1853
-- Emma | Jane Austen | 1815
-- Pride and Prejudice | Jane Austen | 1813
-
Sin ORDER BY, el orden no está garantizado. Las filas suelen regresar en el orden en que se insertaron, hasta que la tabla crece, cambia un índice o la consulta se ejecuta en paralelo. Lo mismo pasa con
LIMIT: sin ORDER BY devuelve las filas que la base de datos lea primero. - Las filas empatadas regresan en cualquier orden. Agrega una columna única, como el ID, como última columna de ordenamiento para que el orden sea el mismo en cada ejecución:
-- Input: customers
-- customer_id | name | signup_date
-- ------------+------------+------------
-- 3 | Mara Lind | 2024-01-15
-- 1 | Owen Price | 2024-01-10
-- 4 | Tariq Aziz | 2024-01-15
-- 2 | Lily Shore | 2024-01-15
-- The three 2024-01-15 rows can come back in any order
SELECT * FROM customers ORDER BY signup_date;
-- Output:
-- customer_id | name | signup_date
-- ------------+------------+------------
-- 1 | Owen Price | 2024-01-10
-- 3 | Mara Lind | 2024-01-15
-- 4 | Tariq Aziz | 2024-01-15
-- 2 | Lily Shore | 2024-01-15
-- customer_id breaks the tie
SELECT * FROM customers ORDER BY signup_date, customer_id;
-- Output:
-- customer_id | name | signup_date
-- ------------+------------+------------
-- 1 | Owen Price | 2024-01-10
-- 2 | Lily Shore | 2024-01-15
-- 3 | Mara Lind | 2024-01-15
-- 4 | Tariq Aziz | 2024-01-15
- Los NULL van primero, excepto en PostgreSQL, que los pone al final. Eso aplica al orden ascendente; DESC lo invierte:
-- Input: users
-- name | middle_name
-- -----------+------------
-- John Smith | Robert
-- Ana Lopez | NULL
-- Kim Young | Elise
SELECT name, middle_name
FROM users
ORDER BY middle_name;
-- Output:
-- name | middle_name
-- -----------+------------
-- Ana Lopez | NULL
-- Kim Young | Elise
-- John Smith | Robert
-- (PostgreSQL puts Ana Lopez last instead)
Para elegir dónde van los NULL, consulta NULLS FIRST y NULLS LAST más abajo.
Sintaxis alternativa
Puedes ordenar por el alias de una columna o por su posición en la lista del SELECT. Un alias te ahorra repetir una expresión. Una posición es más corta, pero falla sin avisar cuando alguien edita la lista del SELECT:
-- Input: employees
-- name | monthly_salary
-- ---------+---------------
-- Ivy Chen | 5200
-- Max Dunn | 7600
-- Pia Roth | 4500
SELECT name, monthly_salary * 12 AS annual_salary
FROM employees
ORDER BY annual_salary DESC; -- or ORDER BY 2 DESC
-- Output:
-- name | annual_salary
-- ---------+--------------
-- Max Dunn | 91200
-- Ivy Chen | 62400
-- Pia Roth | 54000
NULLS FIRST y NULLS LAST después de una columna de ordenamiento indican dónde van sus NULL:
-- Input: the users table above
SELECT name, middle_name
FROM users
ORDER BY middle_name NULLS LAST;
-- MySQL and SQL Server don't support NULLS LAST. Sort on a CASE first instead:
-- ORDER BY CASE WHEN middle_name IS NULL THEN 1 ELSE 0 END, middle_name
-- Output:
-- name | middle_name
-- -----------+------------
-- Kim Young | Elise
-- John Smith | Robert
-- Ana Lopez | NULL
MySQL tiene FIELD(), que ordena los valores en el orden en que los enumeras. En otras bases de datos, usa una expresión CASE como la de Ordenar tareas por prioridad más abajo:
-- Input: products
-- product_name | category
-- -------------+------------
-- Cookbook | Books
-- Raincoat | Clothing
-- Tablet | Electronics
-- Scarf | Clothing
-- MySQL
SELECT * FROM products
ORDER BY FIELD(category, 'Electronics', 'Clothing', 'Books');
-- Output:
-- product_name | category
-- -------------+------------
-- Tablet | Electronics
-- Raincoat | Clothing
-- Scarf | Clothing
-- Cookbook | Books
¿Cuándo deberías usar ORDER BY?
Usa ORDER BY siempre que el orden de las filas importe para quien las lee. La mayoría de los usos entran en uno de estos cuatro casos.
Mostrar una lista en un orden predecible
Nombres de la A a la Z, fechas de la más antigua a la más reciente, IDs en secuencia. Sin ORDER BY, la misma consulta puede devolver sus filas en otro orden de una ejecución a otra, y las páginas de resultados pueden repetir o saltarse filas.
Encontrar los valores más altos o más recientes
Ordena de forma descendente para poner primero las filas más grandes, nuevas o caras, y luego agrega LIMIT para quedarte solo con las primeras: los más vendidos, los pedidos más recientes, las puntuaciones más altas.
Ordenar por más de una columna
Cuando la primera columna de ordenamiento tiene empates, la siguiente decide el orden entre ellos: departamento y luego salario, grado y luego calificación, estado y luego fecha. Cada columna puede tener su propia dirección.
Ordenar por un valor calculado o un orden personalizado
ORDER BY acepta cualquier expresión, no solo columnas: un total calculado a partir de dos columnas, la longitud de un nombre o una expresión CASE que pone valores como High, Medium y Low en un orden que el alfabeto no te daría.
Ejemplos reales de ORDER BY
Paginar una lista de clientes
ORDER BY con LIMIT y OFFSET devuelve una página a la vez. Tres clientes se registraron el mismo día, así que customer_id desempata. Sin él, la base de datos podría poner al mismo cliente en ambas páginas y saltarse otro:
-- Input: customers
-- customer_id | name | signup_date
-- ------------+-------------+------------
-- 1 | Nina Brandt | 2024-02-14
-- 2 | Theo Walsh | 2023-09-30
-- 3 | Iris Novak | 2024-02-14
-- 4 | Felix Moore | 2024-02-14
-- 5 | June Park | 2024-03-22
-- Page 1
SELECT customer_id, name, signup_date
FROM customers
ORDER BY signup_date, customer_id
LIMIT 2 OFFSET 0;
-- Output:
-- customer_id | name | signup_date
-- ------------+-------------+------------
-- 2 | Theo Walsh | 2023-09-30
-- 1 | Nina Brandt | 2024-02-14
-- Page 2
SELECT customer_id, name, signup_date
FROM customers
ORDER BY signup_date, customer_id
LIMIT 2 OFFSET 2;
-- SQL Server has no LIMIT: use OFFSET 2 ROWS FETCH NEXT 2 ROWS ONLY
-- Output:
-- customer_id | name | signup_date
-- ------------+-------------+------------
-- 3 | Iris Novak | 2024-02-14
-- 4 | Felix Moore | 2024-02-14
Mostrar los tres primeros de una tabla de posiciones
Ordena las puntuaciones de la más alta a la más baja y quédate con las tres primeras:
-- Input: players
-- username | score
-- ----------+------
-- quokka42 | 1870
-- nightowl | 2310
-- pixelpete | 1525
-- zara_k | 2045
-- bytebard | 1990
SELECT username, score
FROM players
ORDER BY score DESC
LIMIT 3;
-- SQL Server has no LIMIT: write SELECT TOP 3 username, score instead
-- Output:
-- username | score
-- ---------+------
-- nightowl | 2310
-- zara_k | 2045
-- bytebard | 1990
Crear un reporte de pedidos por estado, valor y fecha
Los estados se ordenan alfabéticamente. Dentro de cada estado, los pedidos más grandes van primero, y los pedidos del mismo valor muestran primero los más recientes:
-- Input: orders
-- order_id | status | order_value | order_date
-- ---------+------------+-------------+-----------
-- 1001 | Shipped | 120.00 | 2024-03-02
-- 1002 | Delivered | 75.50 | 2024-02-20
-- 1003 | Shipped | 120.00 | 2024-03-05
-- 1004 | Processing | 42.00 | 2024-03-06
-- 1005 | Delivered | 210.00 | 2024-02-28
SELECT order_id, status, order_value, order_date
FROM orders
ORDER BY status ASC, order_value DESC, order_date DESC;
-- Output:
-- order_id | status | order_value | order_date
-- ---------+------------+-------------+-----------
-- 1005 | Delivered | 210.00 | 2024-02-28
-- 1002 | Delivered | 75.50 | 2024-02-20
-- 1004 | Processing | 42.00 | 2024-03-06
-- 1003 | Shipped | 120.00 | 2024-03-05
-- 1001 | Shipped | 120.00 | 2024-03-02
Ordenar tareas por prioridad
El orden alfabético daría High, Low, Medium. Una expresión CASE convierte cada prioridad en un número para ordenar. Cualquier otro valor, aquí un NULL, recibe 4 y va al final, y la fecha de vencimiento ordena las tareas dentro de cada prioridad:
-- Input: tasks
-- task_name | priority | due_date
-- ---------------+----------+-----------
-- Update docs | Low | 2024-06-03
-- Fix login bug | High | 2024-06-10
-- Plan offsite | NULL | 2024-05-20
-- Renew SSL cert | High | 2024-06-01
-- Review PR | Medium | 2024-06-04
SELECT task_name, priority, due_date
FROM tasks
ORDER BY
CASE priority
WHEN 'High' THEN 1
WHEN 'Medium' THEN 2
WHEN 'Low' THEN 3
ELSE 4
END,
due_date;
-- Output:
-- task_name | priority | due_date
-- ---------------+----------+-----------
-- Renew SSL cert | High | 2024-06-01
-- Fix login bug | High | 2024-06-10
-- Review PR | Medium | 2024-06-04
-- Update docs | Low | 2024-06-03
-- Plan offsite | NULL | 2024-05-20
Más lecturas sobre ORDER BY
En este blog:
- Guía de SQL GROUP BY: cómo ordenar resultados agrupados, como las categorías con más ingresos
- Guía de la sentencia CASE en SQL: expresiones CASE para órdenes personalizados
- Limitar filas en PostgreSQL, MySQL, SQLite y SQL Server: LIMIT, OFFSET y TOP
- Seleccionar las primeras N filas en MySQL: ORDER BY con LIMIT en MySQL
-
Guía para encontrar duplicados en SQL: ORDER BY dentro de
ROW_NUMBER()decide qué copia cuenta como la original
Documentación oficial:
- PostgreSQL: Ordenar filas (ORDER BY)
- MySQL: Ordenar filas
- SQLite: SELECT, la cláusula ORDER BY
- SQL Server: cláusula ORDER BY
Beekeeper Studio es un cliente de bases de datos gratuito y de código abierto
La mejor herramienta de consultas y edición de SQL que he usado. Tiene todo lo que necesito para administrar mi base de datos. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio es rápido, intuitivo y fácil de usar. Es compatible con muchísimas bases de datos y funciona de maravilla en Windows, Mac y Linux.
Lo que dicen los usuarios de Beekeeper Studio
"Beekeeper Studio reemplazó por completo mi antiguo flujo de trabajo con SQL. Es rápido, intuitivo y hace que trabajar con bases de datos vuelva a ser agradable."
"He probado muchas GUI de bases de datos, pero Beekeeper logra el equilibrio perfecto entre funciones y simplicidad. Simplemente funciona."