Saltar a contenido

1.4 Ordenar, limitar y funciones

ORDER BY: ordenar el resultado

Sin ORDER BY, el orden de las filas no está garantizado (aunque a menudo parezca estable). Para fijarlo:

SELECT nombre, apellido FROM alumnos ORDER BY apellido;

Resultado:

nombre apellido
Raúl Campos
Marta Díaz
Ana Gil
Irene Lara
Elena Marín
Pablo Núñez
… …

14 filas (se muestran 6)

Opción Significa
ASC De menor a mayor (es lo predeterminado)
DESC De mayor a menor

Se puede ordenar por varias columnas: primero por la primera y, en caso de empate, por la siguiente.

SELECT ciudad, apellido, nombre FROM alumnos ORDER BY ciudad ASC, apellido DESC;

Resultado:

ciudad apellido nombre
Cádiz Torres Iván
Cádiz Peña Marcos
Cádiz Gil Ana
Cádiz Díaz Marta
Cádiz Campos Raúl
Jerez Prieto Noa
Jerez Núñez Pablo
Jerez Lara Irene
… … …

14 filas (se muestran 8)

También se puede ordenar por un cálculo o por el alias que le diste:

SELECT nombre, horas FROM asignaturas ORDER BY horas DESC, nombre;

Resultado:

nombre horas
Programación 230
Bases de Datos 160
Sistemas Informáticos 160
Entornos de Desarrollo 100
Lenguajes de Marcas 100
Inglés Técnico 60

6 filas

LIMIT y OFFSET: paginar

LIMIT n devuelve solo n filas; OFFSET m se salta las m primeras. Con ORDER BY sirven para «los 3 mejores» o para paginar resultados:

SELECT nombre, apellido, nacimiento FROM alumnos ORDER BY nacimiento DESC LIMIT 3;

Resultado:

nombre apellido nacimiento
Irene Lara 2005-12-24
Sara Vega 2005-09-09
Marta Díaz 2005-07-21

3 filas

SELECT nombre, apellido, nacimiento FROM alumnos ORDER BY nacimiento DESC LIMIT 3 OFFSET 3;

Resultado:

nombre apellido nacimiento
Dani Soto 2005-04-01
Ana Gil 2005-03-14
Luis Romero 2004-11-02

3 filas

Funciones de texto

Función Qué hace Ejemplo
UPPER(t), LOWER(t) Mayúsculas, minúsculas UPPER('ana') → ANA
LENGTH(t) Número de caracteres LENGTH('Marta') → 5
SUBSTR(t, inicio, n) Un trozo (la primera posición es 1) SUBSTR('Cádiz', 1, 3) → Cád
TRIM(t) Quita espacios de los extremos
REPLACE(t, a, b) Cambia a por b
SELECT UPPER(apellido) AS apellido, LENGTH(nombre) AS letras, SUBSTR(ciudad, 1, 3) AS cod FROM alumnos;

Resultado:

apellido letras cod
GIL 3 Cád
ROMERO 4 Sev
DíAZ 5 Cád
NúñEZ 5 Jer
VEGA 4 Sev
… … …

14 filas (se muestran 5)

Funciones numéricas

ROUND(x, decimales), ABS(x), y los operadores aritméticos:

SELECT nombre, horas, ROUND(horas / 8.0, 1) AS dias_de_8h FROM asignaturas;

Resultado:

nombre horas dias_de_8h
Programación 230 28.8
Bases de Datos 160 20.0
Entornos de Desarrollo 100 12.5
Lenguajes de Marcas 100 12.5
Sistemas Informáticos 160 20.0
Inglés Técnico 60 7.5

6 filas

Fechas

Las fechas se guardan como texto AAAA-MM-DD y se manejan con funciones, que cambian bastante entre motores:

SELECT nombre, nacimiento, strftime('%Y', nacimiento) AS anio, strftime('%m', nacimiento) AS mes FROM alumnos;

Resultado:

nombre nacimiento anio mes
Ana 2005-03-14 2005 03
Luis 2004-11-02 2004 11
Marta 2005-07-21 2005 07
Pablo 2003-01-30 2003 01
Sara 2005-09-09 2005 09
… … … …

14 filas (se muestran 5)

Quiero... SQLite MySQL PostgreSQL
El año de una fecha strftime('%Y', f) YEAR(f) EXTRACT(YEAR FROM f)
La fecha de hoy date('now') CURDATE() CURRENT_DATE
Sumar 7 días date(f, '+7 days') DATE_ADD(f, INTERVAL 7 DAY) f + INTERVAL '7 days'

Orden y NULL

Al ordenar, los NULL aparecen al principio en SQLite y MySQL (cuando es ascendente) y al final en PostgreSQL y Oracle. Si importa, hay que decidirlo a mano o consultar el manual del motor.

SELECT nombre, id_profesor FROM asignaturas ORDER BY id_profesor;

Resultado:

nombre id_profesor
Inglés Técnico NULL
Programación 1
Bases de Datos 2
Entornos de Desarrollo 3
Lenguajes de Marcas 3
Sistemas Informáticos 4

6 filas

Errores frecuentes

Error Cómo evitarlo
Confiar en un orden sin ORDER BY Escribirlo siempre que importe
LIMIT sin ORDER BY «Las 3 primeras» solo tiene sentido si están ordenadas
Contar desde 0 en SUBSTR La primera posición es 1
Dividir enteros esperando decimales horas / 8.0
Escribir fechas en otro formato (14/03/2005) Usar AAAA-MM-DD, que se ordena y compara bien

Para practicar

Los ejercicios S1.8 a S1.14 de S1 · Ejercicios combinan filtros, orden y funciones.