4. Algebra relacional

4.1 Introducción

En las secciones anteriores se han estudiado las maneras de modelar información de manera "relacional" empleando el concepto de entidades que se relacionan entre sí.

Esta sección presenta la manera de hacer consultas a una base de datos empleando algunos conceptos matemáticos aplicados a un esquema relacional. Los lenguajes que se analizan más adelante se derivan precisamente del algebra relacional.

El álgebra relacional consiste de algunas simples pero poderosas maneras de construir nuevas relaciones a partir de otras. Si pensamos que las relaciones iniciales son los datos almacenados entonces las nuevas relaciones se pueden ver como respuestas a algunas consultas deseadas.

4.2 Conjunto de operaciones en relaciones

  • R S, la unión de R y S es el conjunto de elementos que están en R o S o ambos. Un elemento solo aparece una sola vez.

  • R S, el conjunto de elementos que aparecen en ambos R y S

  • R - S, la diferencia de R y S, el conjunto de elementos que estan en R pero no en S. Es importante resaltar que R - S es diferente a S - R.
  • R / S, la división de una relación entre otra, debe cumplirse que para toda tupla en R exista su correspondiente en S.

Restricciones:

  1. R y S deben tener esquemas idénticos.
  2. El orden de las columnas debe ser el mismo

Ejemplos:

name address gender birthdate
Carrie Fisher 123 Maple St. F 9/9/99
Mark Hamill 456 Oak Rd. M 8/8/88

 

name address gender birthdate
Harrison Ford 789 Palm Dr. M 7/7/77
Carrie Fisher 123 Maple St. F 9/9/99

Unión

name address gender birthdate
Harrison Ford 789 Palm Dr. M 7/7/77
Mark Hamill 456 Oak Rd. M 8/8/88
Carrie Fisher 123 Maple St. F 9/9/99

Intersección

name address gender birthdate
Carrie Fisher 123 Maple St. F 9/9/99

Resta

name address gender birthdate
Mark Hamill 456 Oak Rd. M 8/8/88

4.3 Proyección

  • Crea una nueva relación a partir de otra, pero incluyendo sólo algunas de las columnas
  • A1,A3,A6 (R)

 

title
year
length
filmType
studioName
Star Wars
1977
124
color
Fox
Mighty Ducks
1991
104
color
Disney
Wayne's World
1992
95
color
Paramount

Movie

Ejemplo:

title,year,length(Movie)

title
year
length
Star Wars
1977
124
Mighty Ducks
1991
104
Wayne's World
1992
95

filmType(Movie)

filmType
color

 

4.4 Selección

  • Crea una nueva relación a partir de otra, pero incluyendo sólo algunas de las tuplas a partir de un criterio dado.
  • El criterio se basa en restricciones sobre los atributos de la relación R y no pueden incluirse otras relaciones en dicho criterio que no esten en R
  • A3>16 (R) , A3>16 and A3 < 45 (R), nombre='Carlos' and edad=45 (R)
title
year
length
filmType
studioName
Star Wars
1977
124
color
Fox
Mighty Ducks
1991
104
color
Disney
Wayne's World
1992
95
color
Paramount

Movie

Ejemplos:

length>=100 (Movie)

title
year
length
filmType
studioName
Star Wars
1977
124
color
Fox
Mighty Ducks
1991
104
color
Disney

length>=100 and studioName='Fox' (Movie)

title
year
length
filmType
studioName
Star Wars
1977
124
color
Fox

 

title,studioName( length>=100 (Movie))

title
studioName
Star Wars
Fox
Mighty Ducks
Disney

4.5 Asignación <--

Almacena temporalmente el resultado de un operación en un relación dada

LOLO <-- title,studioName( length>=100 (Movie))

4.6 División

Sean

A B C D
a b c d
a b e f
b c e f
e d c d
e d e f
a b d e

R

C D
c d
e f

S

 

A B
a b
e d

R / S

Ejemplo: Estudiantes que han tomado todos los cursos de "IS"

ID,num ( depto='IS' (estudiante_cursos)) / num( depto='IS'(cursos))

 

4.7 Producto cartesiano X

Producto cruz o solo producto

R X S, los esquemas de ambas relaciones se mezclan y unen.

Dados

A B
1 2
3 4

R

B C D
2 5 6
4 7 8
9 10 11

S

A R.B S.B C D
1 2 2 5 6
1 2 4 7 8
1 2 9 10 11
3 4 2 5 6
3 4 4 7 8
3 4 9 10 11

R X S

4.8 Producto natural |X|

Es un producto cartesiano donde nos interesan únicamente algunas tuplas que hacen "match" en algun criterio.

A R.B S.B C D
1 2 2 5 6
1 2 4 7 8
1 2 9 10 11
3 4 2 5 6
3 4 4 7 8
3 4 9 10 11

 

A B C D
1 2 5 6
3 4 7 8

R |X| S

4.9 Outer Join

El outer join es una extensión del join para lidear con información no existente. Exiten 3 tipos, izquierdo, derecho y completo.

employee-name street city
Coyote Toon Hollywood
Rabbit Tunnel Carrotville
Smith Revolver Death Valley
Williams Seaview Seattle

