En la sección previa (Formalidades del Modelo Relacional de Datos) definimos la noción matemática del modelo relacional. Ahora conocemos como los datos pueden almacenarse utilizando un modelo de datos relacional, pero no conocemos qué podemos hacer con todas estas tablas para recuperar algo desde esa base de datos todavía. Por ejemplo, alguien podría preguntar por los nombre de todos los proveedores que vendan el artículo 'tornillo'. Hay dos formas diferentes de notaciones para expresar las operaciones entre relaciones.
El Álgebra Relacional es una notación algebraica, en la cual las consultas se expresan aplicando operadores especializados a las relaciones.
El Cálculo Relacional es una notación lógica, donde las consultas se expresan formulando algunas restricciones lógicas que las tuplas de la respuesta deban satisfacer.
El Álgebra Relacional fue introducida por E.F.Codd en 1972. Consiste en un conjunto de operaciones con las relaciones.
SELECT (σ): extrae tuplas a partir de una relación que satisfagan una restricción dada. Sea R una tabla que contiene un atributo A. σA=a(R) = {t ∈ R ∣ t(A) = a} donde t denota una tupla de R y t(A) denota el valor del atributo A de la tupla t.
PROJECT (π): extrae atributos (columnas) específicos de una relación. Sea R una relación que contiene un atributo X. πX(R) = {t(X) ∣ t ∈ R}, donde t(X) denota el valor del atributo X de la tupla t.
PRODUCT (×): construye el producto cartesiano de dos relaciones. Sea R una tabla de rango (arity) k1 y sea S una tabla con rango (arity) k2. R × S es el conjunto de las k1 + k2-tuplas cuyos primeros k1 componentes forman una tupla en R y cuyos últimos k2 componentes forman una tupla en S.
UNION (∪): supone la unión de la teoría de conjuntos de dos tablas. Dadas las tablas R y S (y ambas deben ser del mismo rango), la unión R ∪ S es el conjunto de las tuplas que están en R S o en las dos.
INTERSECT (∩): Construye la intersección de la teoría de conjuntos de dos tablas. Dadas las tablas R y S, R ∪ S es el conjunto de las tuplas que están en R y en S>. De nuevo requiere que R y S tengan el mismo rango.
DIFFERENCE (− or ∖): supone el conjunto diferencia de dos tablas. Sean R y S de nuevo dos tablas con el mismo rango. R - S Es el conjunto de las tuplas que están en R pero no en S.
JOIN (∏): conecta dos tablas por sus atributos comunes. Sea R una tabla con los atributos A,B y C y sea S una tabla con los atributos C,D y E. Hay un atributo común para ambas relaciones, el atributo C. R ∏ S = πR.A,R.B,R.C,S.D,S.E(σR.C=S.C(R × S)). ¿Qué estamos haciendo aquí? Primero calculamos el producto cartesiano R × S. Entonces seleccionamos las tuplas cuyos valores para el atributo común C sea igual (σR.C = S.C). Ahora tenemos una tabla que contiene el atributo C dos veces y lo corregimos eliminando la columna duplicada.
Ejemplo 2. Una Inner Join (Una Join Interna)
Veamos las tablas que se han producido evaluando los pasos necesarios para una join. Sean las siguientes tablas dadas:
R A | B | C S C | D | E ---+---+--- ---+---+--- 1 | 2 | 3 3 | a | b 4 | 5 | 6 6 | c | d 7 | 8 | 9 |
Primero calculamos el producto cartesiano R × S y tendremos:
R x S A | B | R.C | S.C | D | E ---+---+-----+-----+---+--- 1 | 2 | 3 | 3 | a | b 1 | 2 | 3 | 6 | c | d 4 | 5 | 6 | 3 | a | b 4 | 5 | 6 | 6 | c | d 7 | 8 | 9 | 3 | a | b 7 | 8 | 9 | 6 | c | d |
Tras la selección σR.C=S.C(R × S) tendremos:
A | B | R.C | S.C | D | E ---+---+-----+-----+---+--- 1 | 2 | 3 | 3 | a | b 4 | 5 | 6 | 6 | c | d |
Para eliminar las columnas duplicadas S.C realizamos la siguiente operación: πR.A,R.B,R.C,S.D,S.E(σR.C=S.C(R × S)) y obtenemos:
A | B | C | D | E ---+---+---+---+--- 1 | 2 | 3 | a | b 4 | 5 | 6 | c | d |
DIVIDE (÷): Sea R una tabla con los atributos A, B, C, y D y sea S una tabla con los atributos C y D. Definimos la división como: R ÷ S = {t ∣ ∀ ts ∈ S ∃ tr ∈ R tal que tr(A,B)=t∧tr(C,D)=ts} donde tr(x,y) denota una tupla de la tabla R que consiste sólo en los componentes x y y. Nótese que la tupla t consiste sólo en los componentes A y B de la relación R.
Dadas las siguientes tablas
R A | B | C | D S C | D ---+---+---+--- ---+--- a | b | c | d c | d a | b | e | f e | f b | c | e | f e | d | c | d e | d | e | f a | b | d | e |
A | B ---+--- a | b e | d |
Para una descripción y definición más detallada del Álgebra Relacional diríjanse a [Ullman, 1988] o [Date, 1994].
Ejemplo 3. Una consulta utilizando Álgebra Relacional
Recalcar que hemos formulado todos estos operadores relacionales como capaces de recuperar datos de la base de datos. Volvamos a nuestro ejemplo de la sección previa (Operaciones en el Modelo de Datos Relacional) donde alguien quería conocer los nombres de todos los proveedores que venden el artículo Tornillos. Esta pregunta se responde utilizando el álgebra relacional con la siguiente operación:
πSUPPLIER.SNAME(σPART.PNAME='Tornillos'(SUPPLIER ∏ SELLS ∏ PART)) |
Llamamos a estas operaciones una consulta. Si evaluamos la consulta anterior contra las tablas de nuestro ejemplo (La Base de Datos de Proveedores y Artículos) obtendremos el siguiente ejemplo:
SNAME ------- Smith Adams |
El Cálculo Relacional se basa en la lógica de primer orden. Hay dos variantes del cálculo relacional:
El Cálculo Relacional de Dominios (DRC), donde las variables esperan componentes (atributos) de las tuplas.
El Cálculo Relacional de Tuplas The Tuple Relational Calculus (TRC), donde las variables esperan tuplas.
Expondremos sólo el cálculo relacional de tuplas porque es el único utilizado por la mayoría de lenguajes relacionales. Para una discusión detallada de DRC (y también de TRC) vea [Date, 1994] o [Ullman, 1988].
Las consultas utilizadas en TRC tienen el siguiente formato: x(A) ∣ F(x) donde x es una variable de tipo tupla, A es un conjunto de atributos y F es una fórmula. La relación resultante consiste en todas las tuplas t(A) que satisfagan F(t).
Si queremos responder la pregunta del ejemplo Una consulta utilizando Álgebra Relacional utilizando TRC formularemos la siguiente consulta:
{x(SNAME) ∣ x ∈ SUPPLIER ∧ \nonumber ∃ y ∈ SELLS ∃ z ∈ PART (y(SNO)=x(SNO) ∧ \nonumber z(PNO)=y(PNO) ∧ \nonumber z(PNAME)='Tornillos')} \nonumber |
Evaluando la consulta contra las tablas de La Base de Datos de Proveedores y Artículos encontramos otra vez el mismo resultado de Una consulta utilizando Álgebra Relacional.
El álgebra relacional y el cálculo relacional tienen el mismo poder de expresión; es decir, todas las consultas que se pueden formular utilizando álgebra relacional pueden también formularse utilizando el cálculo relacional, y viceversa. Esto fue probado por E. F. Codd en 1972. Este profesor se basó en un algoritmo ("algoritmo de reducción de Codd") mediante el cual una expresión arbitraria del cálculo relacional se puede reducir a la expresión semánticamente equivalente del álgebra relacional. Para una discusión más detallada sobre este punto, diríjase a [Date, 1994] y [Ullman, 1988].
Se dice a veces que los lenguajes basados en el cálculo relacional son de "más alto nivel" o "más declarativos" que los basados en el álgebra relacional porque el álgebra especifica (parcialmente) el orden de las operaciones, mientras el cálculo lo traslada a un compilador o interprete que determina el orden de evaluación más eficiente.