Parte 04 — SQL en profundidad
Escribir SQL cuya semántica se pueda defender: definición del esquema, reuniones, agregación, ventanas y el comportamiento real de los nulos.
6 clases · 20 horas ·
27 conceptos · 9 fuentes
Antes de esta parte
Esta parte se apoya en lo trabajado antes. Si vienes de fuera del programa, revisa al menos el vocabulario de:
De qué trata esta parte
Seis clases para escribir SQL cuya semántica se pueda defender. No es un recorrido por la sintaxis: es la parte donde se cierran los huecos por los que se cuelan los resultados silenciosamente incorrectos, que son mucho peores que los errores, porque no fallan.
El orden sigue el ciclo de vida de una consulta. Primero el DDL como contrato ejecutable, porque lo que el esquema rechaza no hay que validarlo en ningún lenguaje. Después el `SELECT` con su orden lógico de evaluación y la colación, que decide si `a` es igual a `A`. Luego las cuatro formas de reunir, con la semirreunión como la corrección que más código arregla. La agregación y el doble conteo que produce una reunión previa. Las CTE, la recursión y las funciones de ventana, para lo que no cabe en una expresión. Y al final los nulos, colocados a propósito al cierre para que se vean actuando sobre todo lo anterior.
Si solo hay tiempo para dos clases de esta parte, son la 026 y la 029: reuniones y nulos concentran la mayoría de los errores que llegan a producción sin ser detectados.
Al terminar esta parte podrás
- Escribir DDL que exprese las reglas del dominio como restricciones que el motor impone.
- Predecir el resultado de una consulta razonando desde el orden lógico de evaluación.
- Elegir entre reunión interna, externa, semi y anti según lo que la pregunta realmente pide.
- Detectar y corregir un doble conteo causado por una reunión que multiplica filas.
- Resolver con CTE, recursión o funciones de ventana lo que no cabe en una consulta plana.
- Predecir el efecto de los nulos en comparaciones, agregados y `NOT IN`.
Las clases, una por una
Fundamentos · 3 h ·
4 fuentes · requiere 006, 023
El DDL leído como un contrato ejecutable: cada tipo y cada restricción es una validación que ya no hay que escribir en ninguna aplicación. Incluye una divergencia que decide cómo se hacen las migraciones: si el DDL es transaccional en tu motor o si una migración a medias deja un estado sin retorno.
tipo de dato restricción valor por defecto DDL transaccional
Fundamentos · 3 h ·
3 fuentes · requiere 004, 020
El `SELECT` con su semántica exacta: el orden lógico de evaluación que explica por qué un alias del `SELECT` no vale en el `WHERE`, y la colación, que decide si `a` es igual a `A` y dónde va la `ñ`. Cierra con el determinismo de orden, que es la diferencia entre una consulta reproducible y una que cambia el día que cambia el plan.
predicado orden de evaluación colación determinismo de orden
Intermedio · 4 h ·
3 fuentes · requiere 008, 021
Las cuatro formas de reunir y cuándo se quiere cada una. La distinción que más código corrige es la semirreunión: el `EXISTS` que casi siempre se quería cuando se escribió un `JOIN` seguido de `DISTINCT`, sin multiplicar filas ni arriesgar el doble conteo.
reunión interna reunión externa semirreunion antirreunion multiplicación de filas
Intermedio · 3 h ·
3 fuentes · requiere 026
Agregar sin mentir. Explica por qué `WHERE` y `HAVING` no son intercambiables, cómo una reunión previa multiplica filas y produce totales inflados, y cómo se corrige agregando en una CTE antes de reunir. Incluye la divergencia entre motores sobre qué columnas se pueden seleccionar sin agrupar.
agrupación agregado HAVING doble conteo dependencia funcional en GROUP BY
Intermedio · 4 h ·
4 fuentes · requiere 026, 027
Las herramientas para consultas que no caben en una sola expresión: CTE para nombrar pasos, recursión para recorrer jerarquías y funciones de ventana para calcular por grupo sin perder el detalle. La sutileza que más resultados cambia es el marco por defecto de una ventana con `ORDER BY`.
CTE recursión subconsulta correlacionada partición de ventana marco
Intermedio · 3 h ·
3 fuentes · requiere 003, 025
La lógica de tres valores y sus consecuencias prácticas: `NOT IN` que devuelve vacío por un solo nulo, agregados que ignoran ausencias y comparaciones que nunca son ciertas. Presenta `IS DISTINCT FROM` como la forma correcta de comparar columnas opcionales, que reaparece al detectar cambios en una migración.
UNKNOWN IS DISTINCT FROM NOT IN con nulos agregados y nulos
Errores frecuentes en esta parte
Cada uno de estos es una creencia habitual y su corrección.
- «`WHERE` y `HAVING` son intercambiables.» `WHERE` filtra filas antes de agrupar y `HAVING` filtra grupos después. Cambiar uno por otro cambia el resultado o el costo.
- «Añadí un `DISTINCT` y ya salen bien.» El `DISTINCT` tapa el síntoma de una reunión que multiplica filas; casi siempre lo que se quería era una semirreunión.
- «`NOT IN` y `NOT EXISTS` son lo mismo.» Con un solo nulo en la subconsulta, `NOT IN` devuelve el conjunto vacío. `NOT EXISTS` no.
- «`LEFT JOIN` conserva las filas sin pareja.» Salvo que pongas una condición sobre la tabla externa en el `WHERE`, que la convierte de nuevo en interna.
- «`COUNT(*)` y `COUNT(columna)` son lo mismo.» El segundo ignora los nulos.
Vocabulario de la parte
Los 27 términos que esta parte introduce. Todos están también
en el glosario del programa con sus términos
relacionados.
Fuentes usadas en esta parte
9 obras distintas sostienen lo que se afirma en estas
6 clases.
- Database Systems: The Complete Book (2008) — se cita en 027
- Extending the Database Relational Model to Capture More Meaning (1979) — se cita en 029
- ISO/IEC 9075: Information technology - Database languages - SQL (2023) — se cita en 024, 028
- Joe Celko's SQL for Smarties: Advanced SQL Programming (2014) — se cita en 027, 028
- PostgreSQL Documentation (2026) — se cita en 024, 028, 029
- SQL Cookbook (2020) — se cita en 025, 026, 027, 028
- SQL Performance Explained (2012) — se cita en 026
- SQL and Relational Theory: How to Write Accurate SQL Code (2015) — se cita en 024, 025, 026, 029
- SQLite Documentation (2026) — se cita en 024, 025
Otras partes