El Álgebra Relacional es un conjunto de operaciones que describen el resultado de realizar una consulta en una base de datos relacional.
El Álgebra Relacional tiene como base la teoría de conjuntos, es decir, no permite múltiples ocurrencias ni orden.
Se redefinen los operadores del Álgebra relacional a través de operaciones sobre listas de tuplas en vez de conjuntos de tuplas.
Se usa la notación de Haskell.
Una tabla tiene [nombre], campos y valores. Los campos son nombres y tipo t.
campo1 :: t1 | campo2 :: t2 | ... | campoN :: tN |
---|---|---|---|
v11 | v12 | ... | v1N |
v21 | v22 | ... | v2N |
... | ... | ... | ... |
vM1 | vM2 | ... | vMN |
EL encabezado de la tabla es lo que llamamos esquema
R ::= nombre (campo1 :: t1, campo2 :: t2, ... , campoN :: tN)
Una tabla es un esquema y una lista de tuplas que respetan ese esquema.
Cada tupla de tabla tiene como tipo
-
$_ :: \tau$ - denota un campo cuyo nombre no importa o es anónimo.
-
$\text{nombre} :: R$ - denota una tabla <nombre> con esquema R.
-
$\tau \in nombre$ - Denota a una tupla de la tabla nombre, donde
$\tau$ representa un registro en la tabla.
- Denota a una tupla de la tabla nombre, donde
Sea
Permiten hacer consultas a una base de datos.
Sean
Es habitual que queramos extraer una cierta columna de una tabla, con lo que daremos un nombre especial a estas funciones:
Diremos que una función
Aplicar la selección a predicados.
Los predicados básicos se pueden combinar usando conectivos booleanos.
El conjunto de conectivos que consideramos es:
Definición El operador de selección se define recursivamente como sigue:
Ejemplo:
Sean los esquemas:
Entonces, el esquema del producto cartesiano es:
$$r \times s :: (n_{1}::\tau_{1}, ..., n_{N}:: \tau_{N}, n'{1} :: \tau'{1}, ..., n'{M} :: \tau'{M})$$
- Si hay conflictos de nombres de atributos se usa el nombre de la tabla para desambiguar. Si la tabla no tiene nombre, se usa
$_:T$ .
-- Producto cartesiano
[] x s = []
(t : r) x s = anexar s t (r x s)
-- Concatenación de tuplas ;
t = (a1, ..., aN)
t' = (b1, ..., bM)
(t; t') = (a1, ..., aN, b1, ..., bM)
-- Anexar
anexar s t q = (map (\t' -> t; t') s) ++ q
Es la operación de combinar tablas por atributos. Como un inner join con using. Por ejemplo:
$$\Pi_{\text{nombre, apellido, DNI}}(\text{persona}{\text{DNI}} \bowtie{\text{DNI}} \text{bibliotecario})$$ Es equivalente a
La reunión selectiva se puede definir como:
$$ r_{a_{1},..., a_{i}} \bowtie {b{1}, ..., b_{i}} s = \Pi_{n_{1}, ..., n_{N}, c_{1}, ..., c_{M-i} ( \sigma_{a_{1} = b_{1} \land ... \land a_{i} = b_{i}} \ (r \times s)} ) $$
Se aplica reunión selectiva a todos los atributos con el mismo nombre en las dos tablas.
$$ r \bowtie s = r_{a_{1},..., a_{i}} \bowtie {a{1}, ..., a_{i}} s $$
Donde
Los esquemas de los operandos deben ser compatibles (mismo tipo).
[] ++ s = s
(t:r) ++ s = t: (r ++ s)
Los esquemas de las tablas deben ser compatibles (mismo tipo).
El esquema de la resta es el del primer operando.
Los esquemas de las tablas deben ser compatibles (mismos tipos).
El esquema de la intersección es el del primer operando
- Usamos el operador let.
- Funciona como el let ... in de haskell
La operación de remoción de duplicados se define recursivamente de la siguiente manera:
V [] = []
V (t:v) = if t ∊ r then V(r) else t : V(r)
Especificamos ordenamiento como insertion sort.
La función instert
inserta la tupla t en la tabla r en la posición que le corresponde: a la izquierda las tuplas menores y a la derecha las mayores.
$$\text{insert}{a{1}, ... a_{N}} \text{t r} = \sigma_{(a_{1}, ..., a_{N}) < t[a_{1}, ..., a_{N}]} ++ [t] ++ \sigma_{(a_{1}, ..., a_{N}) \ge ta_{1}, ..., a_{N}} $$
$O_{a_{1}, ..., a_{N}} = \text{insert}{a{1}, ..., a_{N}}(x, O_{a_{1}, ..., a_{N}}(R))$
$O^{>}{a{1}, ..., a_{N}}(r) = \text{reverse}(O_{a_{1},...,a_{N}}(r))$
reverse [] = []
reverse (x:xs) = reverse xs ++ [x]
Son las siguientes funciones sobre listas:
count :: [a] -> Integer -- para contar la cantidad de elementos en la lista
sum :: Num a => [a] -> Integer -- para sumar los valores (deben ser numéricos)
avg :: Num a => [a] -> Float -- para promediar los valores (deben ser numéricos)
min :: Ord a => [a] -> a -- para obtener el mínimo valor en la lista
max :: Ord a => [a] -> a -- para obtener el máximo valor en la lista
Una función de agregación se aplica a una lista de elementos y no a una lista de tuplas.
Definimos la agregación como:
$\Upsilon_{f_1(a_1), ..., f_m(a_m)} (r) :: (_:: τ'_1 ,..., _ ::τ'm)$
$\Upsilon{f_1(a_1), ..., f_m(a_m)} (r) = [ (f_1 (\text{map} (\backslash t → t.a_1 ) r), ..., f_m (\text{map} (\backslash t → t.a_m ) r)]$
Donde
Dada la tabla instructor(ID, name, dept_name, salary)
, existe la notación: ${ }\text{dept_name} \Upsilon{avg(\text{salary})} (\text{instructor})$ que denota el salario promedio de cada departamento (se agrupa por los valores iguales en dept_name)
Las siguientes expresiones son equivalentes:
SELECT A1, ..., An
FROM r1, ..., rn
WHERE P