next up previous contents
Next: Cálculo relacional Up: Lenguajes relacionales Previous: Lenguajes relacionales   Índice General

Álgebra relacional

El álgebra relacional es un lenguaje formal con una serie de operadores que trabajan sobre una o varias relaciones para obtener otra relación resultado, sin que cambien las relaciones originales. Tanto los operandos como los resultados son relaciones, por lo que la salida de una operación puede ser la entrada de otra operación. Esto permite anidar expresiones del álgebra, del mismo modo que se pueden anidar las expresiones aritméticas. A esta propiedad se le denomina clausura: las relaciones son cerradas bajo el álgebra, del mismo modo que los números son cerrados bajo las operaciones aritméticas.

En este apartado se presentan los operadores del álgebra relacional de un modo informal. Las definiciones formales pueden encontrarse en la bibliografía que se comenta al final del capítulo. Primero se describen los ocho operadores originalmente propuestos por Codd y después se estudian algunos operadores adicionales que añaden potencia al lenguaje.

De los ocho operadores, sólo hay cinco que son fundamentales: restricción, proyección, producto cartesiano, unión y diferencia, que permiten realizar la mayoría de las operaciones de obtención de datos. Los operadores no fundamentales son la concatenación (join), la intersección y la división, que se pueden expresar a partir de los cinco operadores fundamentales.

La restricción y la proyección son operaciones unarias porque operan sobre una sola relación. El resto de las operaciones son binarias porque trabajan sobre pares de relaciones. En las definiciones que se presentan a continuación, se supone que R y S son dos relaciones cuyos atributos son A=(a$_1$, a$_2$, ..., a$_N$) y B=(b$_1$, b$_2$, ..., b$_M$) respectivamente.

Restricción
: R WHERE condición
La restricción, también denominada selección, opera sobre una sola relación R y da como resultado otra relación cuyas tuplas son las tuplas de R que satisfacen la condición especificada. Esta condición es una comparación en la que aparece al menos un atributo de R, o una combinación booleana de varias de estas comparaciones.

Ejemplo 4.1   Obtener todos los empleados con un salario anual superior a 15.000 euros.

PLANTILLA WHERE salario>15000

Enum Nombre Apellido Dirección Teléfono Puesto Fecha_nac Salario DNI Onum
EL21 Amelia Pastor Magallanes, 15 964 284 560 Director 12/10/62 30000 39432212E O5
Castellón
EG37 Pedro Cubedo Bayarri, 11 964 535 690 Supervisor 24/3/57 18000 38766623X O3
Villarreal
EA9 Rita Renau Casalduch, 32 964 257 550 Supervisor 19/5/60 18000 39233190F O7
Castellón
EG5 Julio Prats Melilla, 23 964 524 590 Director 19/12/50 24000 25644309X O3
Villarreal
EL41 Carlos Baeza Herrero, 51 964 247 250 Supervisor 29/2/67 18000 39552133T O5
Castellón

Ejemplo 4.2   Obtener todos los inmuebles de Castellón con un alquiler mensual de hasta 350 euros.