employee
employee-name branch-name salary
Coyote Mesa 1500
Rabbit Mesa 1300
Gates Redmond 5300
Williams Redmond 1500

ft-works

employee-name street city branch-name salary
Coyote Toon Hollywood Mesa 1500
Rabbit Tunnel Carrotville Mesa 1300
Williams Seaview Seattle Redmond 1500

|X|

4.9.1 Left Outer Join

employee-name street city branch-name salary
Coyote Toon Hollywood Mesa 1500
Rabbit Tunnel Carrotville Mesa 1300
Williams Seaview Seattle Redmond 1500
Smith Revolver Death Valley null null

4.9.2 Right Outer Join

employee-name street city branch-name salary
Coyote Toon Hollywood Mesa 1500
Rabbit Tunnel Carrotville Mesa 1300
Williams Seaview Seattle Redmond 1500
Gates null null Redmond 5300

4.9.3 Full Outer Join

employee-name street city branch-name salary
Coyote Toon Hollywood Mesa 1500
Rabbit Tunnel Carrotville Mesa 1300
Williams Seaview Seattle Redmond 1500
Smith Revolver Death Valley null null
Gates null null Redmond 5300

4.10 Combinación de operaciones

Cuáles son los títulos y años de las películas hechas por Fox y que tengan al menos 100 minutos de duración.

1. Seleccionar aquellas películas que tienen length >=100

length>=100 (Movie)

2. Seleccionar aquellas películas que tienen studioName='Fox'

studioName='Fox' (Movie)

3. Calcular la intersección de (1) y (2)

length>=100 studioName='Fox' (Movie)

4. Proyectar únicamente title y year

title,studioName ( length>=100 studioName='Fox' (Movie) )

Problema:

Dadas las 2 relaciones siguientes, indique un query en algebra relacional para encontrar los nombres de las estrellas que trabajan en películas cuya duración sera mayor o igual que 100.

Movie (title,year,length,filmType,studioName)

Movie_star(title,year,starName)

 

starName ( length>=100 (Movie |X| Movie_star)

4.11 Renombramiento

Renombrar una relación para facilitar la interacción con otras

s (R)

Ej.
t.nombre ( s.nombre='carlos' and t.curso='IS341' ( s (PROFE) X t (CURSO) ) )

Renombrar un atributo

Suponiendo   R (A,B,C)

R(A,X,C) (R) s(A,X,C) (R) A, B as X, C (R) B as X (R)
= R(A,X,C) = S(A,X,C) = R(A,X,C) = R(X)

4.12 Modificaciones a la base de datos

4.12.1 Eliminación

r <-- r - E

depositor <-- depositor - customer-name='Smith'(depositor)

4.12.2 Inserción

r <-- r E

account <-- account {(A-973, "Perryridge", 1200)}

4.12.3 Actualización

r <-- F1,F2,....Fn(r)

account <-- account-number, branch-name, balance*1.05 (account)

Si sólo queremos actualizar algunas tuplas:

r <-- F1,F2...Fn ( P(r)) ( r - P(r))

Suponiendo que se desea que las cuentas con balance superior a $ 10,000 reciban un aumento del 6% y que todas las demas solo el 5%

account <-- AN, BN, balance*1.06 ( balance > 10000 (account))
                   AN,BN, balance*1.05 ( balance <= 10000 (account))

4.13 Operaciones dependientes e independientes

R S = R - ( R - S )

R |X| S = L ( c ( R X S ) )

4.14 Operadores Extendidos

No son parte del estándar del Algebra Relacional, pero al ser incluídos en los lenguajes de consulta más populares se han introducido como una extensión.

4.14.1 Eliminación de duplicidad

A B
1 2
3 4
1 2
1 2

 

(R)

A B
1 2
3 4

 

4.14.2 Operadores de agregación

A B
1 2
3 4
1 2
1 2

 

  • SUM(B)= 10
  • AVG(A)= 1.5
  • MIN(A)=1
  • MAX(B)=4
  • COUNT(A)=4

Es importante resaltar que estos operadores nunca devuelven un "valor" sino una relación conteniendo el valor.

SUM(B)
10

SUM(B) (R)

4.14.3 Agrupación

A B
1 2
3 4
1 2
2 8
1 2
2 6

 

A SUM(B)
1 6
3 4
2 14

A, SUM(B) (R)

 

4.14.4 Ordenamiento

A4,A5 (R)

A SUM(B)
1 6
2 14
3 4

A (A, SUM(B)(R))

4.15 Otros lenguajes de consulta

4.15.1 Cálculo relacional de tuplas

account-number branch-name balance
A-101 Downtown 500
A-102 Perryridge 400
A-201 Brighton 900
A-215 Mianus 700
A-217 Brighton 750
A-222 Redwood 700
A-305 Round Hill 350

account

branch-name branch-city assets
Brighton Brooklyn 7100000
Downtown Brooklyn 9000000
Mianus Horseneck 400000
North Town Rye 3700000
Perryridge Horseneck 1700000
Pownal Bennington 300000
Redwood Palo Alto 2100000
Round Hill Horseneck 8000000

branch

customer-name customer-street customer-city
Adams Spring Pittsfield
Brooks Senator Brooklyn
Curry North Rye
Glenn Walnut Stamford
Hayes Main Harrison
Johnson Alma Palo Alto

customer

customer-name account-number
Hayes A-102
Johnson A-101
Johnson A-201
Jones A-217
Lindsay A-222
Smith A-215
Turner A-305

depositor
loan-number branch-name amount
L-11 RoundHill 900
L-14 Downtown 1500
L-15 Perryridge 1500
L-16 Perryridge 1300
L-17 Downtown 1000
L-23 Redwood 2000
L-93 Mianus 500
null null 1900

loan
customer-name loan-number
Adams L-16
Curry L-93
Hayes L-15
Jackson L-14
Jones L-17
Smith L-11
Smith L-23
Williams L-17
Johnson null

borrower

 

  • Encontrar branch-name, loan-number and amount para los préstamos superiores a $1,200

    { t | t loan ^ t [amount] > 1200 }

  • Encontrar el loan-number de cada préstamo cuyo monto sea mayor a $1,200

    { t | s loan ( t [loan-number] = s [loan-number] ^s [amount] > 1200) }

  • Encontrar los nombres de los clientes que tienen un préstamos de la sucursal Perryridge

    { t | s borrower (t [customer-name] = s [customer-name] ^
            u loan ( u[loan-number] = s[loan-number] ^
                              u[branch-name]="Perryridge" ) ) }

  • Encontrar todos los clientes que tienen un préstamo, cuenta, o ambos en el banco.

    { t | s borrower ( t [customer-name] = s [customer-name] )
            v u depositor ( t[customer-name] = u[customer-name] ) }

  • Encontrar todos los clientes que tienen una cuenta en el banco pero no tienen ningún préstamo.

    { t | u depositor ( t[customer-name] = u [customer-name] ) ^
           ¬ s borrower ( t[customer-name] = s[customer-name] ) }

  • También es posible usar el símbolo "para todo" junto con una implicación P-->Q donde si P es verdadero, Q también deberá serlo.

Encontrar todos los clientes que tienen una cuenta en todas las sucursales localizadas en Brooklyn

    { t | r customer ( r[customer-name] = t [customer-name]) ^
               ( u branch ( u[branch-city]= "Brooklyn" -->
                                        s depositor ( t[customer-name] = u [customer-name] ) ^
                                      w account ( w[account-number] = s[account-number] ^
                                                               w[branch-name] = u[branch-name] )))) }

  • Expresiones inseguras
  • { t | ¬ ( t loan ) }

