Вы находитесь на странице: 1из 29

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 – 2008

1
Operaciones
Proyectar ()
Seleccionar ()
Producto cartesiano (×)
Join ó Reunir ( )
Operaciones de conjuntos
Unir (∪)
Intersectar (∩)
Restar (–)

2
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
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
Proyección () en SQL

A1,A2,...,An(R)

SELECT A1,A2,...,An FROM R

5
Selección ()
Selecciona el valor de ciertas tuplas
condición(R) = { t∈R : condición(t) es cierto}
Selecciona filas completas

6
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
Selección () en SQL

condición(R)

SELECT * FROM R WHERE condición

8
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
Composición ( y ) en SQL

A1,A2,...,An(condición(R))

SELECT A1,A2,...,An FROM R WHERE condición

10
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
Operación delta en SQL

(R)

SELECT DISTINCT * FROM R

12
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
Producto cartesiano (×)
ejemplos
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

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
Producto cartesiano (×) en SQL

R1×R2

SELECT * FROM R1,R2

15
Seleccionar combinaciones
correctas
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

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
Seleccionar combinaciones
correctas en SQL

R1.k=R2.k(R1×R2)

SELECT * FROM R1,R2 WHERE R1.k=R2.k

17
Notación, operación
Reunir (JOIN)

R1.k=R2.k (R1×R2)

R1 k R2

18
Operación JOIN en SQL

R1 k R2

SELECT * FROM R1,R2 WHERE R1.k=R2.k

19
Operación JOIN
en MySQL

R1 k R2

SELECT * FROM R1 JOIN R2 USING(k)

20
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
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


Ejemplo de NATURAL JOIN
mysql> 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 |
...
23
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
Operación LEFT JOIN
en MySQL

R1 k R2

SELECT * FROM R1 LEFT JOIN R2 USING(k)

25
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
4 El viaje de Chihiro 2001 1
3 Lucasfilms
4 Sogecine
5 Nuevo Estudio

SELECT count(id_pelicula) AS CNT CNT Nombre


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
Otro ejemplo LEFT JOIN
Viaje
Ciudad id_salida id_llegada
id_ciudad Nombre 1 2
1 Barcelona 1 4
2 Berlin 5 3
3 Roma 5 4
4 Paris 5 2
5 Budapest 5 1
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
Ejemplo múltiples JOIN
Viaje
Ciudad id_salida id_llegada
id_ciudad Nombre 1 2
1 Barcelona 1 4
2 Berlin 5 3
3 Roma 5 4
4 Paris 5 2
5 Budapest 5 1
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
Berlin Paris
JOIN ciudad AS cl ON
(viaje.id_llegada=cl.id_ciudad);

28
Resumen
Proyectar (): elegir columnas
Seleccionar (): criterio para las filas
Producto cartesiano (×): producto
tablas
Join ó Reunir ( ): combinar tablas

29

Вам также может понравиться