Álgebra Relacional

¿Por qué estudiar el álgebra relacional?

Para comprender con más precisión lo que hacen los lenguajes de consulta como SQL.

El álgebra relacional es un conjunto de operaciones

El álgebra relacional se define como un conjunto de operaciones. Una característica importante de todas las operaciones del álgebra relacional es que tanto los operandos como el resultado son relaciones. Esta propiedad se denomina cierre (o clausura) relacional. Esto tiene dos consecuencias evidentes pero importantes:

El resultado de una operación puede utilizarse como operando en otra.

El resultado de una operación es una relación con todas las características del modelo relacional: no puede haber tuplas repetidas, las tuplas no están ordenadas, etc.

R:=expr
R(A 1 , A 2 , ... , A n ):= S(B 1 , B 2 , ... , B n )
SELECT "grado-experimentalidad", nombre as denominacion

Operaciones específicamente relacionales

La proyección permite elegir algunos atributos

La operación de proyección permite seleccionar algunos atributos de una relación (sea ésta una relación o el resultado de otras operaciones). Formalmente, dada una relación R(A1, A2, ... , An), y un subconjutno de atributos de esa relación (Ai, Aj, ..., Ak), la proyección sobre esos atributos se denota como R(Ai, Aj, ..., Ak), y contiene las partes de las tuplas con los valores de los atributos proyectados.

La operación de proyección en el lenguaje de consulta SQL se realiza simplemente especificando el subconjunto de atributos en la cláusula SELECT.

dni apellidos nombre fecha-nacimiento es-doctor teléfono-móvil D_nombre

32323 Pérez Juan 30/10/1965 true 65454545 Matemáticas

4434343 Díez José 30/10/1970 true 65789767 Historia

23423432 Sánchez Juan 30/10/1980 false 66789899 Matemáticas

La siguiente sentencia SELECT hace una proyección del nombre y los apellidos.

SELECT nombre, apellidos FROM PROFESORES

Es importante notar que la siguiente sentencia no devolvería una relación, ya que tendría dos tuplas repetidas.

SELECT nombre FROM profesores

Para asegurar que el resultado es una relación en el sentido matemático, hay que utilizar el modificador DISTINCT.

SELECT DISTINCT nombre FROM profesores

SELECT Ai, Aj, ..., Ak FROM R

Por ejemplo, si tuviésemos la siguiente extensión de la tabla PROFESORES:

La selección permite elegir algunas tuplas

Los atributos de la selección son los mismos que los de la relación original, y todas las tuplas de la selección cumplen la condición C. Por ejemplo:

R := DEPARTAMENTOS(grado-experimentalidad >1.0)

Q := PROFESORES(no es-doctor y teléfono-móvil <> null)

En SQL, la selección se especifica mediante la cláusula WHERE. Por ejemplo:

SELECT * FROM DEPARTAMENTOS

WHERE grado-experimentalidad > 1.0

SELECT * FROM PROFESORES

WHERE not es doctor and teléfono-móvil IS NOT NULL.

La combinación o reunión (join) permite cruzar los valores de tablas relacionadas

Por ejemplo, si queremos obtener la información de profesores y departamentos combinada, utilizaremos como combinación la igualdad de la clave ajena en PROFESORES con la clave primaria en DEPARTAMENTOS:

DPT:=DEPARTAMENTOS

PROFESORES[D_nombre = DPT.nombre]DPT

En SQL, la combinación se hace incluyendo más de una relación en la cláusula FROM, y la condición C se coloca como cláusulaWHERE.

SELECT *

FROM PROFESORES AS P, DEPARTAMENTOS AS D

WHERE P.D_nombre = D.nombre

Operaciones fundamentales

Las operaciones selección, proyección y renombramiento se denominan operaciones unarias porque operan sobre una sola relación. Las otras tres operaciones operan sobre pares de relaciones y se denominan, por lo tanto, operaciones binarias.

La operación selección

La operación selección selecciona tuplas que satisfacen un predicado dado. Se utiliza la letra griega sigma minúscula (σ) para denotar la selección. El predicado aparece como subíndice de σ. La relación del argumento se da entre paréntesis a continuación de σ. Por tanto, para seleccionar las tuplas de la relación préstamo en que la sucursal es «Navacerrada» hay que escribir:

Si la relación préstamo es como se muestra a continuación:

En general, se permiten las comparaciones que utilizan =, ≠, o ≥ en el predicado de selección. Además, se pueden combinar varios predicados en uno mayor utilizando las conectivas y (∧) y o (∨). Por tanto, para encontrar las tuplas correspondientes a préstamos de más de 1.200 concedidos por la sucursal de Navacerrada, se escribe:

σnombre-sucursal = «Navacerrada» ∧ importe>1200 (préstamo)

la relación que resulta de la consulta anterior es:

