40. Aplicaciones de conjuntos en bases de datos y SQL

Las bases de datos relacionales trabajan con ideas de conjuntos: tablas, filas, consultas, filtros, uniones, intersecciones, diferencias y relaciones entre entidades.

40.1 Introducción

Las bases de datos relacionales están profundamente conectadas con la teoría de conjuntos. Una tabla puede verse como un conjunto de filas, una consulta como una operación que produce otro conjunto de filas, y una relación entre tablas como una asociación entre conjuntos.

SQL incluye operaciones que se parecen directamente a unión, intersección, diferencia, producto cartesiano y selección por propiedades.

40.2 Tablas como conjuntos de filas

Una tabla representa una colección de registros. Conceptualmente, cada fila puede verse como una tupla.

usuarios(id, nombre, estado) (1, Ana, activo) (2, Luis, inactivo)

En la práctica, SQL puede permitir duplicados en algunos resultados, pero el modelo relacional clásico trabaja con la idea de conjuntos de tuplas.

40.3 SELECT como construcción de subconjuntos

Una consulta con WHERE selecciona filas que cumplen una propiedad. Esto equivale a construir un subconjunto.

{u ∈ usuarios | u.estado = "activo"}
SELECT * FROM usuarios WHERE estado = 'activo';

El resultado es el subconjunto de usuarios activos.

40.4 Proyección de columnas

Seleccionar columnas específicas se relaciona con proyectar tuplas sobre algunas de sus componentes.

SELECT nombre FROM usuarios;

La consulta toma cada fila y conserva solo el campo nombre.

40.5 Unión en SQL

UNION combina resultados de dos consultas y elimina duplicados.

SELECT email FROM clientes UNION SELECT email FROM proveedores;

El resultado contiene correos que aparecen en clientes, proveedores o ambos.

40.6 UNION ALL

UNION ALL también combina resultados, pero conserva duplicados.

SELECT email FROM clientes UNION ALL SELECT email FROM proveedores;

Esto se comporta más como concatenación de listas que como unión matemática estricta.

40.7 Intersección en SQL

INTERSECT obtiene filas que aparecen en ambos resultados.

SELECT email FROM clientes INTERSECT SELECT email FROM suscriptores;

El resultado contiene correos que están tanto en clientes como en suscriptores.

40.8 Diferencia en SQL

EXCEPT obtiene filas que aparecen en el primer resultado y no en el segundo.

SELECT email FROM clientes EXCEPT SELECT email FROM bloqueados;

El resultado contiene clientes que no están bloqueados.

40.9 Producto cartesiano

Un producto cartesiano entre tablas combina cada fila de una tabla con cada fila de otra.

SELECT * FROM talles CROSS JOIN colores;

Si hay 3 talles y 2 colores, el resultado tiene 6 combinaciones.

40.10 JOIN como relación entre conjuntos

Un JOIN combina filas de dos tablas según una condición. Puede verse como una selección sobre el producto cartesiano.

SELECT usuarios.nombre, pedidos.id FROM usuarios JOIN pedidos ON usuarios.id = pedidos.usuario_id;

La condición del ON determina qué pares de filas forman parte del resultado.

40.11 INNER JOIN e intersección conceptual

Un INNER JOIN devuelve solo las filas que tienen coincidencia en ambas tablas según la condición.

usuarios con pedidos

Conceptualmente, trabaja con elementos relacionados en ambos conjuntos de datos.

40.12 LEFT JOIN y faltantes

Un LEFT JOIN conserva todas las filas de la tabla izquierda y agrega datos de la derecha cuando hay coincidencia.

SELECT usuarios.nombre, pedidos.id FROM usuarios LEFT JOIN pedidos ON usuarios.id = pedidos.usuario_id;

Es útil para encontrar elementos sin relación, por ejemplo usuarios sin pedidos.

40.13 Buscar elementos sin relación

Para detectar usuarios sin pedidos, se puede usar LEFT JOIN y filtrar los nulos.

SELECT usuarios.nombre FROM usuarios LEFT JOIN pedidos ON usuarios.id = pedidos.usuario_id WHERE pedidos.id IS NULL;

Esta consulta equivale a buscar elementos de un conjunto que no aparecen relacionados con otro.

40.14 DISTINCT y unicidad

DISTINCT elimina duplicados del resultado.

SELECT DISTINCT categoria FROM productos;

El resultado se comporta como un conjunto de categorías únicas.

40.15 Traducción entre conjuntos y SQL

Teoría de conjuntos SQL Idea
Subconjunto por propiedad WHERE Filtrar filas
Unión UNION Combinar resultados sin duplicados
Intersección INTERSECT Filas comunes
Diferencia EXCEPT Filas del primer resultado que no están en el segundo
Producto cartesiano CROSS JOIN Todas las combinaciones
Relación JOIN ON Combinar filas relacionadas

40.16 Simular operaciones con JavaScript

Podemos representar resultados de consultas como conjuntos y aplicar operaciones similares.

const clientes = new Set(["ana@correo.com", "luis@correo.com"]);
const suscriptores = new Set(["luis@correo.com", "carla@correo.com"]);

function union(a, b) {
  return new Set([...a, ...b]);
}

function interseccion(a, b) {
  return new Set([...a].filter(elemento => b.has(elemento)));
}

function diferencia(a, b) {
  return new Set([...a].filter(elemento => !b.has(elemento)));
}

console.log([...union(clientes, suscriptores)]);
console.log([...interseccion(clientes, suscriptores)]);
console.log([...diferencia(clientes, suscriptores)]);

40.17 Aplicaciones prácticas

  • Combinar resultados de búsquedas con UNION.
  • Encontrar registros comunes con INTERSECT.
  • Detectar faltantes con EXCEPT o LEFT JOIN.
  • Generar combinaciones con CROSS JOIN.
  • Modelar relaciones entre entidades con JOIN.
  • Eliminar duplicados con DISTINCT.

40.18 Errores frecuentes

  • Confundir UNION con UNION ALL.
  • Generar un producto cartesiano accidental por olvidar una condición de JOIN.
  • Creer que todas las bases de datos soportan exactamente los mismos operadores de conjuntos.
  • Ignorar duplicados cuando se compara SQL con conjuntos matemáticos.
  • Usar NULL sin considerar su comportamiento especial en condiciones.

40.19 Qué debes recordar de este tema

  • Una tabla puede verse como un conjunto de tuplas.
  • WHERE construye subconjuntos por condición.
  • UNION, INTERSECT y EXCEPT se relacionan con operaciones de conjuntos.
  • CROSS JOIN representa producto cartesiano.
  • JOIN combina filas según una relación.
  • DISTINCT ayuda a recuperar comportamiento de conjunto eliminando duplicados.

40.20 Conclusión

Las bases de datos relacionales y SQL aplican constantemente ideas de teoría de conjuntos. Comprender estas conexiones permite escribir consultas más claras, evitar errores y razonar mejor sobre los resultados.

En el próximo tema estudiaremos aplicaciones de conjuntos en teoría de grafos.