Ordenamiento y Limitación
## Objetivos de Aprendizaje
- Dominar ORDER BY
- Ordenar por múltiples columnas
- Usar ASC y DESC
- Limitar resultados efectivamente
## Cláusula ORDER BY
### Ordenamiento Básico
```sql
SELECT
first_name,
last_name,
salary
FROM employees
ORDER BY last_name;
```
### Ascendente (Por Defecto)
```sql
SELECT *
FROM employees
ORDER BY salary ASC;
-- ASC es el valor por defecto, así que es igual a:
ORDER BY salary;
```
### Descendente
```sql
SELECT *
FROM employees
ORDER BY salary DESC;
```
## Ordenar por Múltiples Columnas
### Ordenamiento Secuencial
```sql
SELECT
department,
first_name,
last_name,
salary
FROM employees
ORDER BY department ASC, salary DESC;
```
### Cómo Funciona
1. Primero, ordena por department (A-Z)
2. Dentro de cada departamento, ordena por salary (mayor primero)
### Ejemplo de Resultado
```text
department | first_name | salary
-----------+------------+--------
Engineering| Carol | 95000
Engineering| Alice | 85000
Sales | Bob | 75000
Sales | Dave | 70000
```
## Ordenar por Posición de Columna
### Usando Números
```sql
SELECT
first_name,
last_name,
salary
FROM employees
ORDER BY 3 DESC; -- Ordenar por 3ra columna (salary)
```
### No Recomendado
Los números de posición son más difíciles de leer y mantener.
## NULL en Ordenamiento
### Colocación (Dependiente de la Base de Datos)
```sql
-- La mayoría de las bases de datos: NULL primero con ASC, último con DESC
ORDER BY hire_date ASC; -- NULL primero
ORDER BY hire_date DESC; -- NULL último
-- Control explícito
ORDER BY hire_date ASC NULLS FIRST;
ORDER BY hire_date DESC NULLS LAST;
```
## ORDER BY con Expresiones
### Calcular y Ordenar
```sql
SELECT
first_name,
salary,
salary * 12 AS annual_salary
FROM employees
ORDER BY annual_salary DESC;
```
### Ordenar por Longitud
```sql
-- Nombres más largos primero
SELECT first_name
FROM employees
ORDER BY LENGTH(first_name) DESC;
```
## LIMIT / FETCH
### MySQL / PostgreSQL / SQLite
```sql
-- Top 5 mejor pagados
SELECT
first_name,
last_name,
salary
FROM employees
ORDER BY salary DESC
LIMIT 5;
```
### SQL Server
```sql
SELECT TOP 5
first_name,
last_name,
salary
FROM employees
ORDER BY salary DESC;
```
### PostgreSQL FETCH
```sql
SELECT *
FROM employees
ORDER BY salary DESC
FETCH FIRST 5 ROWS ONLY;
```
### ANSI SQL FETCH
```sql
SELECT *
FROM employees
ORDER BY salary DESC
FETCH FIRST 5 ROWS WITH TIES;
```
## OFFSET
### Omitir Filas
```sql
-- Omitir los primeros 10, obtener los siguientes 5
SELECT *
FROM employees
ORDER BY salary DESC
LIMIT 5 OFFSET 10;
```
### Consulta de Paginación
```sql
-- Página 1
SELECT *
FROM employees
ORDER BY employee_id
LIMIT 10 OFFSET 0;
-- Página 2
SELECT *
FROM employees
ORDER BY employee_id
LIMIT 10 OFFSET 10;
-- Página 3
SELECT *
FROM employees
ORDER BY employee_id
LIMIT 10 OFFSET 20;
```
## DISTINCT con ORDER BY
```sql
-- Obtener departamentos únicos, alfabéticamente
SELECT DISTINCT department
FROM employees
ORDER BY department;
```
## Patrones Comunes
### Top N por Grupo
```sql
-- Mejor pagados en cada departamento
SELECT *
FROM employees e1
WHERE salary = (
SELECT MAX(salary)
FROM employees e2
WHERE e2.department = e1.department
)
ORDER BY department, salary DESC;
```
### Primer/Último Registro
```sql
-- Contrato más reciente
SELECT *
FROM employees
ORDER BY hire_date DESC
LIMIT 1;
-- Primer contratado
SELECT *
FROM employees
ORDER BY hire_date ASC
LIMIT 1;
```
## Consideraciones de Rendimiento
### Uso de Índices
```sql
-- Rápido con índice en salary
ORDER BY salary DESC;
-- Lento sin índice
ORDER BY salary + (bonus * 12) DESC;
```
### LIMIT Sin ORDER BY
```sql
-- Resultados impredecibles
LIMIT 10; -- ¿Cuáles 10?
-- Siempre usa ORDER BY con LIMIT
ORDER BY employee_id
LIMIT 10;
```
## Resumen
- `ORDER BY` ordena los resultados
- `ASC` ascendente (por defecto), `DESC` descendente
- Ordenar múltiples columnas: primero por la primera, luego por la segunda
- La colocación de `NULL` varía; usa `NULLS FIRST/LAST` si está soportado
- `LIMIT` / `TOP` restringe el conteo de filas
- `OFFSET` omite filas para paginación
- Siempre usa `ORDER BY` con `LIMIT` para resultados predecibles
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →