Introducción al Álgebra Relacional

Universidad de Sevilla

Departamento de Lenguajes y Sistemas Informáticos

Objetivos

Contenido

  • ¿Qué es el álgebra relacional?
  • Conceptos previos
  • Operadores conjuntistas
  • Operadores relacionales

¿Qué es el Álgebra Relacional (AR)?

  • Es un conjunto de operadores sobre relaciones propuesto por Codd que permiten expresar consultas sobre un modelo relacional.
  • Los operadores del AR devuelven como resultado una relación derivada, por lo que pueden anidarse formando expresiones complejas.
  • Operadores conjuntistas
    • Unión: RSR \cup S
    • Intersección: RSR\cap S
    • Diferencia: RSR \setminus S
    • Producto cartesiano: R×SR \times S
  • Operadores relacionales
    • Selección: σf(R)\sigma_f(R)
    • Proyección: ΠB(R)\Pi_B(R)
    • Combinación: RSR \bowtie S (join)
    • División: R÷SR \div S
    • Agregación: ΥGF(R)\Upsilon_G^F(R)

Introducción al Álgebra Relacional

  • Nombres de atributos
    • Se prefijan con el nombre de la relación a la que pertenecen cuando pueda haber ambigüedad (Notación calificada)
      • R.aR.a = atributo aa de la relación RR
  • Relaciones compatibles
    • Son relaciones cuyas intensiones comparten los mismos dominios, de modo que cada atributo tiene su correspondiente en la otra relación y ambos están definidos sobre el mismo dominio.
    • Sobre ellas se pueden aplicar los operadores conjuntistas de unión, diferencia e intersección.
    • Si se quiere aplicar dichos operadores sobre relaciones no compatibles por tener nombres de atributos diferentes, es necesario usar el operador de renombrado para hacerlas compatibles.
  • ρT(t1,t2,)(R)\rho_{T(t_1, t_2, \ldots)}(R): Cambia nombre de relación y atributos

Operadores conjuntistas

Unión: TRST \leftarrow R \cup S

I(T)=I(R)E(T)=E(R)E(S)I(T) = I(R) \\ E(T) = E(R) \cup E(S)

Diferencia: TRST \leftarrow R \setminus S

I(T)=I(R)E(T)=E(R)E(S)I(T) = I(R) \\ E(T) = E(R) \setminus E(S)

Operadores conjuntistas

Intersección: TRST \leftarrow R \cap S

I(T)=I(R)E(T)=E(R)E(S)I(T) = I(R) \\ E(T) = E(R) \cap E(S)

Producto cartesiano: TR×ST \leftarrow R \times S

I(T)=I(R)I(S)E(T)={(r,s)rE(R)sE(S)}I(T) = I(R) \cup I(S) \\ E(T) = \{(r,s) \mid r \in E(R) \land s \in E(S)\}

R y S tienen que ser compatibles para \cup, \cap y \setminus

Operadores relacionales: selección

Selección (sigma) Tσf(R)T \leftarrow \sigma_f(R)

I(T)=I(R)E(T)={rE(R)f(R)}I(T) = I(R) \\ E(T) = \{ r \in E(R) \mid f(R) \}

ff es una expresión lógica bien formada sobre los atributos de I(R)I(R)

Selecciona las filas de RR que cumplen ff

Ejemplo: Pedidos

Dos relaciones 0..* con composición

Clase asociación

Ejemplo: Pedidos

-- Intensión
Usuarios = { usuarioId, nombre, dirección, teléfono, provincia }
    PK(usuarioId)
    AK(nombre)
Productos = { productoId, descripción, precio}
    PK(productoId)
Pedidos = {pedidoId, usuarioId, productoId, cantidad}
    PK(pedidoId)
    FK(usuarioId) / Usuarios
    FK(productoId) / Productos

-- Extensión
Usuarios = {
    ('U1', 'David', 'Calle Mayor 15, Sevilla',       '954 223 456', 'Sevilla'),
    ('U2', 'Marta', 'Avenida Andalucía 42, Málaga',  '952 334 567', 'Málaga'),
    ('U3', 'Pedro', 'Paseo de Gracia 78, Barcelona', '933 445 678', 'Barcelona'), ...
}
Productos = {
    ('P1', 'Xiaomi mi band 4',            36),
    ('P2', 'Motorola One',               399),
    ('P3', 'Correa compatible mi band 4', 10), ...
}
Pedidos = {
    ('P1', 'U1', 'P1', 2), -- David compra 2 mi band 4
    ('P2', 'U1', 'P3', 2), -- David compra 2 correas compatibles
    ('P3', 'U2', 'P2', 1), -- Marta compra 1 Motorola One
    ...
}

