Categorieën: Alle - relaciones - división - álgebra - consultas

door JOSEPH ARTEAGA 4 jaren geleden

597

Álgebra Relacional

La operación de división en álgebra relacional es especialmente útil para consultas que requieren la expresión "para todos". Por ejemplo, para identificar a los clientes que tienen cuentas en todas las sucursales de una ciudad específica, se necesita utilizar esta operación.

Álgebra Relacional

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.

Álgebra Relacional

Operaciones de teoría de conjuntos

El producto cartesiano combina todas las tuplas de dos relaciones
El producto cartesiano de dos relaciones en SQL se obtiene simplemente colocando más de una tabla en la cláusula FROM.
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.

FUENTES DE INORMACION

SELECT * FROM PROFESORES, DEPARTAMENTOS

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.

INTERSECT

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

La unión de relaciones es la unión de conjuntos
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 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.

SELECT * FROM EX-PROFESORES

UNION

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.

La operación división

La operación que proporciona exactamente esos clientes es la operación división. La consulta se formula escribiendo:
Πnombre-sucursal ( σciudad-sucursal = «Arganzuela» (sucursal))
Πnombre-cliente, nombre-sucursal (impositor cuenta)
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 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))

La operación reunión natural

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)
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
(prestatario X préstamo))
( σprestatario.número-préstamo = préstamo.número-préstamo
Πnombre-cliente, préstamo.número-préstamo, importe

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.
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:

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

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

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

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

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))

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)))

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.

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

puede escribirse ahora como

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

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 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 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:
Πnombre-cliente (prestatario) ∪ Πnombre-cliente (impositor)
Πnombre-cliente (impositor)
También se conoce la manera de averiguar el nombre de los clientes con cuenta en el banco:
Πnombre-cliente (prestatario)
Se conoce la manera de averiguar los nombres de todos los clientes con préstamos en el banco:

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 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:
la relación que resulta de la consulta anterior es:

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

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

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

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:

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.

Operaciones específicamente relacionales

La combinación o reunión (join) permite cruzar los valores de tablas relacionadas
WHERE P.D_nombre = D.nombre
FROM PROFESORES AS P, DEPARTAMENTOS AS D
SELECT *
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.
PROFESORES[D_nombre = DPT.nombre]DPT
DPT:=DEPARTAMENTOS
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:
La selección permite elegir algunas tuplas
WHERE not es doctor and teléfono-móvil IS NOT NULL.
SELECT * FROM PROFESORES
WHERE grado-experimentalidad > 1.0
SELECT * FROM DEPARTAMENTOS
En SQL, la selección se especifica mediante la cláusula WHERE. Por ejemplo:
Q := PROFESORES(no es-doctor y teléfono-móvil <> null)
R := DEPARTAMENTOS(grado-experimentalidad >1.0)
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:
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.

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

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

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.

SELECT DISTINCT nombre FROM profesores

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

SELECT nombre FROM profesores

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

SELECT nombre, apellidos FROM PROFESORES

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

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

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

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

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

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

¿Por qué estudiar el álgebra relacional?

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