Está en la página 1de 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). Carlos Castillo UPF 2007
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 La guerra de las galaxias El seor de los anillos 1 Mar Adentro El viaje de Chihiro

Nombre

1977 2001 2004 2001

Ao

Actor ID_Actor
1 2 3 4

Mark Cristopher Javier Hugo

Nombre

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()enSQL

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

SELECTA1,A2,...,AnFROMR

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 La guerra de las galaxias La comunidad del anillo Mar Adentro El viaje de Chihiro

Nombre

1977 2001 2004 2001

Ao

Actor ID_Actor
1 2 3 4

Mark Cristopher Javier Hugo

Nombre

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()enSQL

condicin(R)

SELECT*FROMRWHEREcondicin

Composicindeselecciny proyeccin,
Pelcula ID_Pelcula
1 2 3 4 La guerra de las galaxias La comunidad del anillo Mar Adentro El viaje de Chihiro

Nombre

1977 2001 2004 2001

Ao

Actor ID_Actor
1 2 3 4

Mark Cristopher Javier Hugo

Nombre

Apellido
Hamill Lee Bardem Weaving

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

Composicin( y )enSQL

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

SELECTA1,A2,...,AnFROMRWHEREcondicin

10

Eliminarduplicados()
Elimina tuplas duplicadas en una relacin
Pelcula ID_Pelcula
1 2 3 4 La guerra de las galaxias La comunidad del anillo Mar adentro El viaje de Chihiro

(R)

Nombre

1977 2001 2004 2001

Ao

ID_Estudio
3 2 4 1

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

11

OperacindeltaenSQL

(R)

SELECTDISTINCT*FROMR

12

Productocartesiano()
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

Productocartesiano() ejemplos
La guerra de las galaxias La comunidad del anillo Mar adentro El viaje de Chihiro

Nombre

1977 2001 2004 2001

Ao

ID_Estudio
3 2 4 1

Estudio ID_Estudio
1 2 3 4

Ghibli New Line Cinema Lucasfilms Sogecine

Nombre

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

Productocartesiano()enSQL

R1R2

SELECT*FROMR1,R2

15

Seleccionarcombinaciones correctas
Pelcula ID_Pelcula
1 2 3 4 La guerra de las galaxias La comunidad del anillo Mar adentro El viaje de Chihiro

Nombre

1977 2001 2004 2001

Ao

ID_Estudio
3 2 4 1

Estudio ID_Estudio
1 2 3 4

Ghibli New Line Cinema Lucasfilms Sogecine

Nombre

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

Seleccionarcombinaciones correctasenSQL
R1.k=R2.k(R1R2)

SELECT*FROMR1,R2WHERER1.k=R2.k

17

Notacin,operacin Reunir(JOIN)
R1.k=R2.k (R1R2)

R1

R2

18

OperacinJOINenSQL

R1

R2

SELECT*FROMR1,R2WHERER1.k=R2.k

19

OperacinJOIN enMySQL
R1 R2

SELECT*FROMR1JOINR2USING(k)

20

JOINnatural
R1 R2

Omitir el subndice significa:


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

21

OperacinNATURALJOIN enMySQL
R1 R2

SELECT*FROMR1NATURALJOINR2

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

EjemplodeNATURALJOIN
mysql>selectcomunitat.nom,municipi.nom, municipi.superficiefromcomunitatnaturaljoinmunicipi; ++++ |nom|nom|superficie| ++++ |Ceuta|Ceuta|19.52| |Melilla|Melilla|13.96| ++++ 2rowsinset(0.14sec) mysql>selectcomunitat.nom,municipi.nom, municipi.superficiefromcomunitatjoinmunicipi using(ca_id); ++++ |nom|nom|superficie| ++++ |Andaluca|Abla|45.28| |Andaluca|Abrucena|83.18| |Andaluca|Adra|89.98| ...
23

LEFTJOIN
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

OperacinLEFTJOIN enMySQL
R1 R2

SELECT*FROMR1LEFTJOINR2USING(k)

25

EjemploLEFTJOIN
Pelcula ID_Pelcula
1 2 3 4 La guerra de las galaxias La comunidad del anillo Mar adentro El viaje de Chihiro

Nombre

1977 2001 2004 2001

Ao

ID_Estudio
3 2 4 1

Estudio ID_Estudio
1 2 3 4 5

Ghibli New Line Cinema Lucasfilms Sogecine Nuevo Estudio

Nombre

SELECTcount(id_pelicula)ASCNT FROMestudioJOINpelicula USING(id_estudio)

1 1 1 1

CNT

Ghibli New Line Cinema Lucasfilms Sogecine

Nombre

SELECTcount(id_pelicula)ASCNT FROMestudioLEFTJOINpelicula USING(id_estudio)

1 1 1 1 0

CNT

Ghibli New Line Cinema Lucasfilms Sogecine Nuevo Estudio

Nombre

26

OtroejemploLEFTJOIN
Ciudad id_ciudad
1 2 3 4 5

Viaje id_salida
Barcelona Berlin Roma Paris Budapest

Nombre

1 1 5 5 5 5 2

2 4 3 4 2 1 4

id_llegada

SELECT ciudad.nombre,COUNT(viaje.id_salida) FROM ciudadLEFTJOINviajeON (ciudad.id_ciudad=viaje.id_salida) GROUPBY ciudad.nombre;

Barcelona Berlin Budapest Paris Roma

Nombre

2 1 4 0 0

CNT

27

EjemplomltiplesJOIN
Ciudad id_ciudad
1 2 3 4 5

Viaje id_salida
Barcelona Berlin Roma Paris Budapest

Nombre

1 1 5 5 5 5 2

2 4 3 4 2 1 4

id_llegada

SELECTcs.nombre,cl.nombre FROMviaje JOINciudadAScsON (viaje.id_salida=cs.id_ciudad) JOINciudadASclON (viaje.id_llegada=cl.id_ciudad);

Barcelona Barcelona Budapest Budapest Budapest Budapest Berlin

Nombre

Berlin Paris Roma Paris Berlin Barcelona Paris

Nombre

28

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

29

También podría gustarte