Download SQL-query-I
Document related concepts
no text concepts found
Transcript
DML en SQL Consultas sencillas usando el DML de SQL Base Datos de Películas ? ? ? ? Para rellenar la base se ha utilizado información proveniente de “The internet Movie- Database” http://www.imdb.com/list Todos los datos son anteriores a 1997 Todas las películas tienen al menos 200 votos Los actores deben aparecer en más de una película 2 Esquema de una base de datos de Peliculas copy 3 TABLAS CREATE TABLE PELICULA( ID INTEGER, TITULO CHAR(70), AGNO DECIMAL(4), PUNTUACION FLOAT, VOTOS INTEGER, PRIMARY KEY (ID)); -CREATE TABLE ACTOR ( ID INTEGER, NOMBRE CHAR(35), PRIMARY KEY (ID)); -CREATE TABLE REPARTO( PELICULA_ID INTEGER, ACTOR_ID INTEGER, ORD INTEGER, ------ Identificador único Titulo de la película Año de estreno Puntuación media Numero de votos -- Identificador Único -- Nombre del actor/actriz ----- referencia a la tabla PELICULA referencia a la tabla ACTOR_ID 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 más relaciones) (FROM) que satisfagan una condición (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 condición es equivalente a la consulta en álgebra relacional : ? A1, A2, ..., An (? condición (R1 X R2 X ... X Rm)) Devuelve una relación (sin nombre) cuyo esquema es (A1, A2, ..., An) ? SQL no distingue entre mayúsculas y minúsculas ? Excepto cuando se usan comillas. 6 Selección y Proyección Selección: ? Encontrar las mejores películas (puntuación mayor que 9.0) SELECT * FROM pelicula WHERE puntuacion > 9.0 ; Proyección: ? Encontrar las mejores películas (puntuación mayor que 9.0) e imprimir el título y el año del estreno SELECT titulo, agno FROM pelicula WHERE puntuacion > 9.0 ; 7 Duplicados ? Para eliminarlos se usa DISTINCT ? Es una operación cara SELECT DISTINCT agno FROM pelicula WHERE puntuacion > 9.0; 8 Comparación de caracteres ? ? Se pueden utilizar las expresiones algebraicas “usuales” ‘< ’, ‘>’, ‘= ’, … o la instrucción “like” que permite el uso de “comodines” ? ? Dos “wildcards”: ‘_’ (.) and ‘%’ (*) Encontrar todas las películas (y su puntuación) que empiezan por ‘Star’ SELECT titulo, puntuacion FROM pelicula WHERE titulo LIKE 'Star%'; ? Encontrar todas las películas con ‘s en su titulo SELECT titulo FROM pelicula WHERE titulo LIKE '%''s%'; 9 [NOT] SIMILAR TO ? Tiene todas las funcionalidades de LIKE y además es capaz de usar expresiones regulares (bueno, un subconjunto) ? ? ? ? ? | una de dos alternativas * repetición de lo anterior cero o más veces. + repeticion de lo anterior una o más veces. () se usa para agrupar creando una único objeto. [...] especifica una clase. 10 Ejemplo: SIMILAR ? Encontrar todas las películas (y su puntuación) 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 relación resultante está ordenada al azar. ORDER BY especifica en que orden se presentan las duplas : Encontrar las mejores películas (puntuación mayor que 9.0) e imprimir el título y su puntuación. El resultado debe estar ordenado por puntuación. 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; ? ¿Cuál es la peor película? 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 más) relaciones. El producto cartesiano de dos relaciones se consigue enumerando cada relación en la orden FROM Obtener el reparto de 'Pulp Fiction' (el identificador de esta película 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 película 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 Películas 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 Ambigüedad en los atributos ? Método 1: Utilizar el nombre de la relación Películas 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 Ambigüedad en los atributos ? ? Método 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 Ambigüedad 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: unión 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 películas 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 películas con al menos 5000 votos. SELECT titulo FROM pelicula WHERE votos > 5000; ? Año de estreno de ‘Citizen Kane’. SELECT agno FROM pelicula WHERE titulo = 'Citizen Kane'; 25 Ejemplos ? Titulo y puntuación de las películas de la ‘Police Academy…’. SELECT titulo, puntuacion FROM pelicula WHERE titulo LIKE 'Police Academy%'; ? Nombre y puntuación de las películas que contienen la palabra 'Dog' . (similar to) SELECT titulo, puntuacion FROM pelicula WHERE (titulo LIKE '%dog%') OR (titulo LIKE '%Dog%'); 26 Ejemplos!!!!!!! ? Películas 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 ? Películas 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 ? Películas 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 Capítulo Siguiente ? Año en que ‘John Travolta’ extrenó más peliculas ? ? Primero encontremos los años y títulos de sus películas SELECT titulo, agno FROM pelicula, reparto, actor WHERE pelicula.id=pelicula_id AND actor.id=actor_id AND nombre= 'John Travolta'; Luego agrupémoslas. 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 Capítulo Siguiente ? Nombres y estrellas de todas las películas en las que actuó 'Julie Andrews' ? ? Primero encontremos los id de sus películas SELECT pelicula_id FROM reparto, actor WHERE actor_id=actor.id AND nombre='Julie Andrews'; y luego los nombres de las películas 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 películas 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 películas 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