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:
- R y S deben tener esquemas idénticos.
- 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)
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 |
S |
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
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 |
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
(R)
4.14.2 Operadores de agregación
- 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) (R)
4.14.3 Agrupación
A |
B |
1 |
2 |
3 |
4 |
1 |
2 |
2 |
8 |
1 |
2 |
2 |
6 |
A, SUM(B) (R)
4.14.4 Ordenamiento
A4,A5 (R)
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 todos los clientes que tienen una cuenta en todas las sucursales localizadas en Brooklyn
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.
|