σnombre-cliente = nombre-banquero (responsable-préstamo)

La operación proyección

La operación proyección permite producir esta relación. La operación proyección es una operación unaria que devuelve su relación de argumentos, excluyendo algunos argumentos. Dado que las relaciones son conjuntos, se eliminan todas las filas duplicadas. La proyección se denota por la letra griega mayúscula pi (Π).

Πnúmero-préstamo, importe (préstamo)

Composición de operaciones relacionales

Es importante el hecho de que el resultado de una operación relacional sea también una relación. Considérese la consulta más compleja «Encontrar los nombres de clientes que viven en Peguerinos». Hay que escribir:

Πnombre-cliente ( σciudad-cliente = «Peguerinos» (cliente))

La operación unión

Considérese una consulta para averiguar el nombre de todos los clientes del banco que tienen una cuenta, un préstamo o ambas cosas. Obsérvese que la relación cliente no contiene esa información:

Se conoce la manera de averiguar los nombres de todos los clientes con préstamos en el banco:

Πnombre-cliente (prestatario)

También se conoce la manera de averiguar el nombre de los clientes con cuenta en el banco:

Πnombre-cliente (impositor)

Πnombre-cliente (prestatario) ∪ Πnombre-cliente (impositor)

La operación diferencia de conjuntos

La operación diferencia de conjuntos, denotada por –, permite buscar las tuplas que estén en una relación pero no en la otra.

La expresión r – s da como resultado una relación que contiene las tuplas que están en r pero no en s. Se pueden buscar todos los clientes del banco que tienen abierta una cuenta pero no tienen concedido ningún préstamo escribiendo:

Πnombre-cliente (impositor) – Πnombre-cliente (prestatario)

Como en el caso de la operación unión, hay que asegurarse de que las diferencias de conjuntos se realicen entre relaciones compatibles. Por tanto, para que una operación diferencia de conjuntos r – s sea válida hay que exigir que las relaciones r y s sean de la misma aridad y que los dominios de los atributos i-ésimos de r y s sean iguales.

La operación producto cartesiano

La operación producto cartesiano, denotada por un aspa (×), permite combinar información de cualesquiera dos relaciones. El producto cartesiano de las relaciones r1 y r2 como r1 × r2. Recuérdese que las relaciones se definen como subconjuntos del producto cartesiano de un conjunto de dominios. A partir de esta definición ya se debe tener una intuición sobre la definición de la operación producto cartesiano

Ahora que se conoce el esquema de relación de r = prestatario × préstamo hay que averiguar las tuplas que aparecerán en r. Como se podía imaginar, se crea una tupla de r a partir de cada par de tuplas posible: una de la relación prestatario y otra de la relación préstamo.

σprestatario.número-préstamo = préstamo.número-préstamo ( σnombre-sucursal = «Navacerrada» (prestatario x préstamo))

Πnombre-cliente ( σprestatario.número-préstamo = préstamo.número-préstamo ( σnombre-sucursal = «Navacerrada» (prestatario x⋅ préstamo)))

La operación renombramiento

A diferencia de las relaciones de la base de datos, los resultados de las expresiones de álgebra relacional no tienen un nombre que se pueda utilizar para referirse a ellas.- Resulta útil poder ponerles nombre; el operador renombramiento, denotado por la letra griega rho minúscula (ρ), permite realizar esta tarea.

Paso 1: Para calcular la relación intermedia hay que comparar los valores de los saldos de todas las cuentas. Esta comparación se puede hacer calculando el producto cartesiano cuenta x cuenta y formando una selección para comparar el valor de cualesquiera dos saldos que aparezcan en una tupla. En primer lugar hay que crear un mecanismo para distinguir entre los dos atributos saldo. Se utilizará la operación renombramiento para cambiar el nombre de una referencia a la relación cuenta; así, se puede hacer referencia dos veces a la relación sin ambigüedad alguna.

La relación temporal que se compone de los saldos que no son el máximo

puede escribirse ahora como

Πcuenta.saldo ( σcuenta.saldo < d.saldo (cuenta ⋅ ρd (cuenta)))

Paso 2: La consulta para averiguar el máximo saldo de cuenta del banco puede escribirse de la manera siguiente:

Πsaldo (cuenta) – Πcuenta.saldo ( σcuenta.saldo < d.saldo (cuenta ⋅ ρd (cuenta)))

Considérese la siguiente consulta como un nuevo ejemplo de la operación renombramiento: «Averiguar los nombres de todos los clientes que viven en la misma calle y en la misma ciudad que Gómez». Se puede obtener la calle y la ciudad en la que vive Gómez escribiendo:

Πcalle-cliente, ciudad-cliente ( σnombre-cliente = «Gómez» (cliente))