Ejemplo: Selección

Renombrado

ρU(uid,n,di,t,pro)(Usuarios)ρP(pid,de,pre)(Productos)ρPed(id,uid,pid,c)(Pedidos)\Ren_{U(uid,n,di,t,pro)} (Usuarios) \\ \Ren_{P(pid,de,pre)} (Productos) \\ \Ren_{Ped(id,uid, pid, c)} (Pedidos)

Ejemplo: Selección

Usuarios de la provincia de Sevilla

Sevillanosσpro=Sevilla(U)Sevillanos \leftarrow \Sel_{pro='Sevilla'}(U)

Usuarios que no son de Sevilla

Opcion1σproSevilla(U)Opcion1 \leftarrow \Sel_{pro\neq'Sevilla'}(U)

Opcion2USevillanosOpcion2 \leftarrow U \setminus Sevillanos

Usuarios que son de Málaga o Sevilla

Opcion1σpro=Sevillapro=Maˊlaga(U)Opcion1 \leftarrow \Sel_{pro='Sevilla'\lor pro='Málaga'} (U)

Malaguen~osσpro=Maˊlaga(U)Opcion2SevillanosMalaguen~osMalagueños \leftarrow \Sel_{pro='Málaga'}(U) \\ Opcion2 \leftarrow Sevillanos \cup Malagueños

Operadores relacionales: proyección

Proyección (Pi): TΠB(R)T \leftarrow \Pi_B(R)

Prerequisito: BI(R)B \subseteq I(R)

I(T)=BE(T)={(r.a1,r.a2,,r.ak)(rE(R){a1,a2,,ak}=B)}I(T) = B \\ E(T) = \{ (r.a_1, r.a_2, \ldots, r.a_k) \mid (r \in E(R) \land \{a_1, a_2, \ldots, a_k\} = B) \}

Extrae columnas B de R

Ejemplo: Proyección

Nombre de los usuarios que son de Málaga o Sevilla

Opción 1: una única expresión

Opcion1ΠU.n(σprov=Sevillaprov=Maˊlaga(U))Opcion1 \leftarrow \Proj_{U.n}(\Sel_{prov='Sevilla' \lor prov='Málaga'}(U))

Opción 2: con relaciones intermedias

Sσprov=Sevilla(U)Mσprov=Maˊlaga(U)SMSMOpcioˊn2ΠU.n(SM) S \leftarrow \Sel_{prov='Sevilla'}(U) \\ M \leftarrow \Sel_{prov='Málaga'}(U) \\ SM \leftarrow S \cup M \\ Opción2 \leftarrow \Proj_{U.n} (SM)

Operadores relacionales: combinación

Combinación (join): TRST \leftarrow R \bowtie S

Prerequisito: I(R)I(S)=CI(R) \cap I(S) = C \neq \emptyset

I(T)=I(R)I(S)E(T)={rs(rE(R)sE(S)cC(r.c=s.c))}I(T) = I(R) \cup I(S) \\ E(T) = \{ r \cup s \mid(r \in E(R) \land s \in E(S) \land \forall c \in C \models (r.c=s.c)) \}

Producto cartesiano de RR y SS donde los valores de las claves primarias de RR coinciden con los de SS

Operadores relacionales: combinación

Se usa para combinar datos de relaciones que están enlazadas mediante claves ajenas.

La combinación crea una nueva relación que no está normalizada

Operador derivado que usa proyección, selección y producto cartesiano:

  • {ci}=I(R)I(S)\{c_i\} = I(R) \cap I(S) (atributos comunes de R y S, suelen ser PK/FK)
  • {uj}=I(R)I(S)\{u_j\} = I(R) \cup I(S) (todos los atributos, sin repeticiones)

Πuj(σR.ci=S.ci(R×S))\Proj_{u_j}\left(\Sel_{R.c_i = S.c_i}(R \times S)\right)

Ejemplo: Combinación

Nombre de los usuarios, descripción y cantidad de los productos que ha pedido