4.15.2 Cálculo relacional de dominios

account-number branch-name balance
A-101 Downtown 500
A-102 Perryridge 400
A-201 Brighton 900
A-215 Mianus 700
A-217 Brighton 750
A-222 Redwood 700
A-305 Round Hill 350

account

branch-name branch-city assets
Brighton Brooklyn 7100000
Downtown Brooklyn 9000000
Mianus Horseneck 400000
North Town Rye 3700000
Perryridge Horseneck 1700000
Pownal Bennington 300000
Redwood Palo Alto 2100000
Round Hill Horseneck 8000000

branch

customer-name customer-street customer-city
Adams Spring Pittsfield
Brooks Senator Brooklyn
Curry North Rye
Glenn Walnut Stamford
Hayes Main Harrison
Johnson Alma Palo Alto

customer

customer-name account-number
Hayes A-102
Johnson A-101
Johnson A-201
Jones A-217
Lindsay A-222
Smith A-215
Turner A-305

depositor
loan-number branch-name amount
L-11 RoundHill 900
L-14 Downtown 1500
L-15 Perryridge 1500
L-16 Perryridge 1300
L-17 Downtown 1000
L-23 Redwood 2000
L-93 Mianus 500
null null 1900

loan
customer-name loan-number
Adams L-16
Curry L-93
Hayes L-15
Jackson L-14
Jones L-17
Smith L-11
Smith L-23
Williams L-17
Johnson null

borrower

 

  • Encontrar branch-name, loan-number and amount para los préstamos superiores a $1,200

    { <l,b,a> | <l,b,a> loan ^ a > 1200 }

  • Encontrar el loan-number de cada préstamo cuyo monto sea mayor a $1,200

    { < l > | b,a ( <l,b,a> loan ^ a > 1200) }

  • Encontrar los nombres de los clientes que tienen un préstamo de la sucursal Perryridge

    { <c,a> | l (<c,l> borrower
             ^    b (<l,b,a> loan ^ b="Perryridge" ) ) }

  • Encontrar todos los clientes que tienen una cuenta en todas las sucursales localizadas en Brooklyn.

    { <c> | n ( <c,n> customer ) ^
                 x,y,z ( <x,y,z> branch ^ y = "Brooklyn" -->
                a,b ( <a,x,b> account ^ <c,a> depositor ) ) }

    En este caso nuevamente aparece el "para todo" y el símbolo de implicación P-->Q, indicando que si P es cierto Q también debe serlo.