1
Sistemas de Información II
Tema 6. Álgebra relacional
Carlos Castillo
UPF – 2008
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).
2
Operaciones
Proyectar ()
Seleccionar ()
Producto cartesiano (×)
Join ó Reunir ( )
Operaciones de conjuntos
Unir (∪)
Intersectar (∩)
Restar (–)
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
4
Proyección () ejemplosPelículaID_Película Nombre Año
1 La guerra de las galaxias 19772 El señor de los anillos 1 20013 Mar Adentro 20044 El viaje de Chihiro 2001
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>}
ActorID_Actor Nombre Apellido
1 Mark Hamill2 Cristopher Lee3 Javier Bardem4 Hugo Weaving
5
Proyección () en SQL
A1,A2,...,An(R)
SELECT A1,A2,...,An FROM R
6
Selección ()
Selecciona el valor de ciertas tuplascondición(R) = { t∈R : condición(t) es cierto}
Selecciona filas completas
7
Selección () ejemplosPelículaID_Película Nombre Año
1 La guerra de las galaxias 19772 La comunidad del anillo 20013 Mar Adentro 20044 El viaje de Chihiro 2001
Apellido=Lee(Actor) =
{<2,Cristopher,Lee>} Año>2000(Película) =
{<2,La comunidad del anillo,2001>, <4,El viaje de Chihiro,2001>}
ActorID_Actor Nombre Apellido
1 Mark Hamill2 Cristopher Lee3 Javier Bardem4 Hugo Weaving
8
Selección () en SQL
condición(R)
SELECT * FROM R WHERE condición
9
Composición de selección y proyección ,
PelículaID_Película Nombre Año
1 La guerra de las galaxias 19772 La comunidad del anillo 20013 Mar Adentro 20044 El viaje de Chihiro 2001
Nombre(Apellido=Lee(Actor)) =
{<Cristopher>} Nombre(Año>2000(Película)) =
{<La comunidad del anillo>, <El viaje de Chihiro>}
ActorID_Actor Nombre Apellido
1 Mark Hamill2 Cristopher Lee3 Javier Bardem4 Hugo Weaving
10
Composición ( y ) en SQL
A1,A2,...,An(condición(R))
SELECT A1,A2,...,An FROM R WHERE condición
11
Eliminar duplicados ()
(R)Elimina tuplas
duplicadas en una relación
PelículaID_Película Nombre Año ID_Estudio
1 La guerra de las galaxias 1977 32 La comunidad del anillo 2001 23 Mar adentro 2004 44 El viaje de Chihiro 2001 1
(Año(Película) = { 1997, 2001, 2004 }
12
Operación delta en SQL
SELECT DISTINCT * FROM R
(R)
13
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|
Producto cartesiano (×)
14
Producto cartesiano (×) ejemplos
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>,
... }
PelículaID_Película Nombre Año ID_Estudio
1 La guerra de las galaxias 1977 32 La comunidad del anillo 2001 23 Mar adentro 2004 44 El viaje de Chihiro 2001 1
EstudioID_Estudio Nombre1 Ghibli2 New Line Cinema3 Lucasfilms4 Sogecine
15
Producto cartesiano (×) en SQL
R1×R2
SELECT * FROM R1,R2
16
Seleccionar combinaciones correctas
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>
}
PelículaID_Película Nombre Año ID_Estudio
1 La guerra de las galaxias 1977 32 La comunidad del anillo 2001 23 Mar adentro 2004 44 El viaje de Chihiro 2001 1
EstudioID_Estudio Nombre1 Ghibli2 New Line Cinema3 Lucasfilms4 Sogecine
17
Seleccionar combinaciones correctas en SQL
R1.k=R2.k(R1×R2)
SELECT * FROM R1,R2 WHERE R1.k=R2.k
18
Notación, operaciónReunir (JOIN)
R1.k=R2.k (R1×R2)
R1 k R2
19
Operación JOIN en SQL
SELECT * FROM R1,R2 WHERE R1.k=R2.k
R1 k R2
20
Operación JOINen MySQL
SELECT * FROM R1 JOIN R2 USING(k)
R1 k R2
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
22
Operación NATURAL JOINen MySQL
SELECT * FROM R1 NATURAL JOIN R2
R1 R2
Nota: esto usa todos los atributos que se llamen de lamisma 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
23
Ejemplo de NATURAL JOINmysql> select comunitat.nom, municipi.nom, municipi.superficie from comunitat natural join municipi;+---------+---------+------------+| nom | nom | superficie |+---------+---------+------------+| Ceuta | Ceuta | 19.52 || Melilla | Melilla | 13.96 |+---------+---------+------------+2 rows in set (0.14 sec)mysql> select comunitat.nom, municipi.nom, municipi.superficie from comunitat join municipi using(ca_id);+-----------+----------+------------+| nom | nom | superficie |+-----------+----------+------------+| Andalucía | Abla | 45.28 || Andalucía | Abrucena | 83.18 || Andalucía | Adra | 89.98 |...
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
25
Operación LEFT JOINen MySQL
SELECT * FROM R1 LEFT JOIN R2 USING(k)
R1 k R2
26
Ejemplo LEFT JOINPelículaID_Película Nombre Año ID_Estudio
1 La guerra de las galaxias 1977 32 La comunidad del anillo 2001 23 Mar adentro 2004 44 El viaje de Chihiro 2001 1
EstudioID_Estudio Nombre1 Ghibli2 New Line Cinema3 Lucasfilms4 Sogecine5 Nuevo Estudio
CNT Nombre1 Ghibli1 New Line Cinema1 Lucasfilms1 Sogecine
CNT Nombre1 Ghibli1 New Line Cinema1 Lucasfilms1 Sogecine0 Nuevo Estudio
SELECT count(id_pelicula) AS CNT
FROM estudio JOIN pelicula
USING (id_estudio)
SELECT count(id_pelicula) AS CNT
FROM estudio LEFT JOIN pelicula
USING (id_estudio)
27
Otro ejemplo LEFT JOINCiudad
id_ciudad Nombre1 Barcelona2 Berlin3 Roma4 Paris5 Budapest
Nombre CNTBarcelona 2Berlin 1Budapest 4Paris 0Roma 0
SELECT ciudad.nombre,COUNT(viaje.id_salida)FROM ciudad LEFT JOIN viaje ON (ciudad.id_ciudad=viaje.id_salida)GROUP BY ciudad.nombre;
Viajeid_salida id_llegada
1 21 45 35 45 25 12 4
28
Ejemplo múltiples JOIN
Ciudadid_ciudad Nombre
1 Barcelona2 Berlin3 Roma4 Paris5 Budapest
Nombre NombreBarcelona BerlinBarcelona ParisBudapest RomaBudapest ParisBudapest BerlinBudapest BarcelonaBerlin Paris
SELECT cs.nombre, cl.nombreFROM viaje JOIN ciudad AS cs ON (viaje.id_salida=cs.id_ciudad) JOIN ciudad AS cl ON (viaje.id_llegada=cl.id_ciudad);
Viajeid_salida id_llegada
1 21 45 35 45 25 12 4
29
Resumen
Proyectar (): elegir columnas
Seleccionar (): criterio para las filas
Producto cartesiano (×): producto tablas
Join ó Reunir ( ): combinar tablas