ΠU.n,P.de,Ped.c(UPedP)\Proj_{U.n, P.de, Ped.c} (U \Join Ped \Join P)

Nombre de los usuarios que no han realizado ningún pedido

NombresΠU.n(U)NombresConPedidoΠU.n(UPed)ResultadoNombresNombresConPedidos Nombres \leftarrow \Proj_{U.n}(U) \\ NombresConPedido \leftarrow \Proj_{U.n}(U \Join Ped) \\ Resultado \leftarrow Nombres \setminus NombresConPedido s

Operadores relacionales: división

División: TR÷ST \leftarrow R \div S

Prerequisito: I(S)I(R)I(S) \subset I(R)

I(T)=I(R)I(S)E(T)={t(sE(S)(t,s)E(R))} I(T) = I(R) \setminus I(S) \\ E(T) = \{t \mid (\forall s \in E(S) \models (t,s) \in E(R))\}

Sean R(r,s) y S(s) dos relaciones, la división devuelve los valores de r tales que para todo valor de s existe una tupla (r,s) en R.

Ejemplos: división

Nombre de los usuarios que han comprado todos los productos

ProductoIdsΠpid(P)NombreProdIdΠU.n,P.pid(UPedP)ResultadoNombreProdId÷ProductoIds ProductoIds \leftarrow \Proj_{pid} (P) \\ NombreProdId \leftarrow \Proj_{U.n, P.pid}(U \Join Ped \Join P) \\ Resultado \leftarrow NombreProdId \div ProductoIds

Operadores relacionales: agregación

Agregación (Upsilon): TΥGF(R)T \leftarrow \Upsilon_G^F(R)

GI(R)G \subset I(R): conjunto de atributos de agrupamiento.

F: funciones de agregación (sum, count, avg, max, min, ...)

I(T)=G{A1,A2,}E(T)={(g,f1(V1),f2(V2),)gΠG(E(R))Vi={r.airE(R)r[G]=g}} I(T) = G \cup \{A_1', A_2', \ldots\} \\ E(T) = \{(g, f_1(V_1), f_2(V_2), \ldots) \mid g \in \Pi_G(E(R)) \land V_i = \{r.a_i \mid r \in E(R) \land r[G] = g\}\}

Agrupa filas por los atributos G y aplica funciones agregadas F

Ejemplos: agregación

Total de productos pedidos por usuario

ΥP.uidcount(Ped.id),sum(Ped.c)(Ped)\Group_{P.uid}^{count(Ped.id), sum(Ped.c)}(Ped)

Precio promedio de productos

Υavg(P.pre)(P)\Group^{avg(P.pre)}(P)

Precio máximo y mínimo

Υmax(pre),min(pre)(P)\Group_{max(pre), min(pre)}(P)

Nombre de usuario e importe total de sus pedidos

ΥU.nU.n,sum(Ped.cPed.pre)(UPed)\Group_{U.n}^{U.n, sum(Ped.c*Ped.pre)} (U \Join Ped)

Descripción del producto junto con el número de pedidos

ΥP.deP.de,count(Ped.id)(PedP)\Group_{P.de}^{P.de, count(Ped.id)} (Ped \Join P)

Conclusiones

El álgebra relacional es un lenguaje formal y procedimental para consultar bases de datos relacionales.

Sus operaciones toman relaciones como entrada y producen nuevas relaciones como resultado.

Los operadores conjuntistas permiten combinar relaciones compatibles mediante unión, intersección y diferencia.

Los operadores selección y proyección permiten reducir la información a las filas y columnas relevantes.

El producto cartesiano sirve de base para construir operaciones más complejas.

La combinación o join es la operación clave para relacionar datos conectados mediante PK/FK.

Conclusiones

La división permite expresar consultas del tipo “para todos”, menos frecuentes pero muy útiles en ciertos problemas.

El renombrado facilita escribir expresiones más claras y reutilizar relaciones intermedias en consultas complejas.

La agrupación y las funciones de agregación como SUM, COUNT, AVG, MIN y MAX permiten resumir y analizar datos.

El álgebra relacional ayuda a entender cómo se expresan y se optimizan internamente muchas consultas en SQL.

Dominar estos operadores es fundamental para consultar, razonar sobre consultas y diseñar modelos relacionales de calidad.

Gracias

Universidad de Sevilla

Departamento de Lenguajes y Sistemas Informáticos