ORDER BY con varias claves, NULLS LAST y LIMIT
BásicoORDER BY ordena por una o varias claves: la segunda solo decide cuando la primera empata. ASC es ascendente (el valor por defecto) y DESC descendente. NULLS FIRST y NULLS LAST indican dónde van los NULL. LIMIT n devuelve solo las primeras n filas después de ordenar.
Sintaxis
SELECT ...
FROM tabla
ORDER BY clave_1, clave_2 DESC NULLS LAST, id
LIMIT 10;Ejemplo
SELECT
s.country,
s.store_name,
s.rating
FROM sellers AS s
WHERE s.country IN ('UY', 'PE')
ORDER BY s.country DESC, s.rating DESC NULLS LAST, s.id
LIMIT 8;Resultado
| country | store_name | rating |
|---|---|---|
| UY | Estudio Sur 178 | 4.86 |
| UY | Estudio Express 42 | 4.82 |
| UY | Nube Norte 30 | 3.81 |
| UY | Estudio Vintage 151 | 3.62 |
| UY | Bazar Urbano 177 | NULL |
| PE | Rincón Artesanal 43 | 4.83 |
| PE | Punto Pampa 164 | 4.82 |
| PE | Bazar Sur 93 | 4.75 |
Cómo leerlo
Primero se ordena por país (UY antes que PE por el DESC); dentro de cada país, por calificación de mayor a menor. El vendedor uruguayo sin calificación queda al final de su país gracias a NULLS LAST. s.id es el desempate final: sin una clave única, dos filas empatadas pueden salir en distinto orden en cada ejecución. LIMIT 8 corta después de ordenar, por eso de Perú solo entran tres.
Error común
Así no
SELECT s.store_name, s.rating
FROM sellers AS s
ORDER BY s.rating DESC
LIMIT 5;Pedir «los mejor calificados» con DESC sin NULLS LAST. En PostgreSQL NULL se ordena como el valor más grande, así que con DESC los vendedores sin calificación aparecen primero: este top 5 son cinco vendedores con calificación NULL. Agrega NULLS LAST o filtra rating IS NOT NULL.
En otros motores: SQL Server, PostgreSQL, Oracle, Snowflake, MySQL
SQL Server
No tiene
LIMIT: usaTOP (n)después deSELECT, oOFFSET 0 ROWS FETCH NEXT 5 ROWS ONLYal final delORDER BY.SELECT TOP (5) store_name, rating FROM sellers ORDER BY rating DESC;PostgreSQLOracleSnowflake
FETCH FIRST n ROWS ONLYes la forma del estándar SQL. Oracle la acepta desde la versión 12c; PostgreSQL y Snowflake aceptan tambiénLIMIT.SELECT store_name, rating FROM sellers ORDER BY rating DESC NULLS LAST FETCH FIRST 5 ROWS ONLY;MySQLSQL Server
Tratan
NULLcomo el valor más pequeño (van primero en orden ascendente) y no aceptanNULLS FIRST/NULLS LAST. Para mandarlos al final se ordena primero por una expresión que los marque.ORDER BY CASE WHEN rating IS NULL THEN 1 ELSE 0 END, rating DESC
Estos fragmentos no se ejecutan en el curso: se muestran como referencia de cada motor.