Sin ORDER BY, el orden de las filas es impredecible
Un SELECT sin ORDER BY devuelve las filas en el orden que a SQLite le resulte más cómodo. Muchas veces parece que respeta el orden de inserción en tablas pequeñas, y eso hace que la gente se confíe. No lo hagas. En cuanto entra en juego un índice, la tabla crece o cambia el plan de ejecución, ese orden puede alterarse sin previo aviso.
Si te importa el orden de los resultados, déjalo claro de forma explícita:
ORDER BY name ordena de forma ascendente por defecto. El resultado llega como Ada, Boris, Chen, Rosa — siempre en orden alfabético, sin importar cómo esté guardada la tabla en disco.
ASC y DESC: ordenar resultados en SQLite
ASC significa ascendente (de menor a mayor, de la A a la Z, de lo más antiguo a lo más reciente). DESC es descendente, justo al revés. Como ASC es el valor por defecto, lo habitual es omitirlo:
Así obtienes los registros más recientes primero. Las fechas guardadas como cadenas ISO 8601 (YYYY-MM-DD) se ordenan correctamente como texto, y esa es una de las razones por las que se prefiere este formato para columnas de fecha en SQLite, que no tiene un tipo específico para fechas.
Order by varias columnas en SQLite
Cuando hay empates en la primera columna de ordenamiento, SQLite usa la segunda columna para desempatar. Basta con listar las columnas separadas por comas, en orden de prioridad:
Las filas se agrupan primero por país (FR antes que US) y, dentro de cada país, se ordenan por nombre. Cada columna puede llevar su propia dirección:
Por país en orden ascendente y, dentro de cada país, primero los más recientes. Ojo: ASC y DESC solo afectan a la columna que tienen al lado, no se arrastran a las siguientes.
Ordenar por expresiones y alias en SQLite
ORDER BY admite cualquier expresión, no solo nombres de columna. Esto resulta muy práctico cuando trabajas con valores calculados:
El alias revenue que definiste en el SELECT se puede usar sin problema dentro del ORDER BY. También puedes repetir la expresión completa —ORDER BY price * quantity DESC— y el resultado es exactamente el mismo.
Otra opción es ordenar por la posición de la columna, aunque es una costumbre que conviene evitar:
SELECT name, price FROM products ORDER BY 2 DESC;
2 se refiere a la segunda columna del SELECT. Funciona, sí, pero el día que alguien reordene las columnas, el orden cambia de significado sin que nadie se entere. Mejor ordena por el nombre de la columna o por su alias.
Dónde caen los NULL al ordenar
NULL significa "valor desconocido", y SQLite tiene que decidir en qué posición colocar esos valores desconocidos al ordenar. La regla por defecto es esta: los NULL aparecen primero con ASC y al final con DESC.
Ada y Chen aparecen al principio, antes que cualquier fecha real. Eso casi nunca es lo que buscas cuando quieres ordenar de más reciente a más antiguo. Para cambiarlo, usa NULLS LAST:
Ahora las fechas reales aparecen primero y los NULL se van al final. Con NULLS FIRST ocurre justo lo contrario. Ambas opciones forman parte del estándar SQL y funcionan en SQLite 3.30 en adelante.
Ordenar sin distinguir mayúsculas con COLLATE NOCASE
Por defecto, SQLite compara texto de forma binaria, es decir, ordena según los puntos de código Unicode. Esto hace que las mayúsculas queden antes que las minúsculas, así que 'Zoe' sale antes que 'manzana':
El resultado es Boris, Zoe, ada, manzana: primero las mayúsculas y después las minúsculas. Si quieres ordenar sin distinguir mayúsculas y minúsculas, añade la colación NOCASE:
Ahora obtienes ada, apple, Boris, Zoe (code uses 'apple' here, consistent). Ten en cuenta que NOCASE solo trata como equivalentes las letras ASCII A–Z y a–z; no normaliza acentos ni caracteres fuera de ASCII. Si necesitas una ordenación realmente internacionalizada, tendrás que recurrir a una collation a nivel de aplicación, pero para texto en inglés NOCASE cumple de sobra.
Ordenar de forma aleatoria con ORDER BY RANDOM
A veces te interesa devolver las filas en orden aleatorio: elegir el destacado del día, tomar una muestra para hacer pruebas, etc. SQLite ofrece la función random(), que devuelve un entero aleatorio, y basta con ordenar por ella:
Cada fila recibe un valor aleatorio nuevo y la ordenación las baraja. Funciona bien con tablas pequeñas. En tablas grandes, ORDER BY random() es lento: tiene que calcular un valor aleatorio para cada fila y ordenar todo el resultado. Si lo que quieres es tomar una sola fila al azar de una tabla enorme, hay enfoques más eficientes (por ejemplo, elegir un rowid aleatorio).
Errores comunes al ordenar resultados en SQLite
Hay un par de tropiezos típicos:
- Olvidar
ORDER BYy dar por hecho un orden. Sin esa cláusula, el orden es indefinido. Aunque parezca estable, no lo es. - Ordenar números guardados como texto.
'10'va antes que'2'en orden lexicográfico. Si una columna debe ordenarse numéricamente, guárdala con afinidad numérica (o haz un cast:ORDER BY CAST(value AS INTEGER)). - Mezclar ASC y DESC entre columnas. Cada columna lleva su propia dirección.
ORDER BY a, b DESCordenaaascendente ybdescendente, no ambas descendentes. - Ordenar un resultado enorme solo para quedarte con las primeras filas. Combina
ORDER BYconLIMITy crea un índice sobre la columna de ordenación: justo el tema que viene a continuación.
A continuación: LIMIT y OFFSET
ORDER BY le dice a SQLite cómo colocar las filas; LIMIT y OFFSET le dicen cuántas devolver y desde dónde empezar. Juntos forman la base de la paginación y de las consultas tipo "top N", y los veremos a continuación.
Preguntas frecuentes
¿Cómo se ordenan los resultados en SQLite?
Añade una cláusula ORDER BY al final del SELECT indicando la columna por la que quieres ordenar. Por ejemplo, SELECT * FROM users ORDER BY name; ordena de forma ascendente. Si quieres descendente, añade DESC: ORDER BY name DESC. Sin ORDER BY el orden de las filas no está garantizado, así que aunque parezca consistente nunca te fíes de él.
¿Cómo ordeno por varias columnas en SQLite?
Lístalas separadas por comas: ORDER BY country, name. SQLite ordena primero por la primera columna y usa la segunda solo para desempatar. Cada columna puede tener su propia dirección: ORDER BY country ASC, signup_date DESC.
¿Cómo hago una ordenación que ignore mayúsculas y minúsculas?
Usa COLLATE NOCASE dentro del ORDER BY: ORDER BY name COLLATE NOCASE. Por defecto SQLite ordena el texto con collation binaria, así que Zoe aparecería antes que apple. Con NOCASE mayúsculas y minúsculas se tratan como iguales a la hora de ordenar.
¿Dónde aparecen los NULL en un resultado ordenado de SQLite?
Por defecto, los NULL salen primero en orden ascendente y al final en orden descendente. Puedes cambiarlo con NULLS FIRST o NULLS LAST: por ejemplo, ORDER BY signup_date DESC NULLS LAST deja arriba las fechas reales y manda los valores ausentes al fondo.