Fundamentos de ORDER BY: Cómo ordenar datos libremente con SQL
Listas de productos en sitios web, índices de artículos de blog, clasificaciones de usuarios… Gran parte del contenido web que vemos a diario está ordenado de alguna forma. Esta ordenación de datos se realiza mediante la cláusula ORDER BY de SQL.
Este artículo está dirigido a creadores web que están comenzando a aprender SQL o que desean repasar los conceptos básicos. Explicaremos en detalle cómo usar ORDER BY. Bajo el tema “¡Simplemente copia y funciona!”, hemos preparado muchos ejemplos de código. ¡Pruébalos y disfruta manipulando datos libremente!
¡Empecemos! Primero prepara los datos de ejemplo
¡La práctica hace al maestro! Vamos a escribir SQL de inmediato. En este artículo utilizaremos como ejemplo una tienda en línea ficticia llamada “Web Creator's Mart” y su tabla de productos (products).
Las siguientes sentencias SQL crean esta tabla e insertan los datos de ejemplo. El resto del código asume que esta tabla ya existe, así que si deseas probarlo en tu propio entorno, asegúrate de ejecutar primero este SQL.
-- Crear la tabla de productos
CREATE TABLE products (
id INT,
name VARCHAR(255),
category VARCHAR(255),
price INT,
release_date DATE
);
-- Insertar datos de ejemplo
INSERT INTO products (id, name, category, price, release_date) VALUES
(1, 'Cojín Suave', 'Interior', 3200, '2023-04-15'),
(2, 'Orejeras de Concentración', 'Gadget', 7800, '2023-11-01'),
(3, 'Cuaderno Inspirador', 'Papelería', 1200, '2022-08-20'),
(4, 'Teclado Iluminado', 'Gadget', 15000, '2023-06-30'),
(5, 'Silla Súper Cómoda', 'Interior', 32000, '2022-11-10'),
(6, 'Bolígrafo Suave', 'Papelería', 1200, '2023-09-01'),
(7, 'Taza del Creador', 'Vajilla', 2500, '2023-04-15');
Esta tabla contiene las columnas ID del producto (id), nombre del producto (name), categoría (category), precio (price) y fecha de lanzamiento (release_date). ¿Listo? ¡Vamos a usar ORDER BY!
Fundamentos de ORDER BY: Orden ascendente paso a paso
El uso más básico de ORDER BY es ordenar según una columna específica en orden ascendente (de menor a mayor, de más antiguo a más reciente). Por ejemplo, cuando quieres mostrar una lista de productos ordenada por precio más bajo.
La sintaxis es muy simple: solo tienes que añadir ORDER BY nombre_columna al final de la sentencia SELECT.
SELECT * FROM products ORDER BY price;
Al ejecutar esta consulta SQL, los datos se ordenarán por la columna price en orden ascendente (del valor más bajo al más alto). Por cierto, se puede especificar el orden ascendente usando la palabra clave ASC (abreviatura de Ascendente), pero como ORDER BY por defecto ya ordena en ascendente, normalmente se omite ASC.
-- Da el mismo resultado que el código anterior
SELECT * FROM products ORDER BY price ASC;
¡Orden inverso es fácil! Ordenar en descendente con DESC
A veces, como en "ordenar por precio de mayor a menor" o "mostrar los productos más nuevos primero", se quiere ordenar en orden descendente (de mayor a menor, de más reciente a más antiguo). En ese caso, se usa la palabra clave DESC (abreviatura de Descendente).
Simplemente añade DESC después del nombre de la columna. ¡Así de fácil!
-- Ordenar por precio de mayor a menor
SELECT * FROM products ORDER BY price DESC;
Con esto, el producto más caro, “Silla Súper Cómoda”, debería aparecer primero. También puedes ordenar por la fecha de lanzamiento (release_date) del más reciente al más antiguo.
-- Ordenar por fecha de lanzamiento del más reciente al más antiguo
SELECT * FROM products ORDER BY release_date DESC;
ASC es opcional, pero si deseas orden descendente, debes especificar DESC. ¡No lo olvides!
Ejemplo avanzado ①: Ordenar por múltiples condiciones
Una de las ventajas de ORDER BY es que puedes ordenar por varias condiciones. Por ejemplo, ordenar por categoría y dentro de cada categoría, ordenar por precio ascendente.
Para eso, simplemente especifica múltiples columnas separadas por comas (,) en la cláusula ORDER BY. La columna que escribas primero será la clave principal de ordenación.
-- Ordenar por categoría (ascendente) y luego por precio (ascendente)
SELECT * FROM products ORDER BY category, price;
Esta consulta ordenará primero por category alfabéticamente (por ejemplo, Gadget → Interior → Papelería...), y luego dentro de la categoría "Papelería", por price en orden ascendente.
También puedes especificar el orden (ascendente o descendente) para cada columna. Un caso común en sitios de comercio electrónico es ordenar por la fecha de lanzamiento más reciente, y dentro de la misma fecha, mostrar los productos de mayor precio primero.
-- Ordenar por fecha de lanzamiento (descendente), luego por precio (descendente)
SELECT * FROM products ORDER BY release_date DESC, price DESC;
En los datos de ejemplo, “Cojín Suave” y “Taza del Creador” tienen la misma fecha de lanzamiento (2023-04-15). Al ejecutar esta consulta, se mostrará primero el producto más caro, "Cojín Suave". Dominar el orden por múltiples condiciones amplía mucho las posibilidades de visualización de datos.
💻 ¡Pruébalo tú mismo! Ejecuta SQL en tu navegador
Hemos visto varios ejemplos de SQL hasta ahora, pero la mejor manera de aprender es probándolo.
Por eso, hemos preparado un archivo HTML especial que te permite ejecutar SQL directamente en tu navegador, sin necesidad de ninguna configuración adicional.
Copia todo el código a continuación en un archivo llamado por ejemplo index.html y ábrelo en tu navegador. Obtendrás un entorno de práctica de SQL totalmente funcional. ¡Prueba diferentes patrones de ORDER BY que aprendiste en este artículo!
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Práctica de SQL con ORDER BY</title>
<style>
body { font-family: sans-serif; line-height: 1.6; color: #333; max-width: 800px; margin: 2rem auto; padding: 0 1rem; }
h1, h2 { color: #444; }
textarea { width: 100%; height: 150px; font-family: monospace; font-size: 16px; padding: 10px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; }
button { background-color: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
button:hover { background-color: #0056b3; }
#result-container { margin-top: 1.5rem; }
table { width: 100%; border-collapse: collapse; margin-top: 1rem; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
#error-message { color: red; font-weight: bold; }
</style>
</head>
<body>
<h1>¡Aprende SQL ejecutándolo! Entorno de práctica de ORDER BY</h1>
<p>Escribe tu sentencia SQL en el área de texto de abajo y haz clic en "Ejecutar SQL". La consulta se ejecutará sobre la tabla <code>products</code>.</p>
<textarea id="sql-input">-- ¡Escribe aquí tu consulta SQL! ¡Pruébalo!
SELECT * FROM products ORDER BY price DESC;</textarea>
<button onclick="executeQuery()">Ejecutar SQL</button>
<h2>Resultados</h2>
<div id="result-container"></div>
<div id="error-message"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/sql-wasm.js"></script>
<script>
let db;
async function initDb() {
const SQL = await initSqlJs({
locateFile: file => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/${file}`
});
db = new SQL.Database();
// Crear tabla e insertar datos
const createTableSQL = `
CREATE TABLE products (
id INT,
name VARCHAR(255),
category VARCHAR(255),
price INT,
release_date DATE
);
INSERT INTO products (id, name, category, price, release_date) VALUES
(1, 'Cojín Suave', 'Interior', 3200, '2023-04-15'),
(2, 'Orejeras de Concentración', 'Gadget', 7800, '2023-11-01'),
(3, 'Cuaderno Inspirador', 'Papelería', 1200, '2022-08-20'),
(4, 'Teclado Iluminado', 'Gadget', 15000, '2023-06-30'),
(5, 'Silla Súper Cómoda', 'Interior', 32000, '2022-11-10'),
(6, 'Bolígrafo Suave', 'Papelería', 1200, '2023-09-01'),
(7, 'Taza del Creador', 'Vajilla', 2500, '2023-04-15');
`;
db.run(createTableSQL);
// Ejecutar consulta inicial
executeQuery();
}
function executeQuery() {
const sqlInput = document.getElementById('sql-input').value;
const resultContainer = document.getElementById('result-container');
const errorMessage = document.getElementById('error-message');
resultContainer.innerHTML = '';
errorMessage.innerHTML = '';
try {
const results = db.exec(sqlInput);
if (results.length > 0) {
resultContainer.appendChild(createTable(results[0]));
} else {
resultContainer.innerHTML = '<p>Consulta ejecutada correctamente, pero no se devolvieron resultados (por ejemplo: CREATE TABLE, INSERT).</p>';
}
} catch (e) {
errorMessage.textContent = 'Error: ' + e.message;
}
}
function createTable(result) {
const table = document.createElement('table');
const thead = document.createElement('thead');
const tbody = document.createElement('tbody');
const headerRow = document.createElement('tr');
result.columns.forEach(colName => {
const th = document.createElement('th');
th.textContent = colName;
headerRow.appendChild(th);
});
thead.appendChild(headerRow);
result.values.forEach(rowData => {
const tr = document.createElement('tr');
rowData.forEach(cellData => {
const td = document.createElement('td');
td.textContent = cellData;
tr.appendChild(td);
});
tbody.appendChild(tr);
});
table.appendChild(thead);
table.appendChild(tbody);
return table;
}
initDb();
</script>
</body>
</html>
¡Consejos útiles! Puntos a tener en cuenta al usar ORDER BY
Para finalizar, te presentamos algunos puntos a tener en cuenta al utilizar ORDER BY, así como algunas técnicas útiles.
Manejo de valores NULL
Cuando los datos contienen valores NULL (es decir, sin valor), ¿cómo los trata ORDER BY? El comportamiento puede variar ligeramente según el sistema de base de datos, pero generalmente los NULL se agrupan al principio (NULLS FIRST) o al final (NULLS LAST) del conjunto de resultados. Dado que esto puede afectar el orden de manera inesperada, se recomienda hacer pruebas cuando se ordenen columnas que puedan contener NULL.
Sobre el rendimiento
Si ordenas millones de registros con ORDER BY, la carga sobre la base de datos puede aumentar significativamente y las consultas pueden tardar más en ejecutarse. Esto es especialmente notorio si se ordena por columnas que no tienen índices. Si sueles ordenar por ciertas columnas con frecuencia, considera crear índices en la base de datos. Esta técnica, un poco más avanzada, puede mejorar drásticamente la velocidad de respuesta.
Es posible ordenar por columnas que no están en el SELECT
Puede parecer extraño, pero con ORDER BY puedes ordenar por una columna que no esté incluida en la cláusula SELECT. Por ejemplo, puedes querer mostrar solo el nombre del producto y su precio, pero ordenarlos por la fecha de lanzamiento más reciente.
-- Se muestran solo name y price, pero se ordena por release_date
SELECT name, price FROM products ORDER BY release_date DESC;
Esta capacidad de separar la visualización de los datos del criterio de ordenación es una de las grandes fortalezas de SQL.
Resumen: ¡Domina ORDER BY y da el siguiente paso en el manejo de datos!
En este artículo explicamos cómo usar la cláusula ORDER BY en SQL: desde los conceptos básicos hasta la ordenación por múltiples columnas y algunas consideraciones avanzadas. Aquí un repaso de los puntos clave:
- Usa la cláusula
ORDER BYpara ordenar los resultados. - El orden ascendente (menor a mayor) es el predeterminado, por lo que
ASCse puede omitir. - Para ordenar en orden descendente, asegúrate de añadir
DESCdespués del nombre de la columna. - Puedes ordenar por múltiples columnas separadas por comas; el orden determina la prioridad.
ORDER BY es una habilidad esencial para presentar resultados de base de datos de forma clara y comprensible. Aprovecha el código de ejemplo y el entorno interactivo que te proporcionamos en este artículo para probar diferentes métodos de ordenación. ¡Una vez que lo domines, el desarrollo web y el análisis de datos serán mucho más divertidos!