Atlasingeniería

Bases de datosModelo relacionalTema 3

Álgebra relacional

Seis operaciones sobre conjuntos que producen conjuntos. Es el lenguaje en el que el motor piensa una consulta, y entenderlo es lo que permite leer un plan de ejecución.

Para este tema conviene tener claro:Tablas, claves e integridad referencial

SQL se parece al inglés y por eso se aprende de memoria. Debajo hay algo bastante más chico: un álgebra con seis operaciones básicas donde cada una toma relaciones y devuelve una relación. El motor traduce la consulta a esas operaciones, y ahí es donde decide cómo ejecutarla.

Por qué las operaciones se encadenan

La propiedad que lo hace funcionar es la cerradura: toda operación devuelve una relación, así que se pueden componer sin límite. La salida de una es la entrada de la siguiente.

Eso es lo que permite anidar subconsultas y encadenar vistas: no hay un tipo intermedio distinto, siempre es una relación. Y como una relación es un conjunto, no hay orden ni filas repetidas —una diferencia con SQL, que trabaja con multiconjuntos y sí admite duplicados salvo que se pida DISTINCT—.

Antes de seguir, predecí

Un producto cartesiano entre una tabla de 10.000 filas y otra de 5.000. ¿Cuántas filas da?

Cortar a lo ancho y a lo largo

Las dos operaciones unarias se corresponden con las dos formas de recortar una tabla. La selección σ\sigma elige filas que cumplen una condición: es el WHERE, y corta horizontalmente.

La proyección π\pi elige columnas: es la lista del SELECT, y corta verticalmente. Un detalle que se olvida: en el álgebra, proyectar elimina duplicados, porque el resultado es un conjunto.

La tabla de empleados, entera.

1 / 5
Uno corta horizontal, el otro vertical. Y el último paso es el que se olvida siempre: proyectar sobre «ciudad» devolvió dos veces «Rosario», y en el álgebra eso es una sola fila. SQL, que trabaja con multiconjuntos, las devuelve las dos salvo que le pidas DISTINCT.

Las que combinan dos relaciones

De las binarias, tres son de teoría de conjuntos y requieren esquemas compatibles: unión, diferencia e intersección. La diferencia es la que más se subestima: es la única forma de expresar “los que están acá y no allá”, y es la base del NOT EXISTS.

Las otras dos combinan tablas distintas. El producto cartesiano ×\times empareja cada fila con cada fila, y el join \bowtie es un producto seguido de una selección: emparejar sólo donde la condición se cumple. El join no es primitivo, es una abreviatura, y sin embargo es la operación central de todo el modelo.

Lo que se construye con las seis básicas

Con esas seis se construye el resto. La división responde consultas del tipo “los que se relacionan con todos” —los alumnos que aprobaron todas las materias— y se expresa con diferencias y productos, aunque cueste leerla.

La renombración permite hacer join de una tabla consigo misma, que es lo que hace falta para comparar filas entre sí: empleados que ganan más que su jefe, por ejemplo. Y las agregaciones y los valores nulos quedan fuera del álgebra clásica: son extensiones que SQL agregó por necesidad práctica.

Las equivalencias que usa el optimizador

Acá está la razón por la que esto importa fuera de la teoría. El álgebra tiene equivalencias: dos expresiones distintas que siempre dan el mismo resultado. Eso es lo que habilita al optimizador a reescribir la consulta.

La regla más rentable es empujar las selecciones hacia abajo: filtrar antes de hacer el join, no después. Si una tabla de un millón de filas se reduce a cien antes de combinarla, el join trabaja sobre cien. Esa reescritura es automática, y es por eso que WHERE y ON suelen dar el mismo plan en un inner join —pero no en un outer, donde el orden cambia el resultado—.

Por qué SQL describe el qué y no el cómo

La consecuencia es la que define el trabajo con bases relacionales: SQL es declarativo. Se describe qué se quiere, no cómo obtenerlo, y el motor elige el plan usando estadísticas de los datos.

Por eso una consulta puede volverse lenta sin que su texto cambie: cambiaron los datos, o las estadísticas quedaron desactualizadas. Leer un plan de ejecución es leer un árbol de operaciones del álgebra, con la implementación concreta de cada una —recorrido secuencial, búsqueda por índice, hash join— anotada en cada nodo.

Por qué sirve saberla

OperaciónEn SQLDetalle que cambia
Selección σWHEREigual
Proyección πSELECT columnasel álgebra elimina duplicados; SQL no, salvo DISTINCT
Unión ∪UNIONUNION elimina duplicados; UNION ALL no, y es más barato
Producto ×CROSS JOINigual
Join ⋈JOIN ... ONigual
Diferencia −EXCEPTigual
La diferencia entre conjuntos y multiconjuntos es toda la brecha entre el álgebra y SQL, y explica por qué UNION es más caro que UNION ALL: tiene que ordenar para deduplicar.

La utilidad práctica del álgebra no es escribirla: es que el optimizador del motor razona con ella. Cuando reescribe una consulta, lo que hace es aplicar equivalencias algebraicas —empujar una selección antes de un join, reordenar joins, eliminar una proyección redundante— sabiendo que el resultado no cambia.

Cierre

Selección, proyección, unión, diferencia, producto y renombración: con eso se expresa toda consulta relacional, y el join es producto más selección. Las equivalencias entre expresiones son lo que permite optimizar, y son la razón de que SQL diga qué y no cómo.

Autoevaluación

¿Lo entendiste?

¿Qué propiedad permite componer operaciones sin límite?
En el álgebra, proyectar elimina duplicados. ¿Por qué SQL no lo hace?
Selección y proyección, ¿qué cortan?
¿Cuál es la operación binaria que más se subestima?