sistemas de información ii tema 6. Álgebra relacional · tema 6. Álgebra relacional carlos...

29
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).

Upload: buingoc

Post on 26-Sep-2018

222 views

Category:

Documents


0 download

TRANSCRIPT

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