1. Sistemas de Información II
Tema 6. Álgebra
relacional
Bibliografía:
Elmasri y Navathe: “Fundamentos de Sistemas de Bases de
Datos”
3ª edición, 2002 (Capítulo 7).
Garcia-Molina, Ullman y Widom: “Database systems: the
complete book”. Prentice-Hall (Capítulo 5).
Carlos Castillo
UPF – 2007
1
3. Proyección ()
Selecciona el valor de ciertos atributos
de todas las tuplas de una relación
A1,A2,...,An(R) = { t[A1,A2,...,An] : t ∈ R }
Selecciona columnas completas
3
4. Proyección () ejemplos
Película Actor
ID_Película Nombre Año ID_Actor Nombre Apellido
1 La guerra de las galaxias 1977 1 Mark Hamill
2 El señor de los anillos 1 2001 2 Cristopher Lee
3 Mar Adentro 2004 3 Javier Bardem
4 El viaje de Chihiro 2001 4 Hugo Weaving
Año(Película) =
{<1977>,<2001>,<2004>,<2001>}
ID_Película,Año(Película) =
{<1,1977>,<2,2001>,<3,2004>,<4,2001>}
Nombre(Actor) =
{<Mark>,<Cristopher>,<Javier>,<Hugo>}
4
7. Selección () ejemplos
Película Actor
ID_Película Nombre Año ID_Actor Nombre Apellido
1 La guerra de las galaxias 1977 1 Mark Hamill
2 La comunidad del anillo 2001 2 Cristopher Lee
3 Mar Adentro 2004 3 Javier Bardem
4 El viaje de Chihiro 2001 4 Hugo Weaving
Apellido=Lee(Actor) =
{<2,Cristopher,Lee>}
Año>2000(Película) =
{<2,La comunidad del anillo,2001>,
<4,El viaje de Chihiro,2001>}
7
9. Composición de selección y
proyección ,
Película Actor
ID_Película Nombre Año ID_Actor Nombre Apellido
1 La guerra de las galaxias 1977 1 Mark Hamill
2 La comunidad del anillo 2001 2 Cristopher Lee
3 Mar Adentro 2004 3 Javier Bardem
4 El viaje de Chihiro 2001 4 Hugo Weaving
Nombre(Apellido=Lee(Actor)) =
{<Cristopher>}
Nombre(Año>2000(Película)) =
{<La comunidad del anillo>,
<El viaje de Chihiro>}
9
11. Eliminar duplicados ()
Elimina tuplas (R)
duplicadas en una
relación
Película
ID_Película Nombre Año ID_Estudio
1 La guerra de las galaxias 1977 3
2 La comunidad del anillo 2001 2
3 Mar adentro 2004 4
4 El viaje de Chihiro 2001 1
(Año(Película) = { 1997, 2001, 2004 }
11
13. Producto cartesiano (×)
A × B = {(a,b): a ∈ A ∧ b ∈ B}
Ejemplo:
A = {s,t}
B = {u,v,w}
A × B = {s,t} × {u,v,w}
{ (s,u),(s,v),(s,w),(t,u),(t,v),(t,w) }
La cardinalidad es |A × B| = |A||B|
13
14. Producto cartesiano (×)
ejemplos Estudio
Película
ID_Película Nombre Año ID_Estudio ID_Estudio Nombre
1 La guerra de las galaxias 1977 3 1 Ghibli
2 La comunidad del anillo 2001 2 2 New Line Cinema
3 Mar adentro 2004 4 3 Lucasfilms
4 El viaje de Chihiro 2001 1 4 Sogecine
Película×Estudio =
{
<1,La guerra de las galaxias,1977,3,1,Ghibli>,
<1,La guerra de las galaxias,1977,3,2,New Line Cinema>,
<1,La guerra de las galaxias,1977,3,3,Lucasfilms>,
<1,La guerra de las galaxias,1977,3,4,Sogecine>,
<2,La comunidad del anillo,2001,2,1,Ghibli>,
<2,La comunidad del anillo,2001,2,2,New Line Cinema>,
<2,La comunidad del anillo,2001,2,3,Lucasfilms>,
<2,La comunidad del anillo,2001,2,4,Sogecine>,
<3,Mar adentro,2004,4,1,Ghibli>,
<3,Mar adentro,2004,4,2,New Line Cinema>,
... }
14
16. Seleccionar combinaciones
correctas
Estudio
Película
ID_Película Nombre Año ID_Estudio ID_Estudio Nombre
1 La guerra de las galaxias 1977 3 1 Ghibli
2 La comunidad del anillo 2001 2 2 New Line Cinema
3 Mar adentro 2004 4 3 Lucasfilms
4 El viaje de Chihiro 2001 1 4 Sogecine
Película.ID_estudio=Estudio.ID_Estudio(Película×Estudio) =
{
<1,La guerra de las galaxias,1977,3,3,Lucasfilms>,
<2,La comunidad del anillo,2001,2,2,New Line Cinema>,
<3,Mar adentro,2004,4,4,Sogecine>,
<4,El viaje de Chihiro,2001,1,1,Ghibli>
}
16
20. Operación JOIN
en MySQL
R1 R2
k
SELECT * FROM R1 JOIN R2 USING(k)
20
21. JOIN natural
R1 R2
Omitir el subíndice significa:
Unir según todos los atributos que tengan
el mismo nombre en las dos tablas
21
22. Operación NATURAL JOIN
en MySQL
R1 R2
SELECT * FROM R1 NATURAL JOIN R2
Nota: esto usa todos los atributos que se llamen de la
misma manera, a veces no es lo que nosotros queremos
Comunitat( id_comunitat, nom )
Municipi( id_municipi, id_comunitat, nom )
Queremos unir id_comunitat pero no nom 22
24. LEFT JOIN
JOIN elimina algunos datos
Los que no están en las dos tablas
LEFT JOIN reemplaza los eliminados por
valores nulos en la tabla de la izquierda
24
25. Operación LEFT JOIN
en MySQL
R1 R2
k
SELECT * FROM R1 LEFT JOIN R2 USING(k)
25
26. Ejemplo LEFT JOIN
Película Estudio
ID_Película Nombre Año ID_Estudio ID_Estudio Nombre
1 La guerra de las galaxias 1977 3
1 Ghibli
2 La comunidad del anillo 2001 2
2 New Line Cinema
3 Mar adentro 2004 4
3 Lucasfilms
4 El viaje de Chihiro 2001 1
4 Sogecine
5 Nuevo Estudio
CNT Nombre
SELECT count(id_pelicula) AS CNT 1 Ghibli
1 New Line Cinema
FROM estudio JOIN pelicula 1 Lucasfilms
1 Sogecine
USING (id_estudio)
CNT Nombre
SELECT count(id_pelicula) AS CNT 1 Ghibli
1 New Line Cinema
1 Lucasfilms
FROM estudio LEFT JOIN pelicula 1 Sogecine
0 Nuevo Estudio
USING (id_estudio)
26
27. Otro ejemplo LEFT JOIN
Viaje
id_salida id_llegada
Ciudad
1 2
id_ciudad Nombre
1 4
1 Barcelona
5 3
2 Berlin
5 4
3 Roma
5 2
4 Paris
5 1
5 Budapest
2 4
SELECT
Nombre CNT
ciudad.nombre,COUNT(viaje.id_salida) Barcelona 2
Berlin 1
FROM Budapest 4
ciudad LEFT JOIN viaje ON Paris 0
Roma 0
(ciudad.id_ciudad=viaje.id_salida)
GROUP BY
ciudad.nombre;
27
28. Ejemplo múltiples JOIN
Viaje
id_salida id_llegada
Ciudad
1 2
id_ciudad Nombre
1 4
1 Barcelona
5 3
2 Berlin
5 4
3 Roma
5 2
4 Paris
5 1
5 Budapest
2 4
Nombre Nombre
SELECT cs.nombre, cl.nombre Barcelona Berlin
FROM viaje Barcelona Paris
Budapest Roma
JOIN ciudad AS cs ON Budapest Paris
Budapest Berlin
(viaje.id_salida=cs.id_ciudad) Budapest Barcelona
JOIN ciudad AS cl ON Berlin Paris
(viaje.id_llegada=cl.id_ciudad);
28
29. Resumen
Proyectar (): elegir columnas
Seleccionar (): criterio para las filas
Producto cartesiano (×): producto
tablas
Join ó Reunir ( ): combinar tablas
29