INMUEBLE WHERE población=`Castellón' AND alquiler<=350

Inum Calle Area Población Tipo Hab Alquiler Pnum
IL94 Riu Ebre, 24 Ronda Sur Castellón Piso 4 350 P87
IG4 Sorell, 5 Grao Castellón Piso 3 300 P40
IG36 Alicante,1 Segorbe Piso 3 325 P93

Proyección
: R[a$_i$, ..., a$_k$]
La proyección opera sobre una sola relación R y da como resultado otra relación que contiene un subconjunto vertical de R, extrayendo los valores de los atributos especificados y eliminando duplicados.

Ejemplo 4.3   Obtener un listado de empleados mostrando su número, nombre, apellido y salario.

PLANTILLA [enum,nombre,apellido,salario]

Enum Nombre Apellido Salario
EL21 Amelia Pastor 30000
EG37 Pedro Cubedo 18000
EG14 Luis Collado 12000
EA9 Rita Renau 18000
EG5 Julio Prats 24000
EL41 Carlos Baeza 18000

Ejemplo 4.4   Obtener los distintos puestos que pueden ocupar los empleados.

PLANTILLA [puesto]

Puesto
Director
Supervisor
Administ.

Producto cartesiano
: R TIMES S
El producto cartesiano obtiene una relación cuyas tuplas están formadas por la concatenación de todas las tuplas de R con todas las tuplas de S.

La restricción y la proyección son operaciones que permiten extraer información de una sola relación. Habrá casos en que sea necesario combinar la información de varias relaciones. El producto cartesiano ``multiplica" dos relaciones, definiendo una nueva relación que tiene todos los pares posibles de tuplas de las dos relaciones. Si la relación R tiene $P$ tuplas y $N$ atributos y la relación S tiene $Q$ tuplas y $M$ atributos, la relación resultado tendrá $P * Q$ tuplas y $N + M$ atributos. Ya que es posible que haya atributos con el mismo nombre en las dos relaciones, el nombre de la relación se antepondrá al del atributo en este caso para que los nombres de los atributos sigan siendo únicos en la relación resultado.

Ejemplo 4.5   Obtener los nombres de los inquilinos y los comentarios que éstos han realizado cuando han visto algún inmueble.

INQUILINO[qnum,nombre,apellido] TIMES VISITA[qnum,inum,comentario]
INQUILINO.Qnum Nombre Apellido VISITA.Qnum Inum Comentario
Q76 Juan Felip Q56 IA14 muy pequeño
Q76 Juan Felip Q76 IG4 muy lejos
Q76 Juan Felip Q56 IG4
Q76 Juan Felip Q62 IA14 no tiene salón
Q76 Juan Felip Q56 IG36
Q56 Ana Grangel Q56 IA14 muy pequeño
Q56 Ana Grangel Q76 IG4 muy lejos
Q56 Ana Grangel Q56 IG4
Q56 Ana Grangel Q62 IA14 no tiene salón
Q56 Ana Grangel Q56 IG36
Q74 Elena Abaso Q56 IA14 muy pequeño
Q74 Elena Abaso Q76 IG4 muy lejos
Q74 Elena Abaso Q56 IG4
Q74 Elena Abaso Q62 IA14 no tiene salón
Q74 Elena Abaso Q56 IG36
Q62 Alicia Mori Q56 IA14 muy pequeño
Q62 Alicia Mori Q76 IG4 muy lejos
Q62 Alicia Mori Q56 IG4
Q62 Alicia Mori Q62 IA14 no tiene salón
Q62 Alicia Mori Q56 IG36

Como se puede observar, la relación resultado contiene más información de la que se necesita. Por ejemplo, la primera tupla tiene distintos números de inquilino: el comentario realizado en la visita no corresponde al inquilino cuyo nombre y apellido se muestra. Para obtener el listado que se pide en el ejemplo, es necesario realizar una restricción para quedarse solamente con las tuplas en donde INQUILINO.Qnum = VISITA.Qnum.

(INQUILINO[qnum,nombre,apellido] TIMES VISITA[qnum,inum,comentario])
WHERE inquilino.qnum=visita.qnum

El resultado de esta operación se muestra a continuación.

INQUILINO.Qnum Nombre Apellido VISITA.Qnum Inum Comentario
Q76 Juan Felip Q76 IG4 muy lejos
Q56 Ana Grangel Q56 IA14 muy pequeño
Q56 Ana Grangel Q56 IG4
Q56 Ana Grangel Q56 IG36
Q62 Alicia Mori Q62 IA14 no tiene salón

La combinación del producto cartesiano y la restricción del modo en que se acaba de realizar, se puede reducir a la operación de concatenación ( join) que se presenta más adelante.

Unión
: R UNION S
La unión de dos relaciones R y S, con $P$ y $Q$ tuplas respectivamente, es otra relación que tiene como mucho $P + Q$ tuplas siendo éstas las tuplas que se encuentran en R o en S o en ambas relaciones a la vez. Para poder realizar esta operación, R y S deben ser compatibles para la unión.

Se dice que dos relaciones son compatibles para la unión si ambas tienen la misma cabecera, es decir, si tienen el mismo número de atributos y éstos se encuentran definidos sobre los mismos dominios. En muchas ocasiones será necesario realizar proyecciones para hacer que dos relaciones sean compatibles para la unión.

Ejemplo 4.6   Obtener un listado de las áreas en las que hay oficinas o inmuebles para alquilar.

OFICINA[área] UNION INMUEBLE[área]

Area
Centro
Grao
Ronda Sur
Rafalafena

Diferencia
: R MINUS S
La diferencia obtiene una relación que tiene las tuplas que se encuentran en R y no se encuentran en S. Para realizar esta operación, R y S deben ser compatibles para la unión.

Ejemplo 4.7   Obtener un listado de todas las poblaciones en donde hay una oficina y no hay inmuebles para alquilar.

OFICINA[población] MINUS INMUEBLE[población]

Población
Villarreal

Concatenación (Join)
: R JOIN S
La concatenación de dos relaciones R y S obtiene como resultado una relación cuyas tuplas son todas las tuplas de R concatenadas con todas las tuplas de S que en los atributos comunes (que se llaman igual) tienen los mismos valores. Estos atributos comunes aparecen una sola vez en el resultado.

Ejemplo 4.8   Obtener los nombres y los comentarios que los inquilinos han realizado cuando han visto algún inmueble.

INQUILINO JOIN VISITA

Esta expresión obtiene el mismo resultado que la expresión final del ejemplo 4.5, ya que la concatenación es, en realidad, un producto cartesiano y una restricción de igualdad sobre los atributos comunes.

Concatenación externa (Outer-join)
: R JOIN S (+)
La concatenación externa es una concatenación en la que las tuplas de R que no tienen valores en común con ninguna tupla de S, también aparecen en el resultado.

Ejemplo 4.9   Obtener un listado de todos los inmuebles y las visitas que han tenido.

INMUEBLE JOIN VISITA (+)

Inum Calle Población Qnum Fecha Comentario
IA14 Enmedio, 128 Castellón Q56 24/11/99 muy pequeño
IA14 Enmedio, 128 Castellón Q62 14/11/99 no tiene salón
IL94 Riu Ebre, 24 Castellón
IG4 Sorell, 5 Castellón Q76 20/10/99 muy lejos
IG4 Sorell, 5 Castellón Q56 26/11/99
IG36 Alicante,1 Segorbe Q56 28/10/99
IG21 San Francisco, 10 Vinaroz
IG16 Capuchinos, 19 Castellón

La expresión S (+) JOIN R es equivalente a R JOIN S (+). Cuando en ambas relaciones hay tuplas que no se pueden concatenar y se desea que en el resultado aparezcan también todas estas tuplas (tanto las de una relación como las de la otra), se utiliza la concatenación externa completa: R (+) JOIN S (+)

Intersección
: R INTERSECT S
La intersección obtiene como resultado una relación que contiene las tuplas de R que también se encuentran en S. Para realizar esta operación, R y S deben ser compatibles para la unión.

La intersección se puede expresar en términos de diferencias:

R INTERSECT S = R MINUS (R MINUS S)

División
: R DIVIDEBY S
Suponiendo que la cabecera de R es el conjunto de atributos A y que la cabecera de S es el conjunto de atributos B, tales que B es un subconjunto de A, y si C = A - B (los atributos de R que no están en S), la división obtiene una relación cuya cabecera es el conjunto de atributos C y que contiene las tuplas de R que están acompañadas de todas las tuplas de S.

Ejemplo 4.10   Obtener los inquilinos que han visitado todos los inmuebles de tres habitaciones.

VISITA[qnum,inum] DIVIDEBY (INMUEBLE WHERE hab=3)[inum]

Qnum
Q56

Además de las operaciones que Codd incluyó en el álgebra relacional, otros autores han aportado otras operaciones para dar más potencia al lenguaje. Es de especial interés la agrupación, también denominada resumen, que añade capacidad computacional al álgebra.

Agrupación
: SUMMARIZE R GROUPBY(a$_i$,...,a$_k$) ADD cálculo AS atributo
Esta operación agrupa las tuplas de R que tienen los mismos valores en los atributos especificados y realiza un cálculo sobre los grupos obtenidos. La relación resultado tiene como cabecera los atributos por los que se ha agrupado y el cálculo realizado, al que se da el nombre especificado en atributo.

Los cálculos que se pueden realizar sobre los grupos de filas son: suma de los valores de un atributo ( SUM(a$_p$)), media de los valores de un atributo ( AVG(a$_p$)), máximo y mínimo de los valores de un atributo ( MAX(a$_p$), MIN(a$_p$)) y número de tuplas en el grupo ( COUNT(*)). La relación resultado tendrá tantas filas como grupos se hayan obtenido.

Ejemplo 4.11   Obtener el salario total que se gasta en los empleados de cada oficina.

SUMMARIZE PLANTILLA GROUPBY(oficina) ADD SUM(salario) AS salario_total

Oficina Salario_total
O5 48000
O3 54000
O7 18000

next up previous contents
Next: Cálculo relacional Up: Lenguajes relacionales Previous: Lenguajes relacionales   Índice General
María Mercedes Marqués Andrés
2001-02-12