You are on page 1of 29

Sistemas de Informacin II

Tema 6. lgebra relacional


Bibliografa: Elmasri y Navathe: Fundamentos de Sistemas de Bases de Datos 3 edicin, 2002 (Captulo 7). Garcia-Molina, Ullman y Widom: Database systems: the complete book. Prentice-Hall (Captulo 5). Dr. Carlos Castillo UPF 2005
1

Operaciones
Proyectar () Seleccionar () Producto cartesiano () Join Reunir ( ) Operaciones de conjuntos
Unir () Intersectar () Restar ()
2

Proyeccin ()
Selecciona el valor de ciertos atributos de todas las tuplas de una relacin
A1,A2,...,An(R) = { t[A1,A2,...,An] : t R }

Selecciona columnas completas

Proyeccin () ejemplos
Pelcula ID_Pelcula
1 2 3 4

Nombre
La guerra de las galaxias El seor de los anillos 1 Mar Adentro El viaje de Chihiro

Ao
1977 2001 2004 2001

Actor ID_Actor
1 2 3 4

Nombre
Mark Cristopher Javier Hugo

Apellido
Hamill Lee Bardem Weaving

Ao(Pelcula) = {<1977>,<2001>,<2004>,<2001>} ID_Pelcula,Ao(Pelcula) = {<1,1977>,<2,2001>,<3,2004>,<4,2001>} Nombre(Actor) = {<Mark>,<Cristopher>,<Javier>,<Hugo>}


4

Proyeccin () en SQL

(R) 1,A2,...,An

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

Seleccin ()
Selecciona el valor de ciertas tuplas
condicin(R) = { tR : condicin(t) es cierto}

Selecciona filas completas

Seleccin () ejemplos
Pelcula ID_Pelcula
1 2 3 4

Nombre
La guerra de las galaxias La comunidad del anillo Mar Adentro El viaje de Chihiro

Ao
1977 2001 2004 2001

Actor ID_Actor
1 2 3 4

Nombre
Mark Cristopher Javier Hugo

Apellido
Hamill Lee Bardem Weaving

Apellido=Lee(Actor) = {<2,Cristopher,Lee>} Ao>2000(Pelcula) = {<2,La comunidad del anillo,2001>, <4,El viaje de Chihiro,2001>}

Seleccin () en SQL

condicin(R)

SELECT * FROM R WHERE condicin

Composicin de seleccin y proyeccin ,


Pelcula ID_Pelcula
1 2 3 4

Nombre
La guerra de las galaxias La comunidad del anillo Mar Adentro El viaje de Chihiro

Ao
1977 2001 2004 2001

Actor ID_Actor
1 2 3 4

Nombre
Mark Cristopher Javier Hugo

Apellido
Hamill Lee Bardem Weaving

Nombre(Apellido=Lee(Actor)) = {<Cristopher>} Nombre(Ao>2000(Pelcula)) = {<La comunidad del anillo>, <El viaje de Chihiro>}

Composicin ( y ) en SQL

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

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

10

Eliminar duplicados ()
Elimina tuplas duplicadas en una relacin
Pelcula ID_Pelcula
1 2 3 4

(R)

Nombre
La guerra de las galaxias La comunidad del anillo Mar adentro El viaje de Chihiro

Ao
1977 2001 2004 2001

ID_Estudio
3 2 4 1

(Ao(Pelcula) = { 1997, 2001, 2004 }

11

Operacin 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

Pelcula ID_Pelcula
1 2 3 4

Producto cartesiano () ejemplos


Nombre
La guerra de las galaxias La comunidad del anillo Mar adentro El viaje de Chihiro

Ao
1977 2001 2004 2001

ID_Estudio
3 2 4 1

Estudio ID_Estudio
1 2 3 4

Nombre
Ghibli New Line Cinema Lucasfilms Sogecine

PelculaEstudio =
{ <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

R1R2

SELECT * FROM R1,R2

15

Seleccionar combinaciones correctas


Pelcula ID_Pelcula
1 2 3 4

Nombre
La guerra de las galaxias La comunidad del anillo Mar adentro El viaje de Chihiro

Ao
1977 2001 2004 2001

ID_Estudio
3 2 4 1

Estudio ID_Estudio
1 2 3 4

Nombre
Ghibli New Line Cinema Lucasfilms Sogecine

Pelcula.ID_estudio=Estudio.ID_Estudio(PelculaEstudio) =
{ <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(R1R2)

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

17

Notacin, operacin Reunir (JOIN)


R1.k=R2.k (R1R2)

R1

R2

18

Operacin JOIN en SQL

R1

R2

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

19

Operacin JOIN en MySQL


R1 R2

SELECT * FROM R1 JOIN R2 USING(k)

20

JOIN natural
R1 R2

Omitir el subndice significa:


Unir segn todos los atributos que tengan el mismo nombre en las dos tablas

21

Operacin 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 | +-----------+----------+------------+ | Andaluca | Abla | 45.28 | | Andaluca | Abrucena | 83.18 | | Andaluca | Adra | 89.98 | ...
23

LEFT JOIN
JOIN elimina algunos datos
Los que no estn en las dos tablas

LEFT JOIN reemplaza los eliminados por valores nulos en la tabla de la izquierda

24

Operacin LEFT JOIN en MySQL


R1 R2

SELECT * FROM R1 LEFT JOIN R2 USING(k)

25

Ejemplo LEFT JOIN


Pelcula ID_Pelcula
1 2 3 4

Nombre
La guerra de las galaxias La comunidad del anillo Mar adentro El viaje de Chihiro

Ao
1977 2001 2004 2001

ID_Estudio
3 2 4 1

Estudio ID_Estudio
1 2 3 4 5

Nombre
Ghibli New Line Cinema Lucasfilms Sogecine Nuevo Estudio

SELECT count(id_pelicula) AS CNT FROM estudio JOIN pelicula USING (id_estudio)

CNT
1 1 1 1

Nombre
Ghibli New Line Cinema Lucasfilms Sogecine

CNT

Nombre
Ghibli New Line Cinema Lucasfilms Sogecine Nuevo Estudio

SELECT count(id_pelicula) AS CNT FROM estudio LEFT JOIN pelicula USING (id_estudio)

1 1 1 1 0

26

Otro ejemplo LEFT JOIN


Ciudad id_ciudad
1 2 3 4 5

Viaje id_salida
Nombre
Barcelona Berlin Roma Paris Budapest

id_llegada
2 4 3 4 2 1 4

1 1 5 5 5 5 2

SELECT ciudad.nombre,COUNT(viaje.id_salida) FROM ciudad LEFT JOIN viaje ON (ciudad.id_ciudad=viaje.id_salida) GROUP BY ciudad.nombre;

Nombre
Barcelona Berlin Budapest Paris Roma 2 1 4 0 0

CNT

27

Ejemplo mltiples JOIN


Ciudad id_ciudad
1 2 3 4 5

Viaje id_salida
Nombre
Barcelona Berlin Roma Paris Budapest

id_llegada
2 4 3 4 2 1 4

1 1 5 5 5 5 2

SELECT cs.nombre, cl.nombre FROM viaje JOIN ciudad AS cs ON (viaje.id_salida=cs.id_ciudad) JOIN ciudad AS cl ON (viaje.id_llegada=cl.id_ciudad);

Nombre
Barcelona Barcelona Budapest Budapest Budapest Budapest Berlin

Nombre
Berlin Paris Roma Paris Berlin Barcelona Paris

28

Resumen
Proyectar (): elegir columnas Seleccionar (): criterio para las filas Producto cartesiano (): producto tablas Join Reunir ( ): combinar tablas

29

You might also like