Está en la página 1de 32

DML en SQL

Consultas sencillas usando el DML


de SQL
Base Datos de Pelculas
? Para rellenar la base se ha utilizado
informacin proveniente de The internet
Movie- Database
http://www.imdb.com/list
? Todos los datos son anteriores a 1997
? Todas las pelculas tienen al menos 200
votos
? Los actores deben aparecer en ms de
una pelcula

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)

? SQL no distingue entre maysculas y minsculas


? Excepto cuando se usan comillas.

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

SELECT DISTINCT agno


FROM pelicula
WHERE puntuacion > 9.0;

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

? Se usa la palabra AS en el comando SELECT

SELECT titulo AS Title, agno AS Year,puntuacion


AS kk
FROM pelicula
WHERE kk > 9.0;

SELECT titulo AS Title, agno*365.25 AS Day


FROM pelicula
WHERE puntuacion > 9.0;

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

? En que se diferencia esta consulta de la


anterior

SELECT Star1.nombre, Star1.id,


Star2.nombre, Star2.id
FROM actor Star1, actor Star2
WHERE Star1.nombre = Star2.nombre
AND Star1.id <> Star2.id;

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

(SELECT nombre FROM pelicula,actor,reparto WHERE


titulo LIKE 'Star Trek V:%' AND
pelicula_id=pelicula.id AND actor_id=actor.id)
INTERSECT (SELECT nombre FROM pelicula,actor,reparto
WHERE titulo LIKE 'Star Trek IV:%' AND
pelicula_id=pelicula.id AND actor_id=actor.id );

24
Ejemplos copiar tablas

? Lista de pelculas con al menos 5000 votos.


SELECT titulo
FROM pelicula
WHERE votos > 5000;

? Ao de estreno de Citizen Kane.

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%';

? Nombre y puntuacin de las pelculas que


contienen la palabra 'Dog' . (similar to)

SELECT titulo, puntuacion


FROM pelicula
WHERE (titulo LIKE '%dog%') OR (titulo
LIKE '%Dog%');
26
Ejemplos!!!!!!!
? Pelculas en las que aparece 'Harrison Ford' y
no es protagonista.
SELECT titulo
FROM actor, pelicula, reparto
WHERE nombre = 'Harrison Ford' AND
actor.id=actor_id AND
pelicula_id=pelicula.id AND ord <> 1;

? Reparto de 'Alien' .
SELECT nombre
FROM actor, reparto, pelicula
WHERE titulo = 'Alien'
AND pelicula.id = pelicula_id
AND actor_id = actor.id;
27
Ejemplos

? Pelculas en las que aparece 'Harrison Ford'


pero no es el protagonista.
SELECT titulo
FROM actor, pelicula, reparto
WHERE nombre = 'Harrison Ford'
AND actor.id=actor_id
AND pelicula_id=pelicula.id
AND ord <> 1;

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

También podría gustarte