Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2
Esquema de una base de datos
de Peliculas
copy
3
TABLAS
CREATE TABLE PELICULA(
ID INTEGER, -- Identificador nico
TITULO CHAR(70), -- Titulo de la pelcula
AGNO DECIMAL(4), -- Ao de estreno
PUNTUACION FLOAT, -- Puntuacin media
VOTOS INTEGER, -- Numero de votos
PRIMARY KEY (ID));
--
CREATE TABLE ACTOR (
ID INTEGER, -- Identificador nico
NOMBRE CHAR(35), -- Nombre del actor/actriz
PRIMARY KEY (ID));
--
CREATE TABLE REPARTO(
PELICULA_ID INTEGER, -- referencia a la tabla PELICULA
ACTOR_ID INTEGER, -- referencia a la tabla ACTOR_ID
ORD INTEGER, -- Orden en el reparto
-- La estrella es 1, ...
--
FOREIGN KEY (PELICULA_ID ) REFERENCES PELICULA(ID),
FOREIGN KEY (ACTOR_ID) REFERENCES ACTOR(ID),
PRIMARY KEY (PELICULA_ID, ACTOR_ID));
4
Consultas sencillas en SQL
SELECT
FROM
WHERE
ORDER BY
? Lista los atributos (SELECT) pertenecientes a
una (o ms relaciones) (FROM) que satisfagan
una condicin (WHERE), ordenar la salida
(ORDEN BY).
? La principal diferencia entre los resultado
proporcionados por SQL y lgebra relacional
es que SQL admite el duplicado de tuplas
5
SQL vs. Rel. lgebra
SELECT A1, A2, ..., An
FROM R1, R2, ..., Rm
WHERE condicin
es equivalente a la consulta en lgebra relacional :
? A1, A2, ..., An (? condicin (R1 X R2 X ... X Rm))
Devuelve una relacin (sin nombre) cuyo esquema es (A1,
A2, ..., An)
6
Seleccin y Proyeccin
Seleccin:
? Encontrar las mejores pelculas (puntuacin mayor que
9.0)
SELECT *
FROM pelicula
WHERE puntuacion > 9.0 ;
Proyeccin:
? Encontrar las mejores pelculas (puntuacin mayor que
9.0) e imprimir el ttulo y el ao del estreno
SELECT titulo, agno
FROM pelicula
WHERE puntuacion > 9.0 ;
7
Duplicados
? Para eliminarlos se usa DISTINCT
? Es una operacin cara
8
Comparacin de caracteres
? Se pueden utilizar las expresiones algebraicas
usuales < , >, = ,
? o la instruccin like que permite el uso de
comodines
? Dos wildcards: _ (.) and % (*)
? Encontrar todas las pelculas (y su puntuacin) que
empiezan por Star
SELECT titulo, puntuacion
FROM pelicula
WHERE titulo LIKE 'Star%';
? Encontrar todas las pelculas con s en su titulo
SELECT titulo
FROM pelicula
WHERE titulo LIKE '%''s%';
9
[NOT] SIMILAR TO
? Tiene todas las funcionalidades de LIKE y
adems es capaz de usar expresiones regulares
(bueno, un subconjunto)
? | una de dos alternativas
? * repeticin de lo anterior cero o ms veces.
? + repeticion de lo anterior una o ms veces.
? () se usa para agrupar creando una nico
objeto.
? [...] especifica una clase.
10
Ejemplo: SIMILAR
? Encontrar todas las pelculas (y su
puntuacin) que empiezan por Star y no
sean de la saga Star Treck
SELECT titulo, puntuacion
FROM pelicula
WHERE titulo NOT SIMILAR TO
'%(S|s)tar [A-z]rek%' AND
titulo SIMILAR TO '%Star%';
11
Ordenar la salida
? Tras una consulta, la relacin resultante est
ordenada al azar.
? ORDER BY especifica en que orden se
presentan las duplas :
? Encontrar las mejores pelculas (puntuacin
mayor que 9.0) e imprimir el ttulo y su
puntuacin. El resultado debe estar ordenado
por puntuacin.
SELECT titulo, puntuacion
FROM pelicula
WHERE puntuacion > 9.0
ORDER BY puntuacion;
12
Ordenar la salida
? Vaya, por defecto ordena de forma
ascendente
SELECT titulo, puntuacion
FROM pelicula
WHERE puntuacion > 9.0
ORDER BY puntuacion DESC;
? Cul es la peor pelcula?
13
Ordenar la Salida
SELECT select_list
FROM table_expression
WHERE
ORDER BY column1 [ASC |
DESC] [, column2 [ASC | DESC]
...];
14
Renombrar Atributos
15
Producto(s) Cartesiano(s)
? Gran parte de la potencia de las bases relacionales se
basa en la posibilidad de combinar dos (o ms)
relaciones.
? El producto cartesiano de dos relaciones se consigue
enumerando cada relacin en la orden FROM
? Obtener el reparto de 'Pulp Fiction' (el identificador
de esta pelcula es el 2)
SELECT nombre
FROM actor, reparto
WHERE pelicula_id=2 AND actor_id=id;
16
Natural Join
? Obtener el reparto de 'Pulp Fiction' (el
identificador de esta pelcula es el 2)
SELECT nombre
FROM actor NATURAL INNER JOIN reparto
WHERE pelicula_id=2 AND actor_id=id; ;
17
Producto(s) Cartesiano(s)
? Obtener el reparto de Blade Runner'
SELECT nombre
FROM actor, reparto, pelicula
WHERE titulo = 'Blade Runner'
AND pelicula.id = pelicula_id
AND actor_id = actor.id;
18
Producto Cartesiano
? Pelculas de John Travolta ordenadas por popularidad
SELECT titulo, puntuacion
FROM reparto,pelicula,actor
WHERE actor.nombre='John Travolta'
AND actor_id=actor.id
AND pelicula_id=pelicula.id
ORDER BY puntuacion desc;
19
Ambigedad en los atributos
? Mtodo 1: Utilizar el nombre de la
relacin
? Pelculas de John Travolta
SELECT titulo, puntuacion
FROM reparto,pelicula,actor
WHERE actor.nombre='John Travolta'
AND actor_id=actor.id
AND pelicula_id=pelicula.id
ORDER BY puntuacion desc;
20
Ambigedad en los atributos
? Mtodo 2: variable tupla
? Haz un chequeo de consistencia, Si hay dos actores
con el mismo nombre y distinto ID puede ser un
error
SELECT Star1.nombre, Star1.id,
Star2.nombre, Star2.id
FROM actor Star1, actor Star2
WHERE Star1.nombre = Star2.nombre
AND Star1.id < Star2.id;
21
Ambigedad en los atributos pi
22
NATURAL join etc
? Dejar esto para subqueries
23
Combinando Consultas
? Union: unin
? Intersect: interseccion
? Except: resta
? Estos operadores eliminan los dupicados
? Si se usa ALL los duplicados no se eliminan: e.g., UNION ALL
? Las subconsultas deben ser compatibles
? Actores comunes a las pelculas Star Trek IV y Star Trek V
24
Ejemplos copiar tablas
SELECT agno
FROM pelicula
WHERE titulo = 'Citizen Kane';
25
Ejemplos
? Titulo y puntuacin de las pelculas de la Police
Academy.
SELECT titulo, puntuacion
FROM pelicula
WHERE titulo LIKE 'Police Academy%';
? Reparto de 'Alien' .
SELECT nombre
FROM actor, reparto, pelicula
WHERE titulo = 'Alien'
AND pelicula.id = pelicula_id
AND actor_id = actor.id;
27
Ejemplos
28
Ejemplos
? Pelculas filmadas en 1962 y sus
protagonistas
SELECT titulo, nombre
FROM pelicula, reparto, actor
WHERE agno=1962 AND
pelicula.id=pelicula_id AND
ord=1 AND
actor_id=actor.id;
29
Ejemplo del Captulo Siguiente
? Ao en que John Travolta extren ms peliculas
? Primero encontremos los aos y ttulos de sus pelculas
SELECT titulo, agno
FROM pelicula, reparto, actor
WHERE pelicula.id=pelicula_id AND
actor.id=actor_id AND
nombre= 'John Travolta';
? Luego agrupmoslas.
SELECT COUNT(titulo), agno
FROM pelicula, reparto, actor
WHERE pelicula.id=pelicula_id AND
actor.id=actor_id AND
nombre= 'John Travolta'
GROUP BY agno ORDER BY 1;
30
Ejemplo del Captulo Siguiente
? Nombres y estrellas de todas las pelculas en las que
actu 'Julie Andrews'
? Primero encontremos los id de sus pelculas
SELECT pelicula_id
FROM reparto, actor
WHERE actor_id=actor.id AND
nombre='Julie Andrews';
? y luego los nombres de las pelculas y las estrellas
SELECT titulo, nombre
FROM pelicula, reparto, actor
WHERE pelicula_id=pelicula.id AND
actor_id=actor.id AND ord=1
AND pelicula.id IN (SELECT pelicula_id
FROM reparto, actor
WHERE actor_id=actor.id AND
nombre='Julie Andrews'); 31
Ejemplos
? Actores que han trabajado con 'Orson
Welles'
? Primero encontremos los id de sus pelculas
SELECT pelicula_id
FROM reparto, actor
WHERE actor_id=actor.id AND
nombre= 'Orson Welles';
? y luego los nombres de quien a trabajado en esas pelculas
SELECT nombre, titulo
FROM actor, reparto, pelicula
WHERE actor.id=actor_id AND
pelicula_id=pelicula.id AND
pelicula_id IN (SELECT pelicula_id
FROM reparto, actor WHERE actor_id=actor.id AND
nombre='Orson Welles');
32