← SQL EspañolChapter 04 of 13

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 →