Sin embargo, para hallar a otros clientes que vivan en esa calle y en esa ciudad hay que hacer referencia por segunda vez a la relación cliente. En la consulta siguiente se utiliza la operación renombramiento sobre la expresión anterior para darle al resultado el nombre dirección-Gómez y para cambiar el nombre de los atributos a calle y ciudad en lugar de calle-cliente y ciudad-cliente:

Πcliente.nombre-cliente ( σcliente.calle-cliente = dirección-Gómez.calle ∧

cliente.ciudad-cliente = dirección-Gómez.ciudad (cliente ⋅

ρdirección-Gómez (calle, ciudad) (Πcalle-cliente, ciudad-cliente

( σnombre-cliente = «Gómez» (cliente)))))

La operación reunión natural

Considérese la consulta «Hallar los nombres de todos los clientes que tienen concedido un préstamo en el banco y averiguar el importe del mismo». En primer lugar se calcula el producto cartesiano de las relaciones prestatario y préstamo. Luego, se seleccionan las tuplas que sólo atañen al mismo número préstamo, seguidas por la proyección de nombre-cliente, número-préstamo e importe resultantes

Πnombre-cliente, préstamo.número-préstamo, importe

( σprestatario.número-préstamo = préstamo.número-préstamo

(prestatario X préstamo))

Aunque la definición de la reunión natural es compleja, la operación es sencilla de aplicar. Como ilustración, considérese nuevamente el ejemplo «Averiguar los nombres de todos los clientes que tienen concedido un préstamo en el banco y averiguar su importe». Esta consulta puede expresarse utilizando la reunión natural de la manera siguiente:

Πnombre-cliente, número-préstamo, importe (prestatario préstamo)

La operación división

La operación división, denotada por , resulta adecuada para las consultas que incluyen la expresión «para todos». Supóngase que se desea hallar a todos los clientes que tengan abierta una cuenta en todas las sucursales ubicadas en la ciudad de Arganzuela. Se pueden obtener todas las sucursales de Arganzuela mediante la expresión:

r1 = Πnombre-sucursal ( σciudad-sucursal = «Arganzuela» (sucursal))

Se pueden encontrar todos los pares (nombre-cliente, nombre-sucursal) para los que el cliente tiene una cuenta en una sucursal escribiendo:

r2 = Πnombre-cliente, nombre-sucursal (impositor cuenta)

La operación que proporciona exactamente esos clientes es la operación división. La consulta se formula escribiendo:

Πnombre-cliente, nombre-sucursal (impositor cuenta)

Πnombre-sucursal ( σciudad-sucursal = «Arganzuela» (sucursal))

Operaciones de teoría de conjuntos

La unión de relaciones es la unión de conjuntos

La unión de dos relaciones devuelve una nueva relación que contiene todas las tuplas que aparecían en cualquiera de las relaciones originales, o en ambas.

Si tenemos dividida la información de los profesores antiguos y los nuevos en dos relaciones (por ejemplo, por motivos de rendimiento), pero queremos obtener un listado histórico de todos ellos, podemos utilizar el operador UNION de SQL.

SELECT * FROM PROFESORES

UNION

SELECT * FROM EX-PROFESORES

Así, la operación de unión de dos relaciones R y T, que denominaremos UNION(R, T) sólo se puede aplicar el operador unión a dos relaciones que tengan los mismos atributos, o que sean compatibles (es decir, que se pueda establecer una biyección entre los atributos de las dos relaciones).

La intersección de relaciones es la intersección de conjuntos

La intersección de relaciones toma dos relaciones y devuelve una relación con las tuplas que aparecían en ambas relaciones originales. Como la unión, la intersección solo puede aplicarse a relaciones con atributos compatibles.

La siguiente consulta en SQL por tanto debería devolver una relación vacía:

SELECT * FROM PROFESORES

INTERSECT

SELECT * FROM EX-PROFESORES

El producto cartesiano combina todas las tuplas de dos relaciones

El producto cartesiano es una operación que toma dos relaciones y obtiene una nueva relación cuyas tuplas son la concatenación de las tuplas de la primera relación con las tuplas de la segunda. En general, si la primera relación de entrada tenía N tuplas y la segunda M tuplas, el producto cartesiano produce N×M tuplas, aunque en ocasiones serán menos dado que las tuplas repetidas habrán de eliminarse.

SELECT * FROM PROFESORES, DEPARTAMENTOS

FUENTES DE INORMACION

El producto cartesiano de dos relaciones en SQL se obtiene simplemente colocando más de una tabla en la cláusula FROM.

El álgebra relacional se inspira en la teoría de conjuntos para especificar consultas en una base de datos relacional. ... Una característica destacable de todas las operaciones del álgebra relacional es que tanto los operandos como el resultado son relaciones. Esta propiedad se denomina cierre relacional.