Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
1 Universidad de los Andes Facultad de Ciencias Económicas y Empresariales Ingeniería Comercial Programación y Manejo de la Información 2-2020 Ayudantía 4 SQL Manipulación de datos Profesores: Andrés Kipreos - Agustín Lagos - Stefan Elbl Ayudante: Raimundo Vargas Link video: https://youtu.be/J15jkHk1iG8 1. Consultas Anidadas Consiste en hacer consultas dentro de otras consultas. Anidar las consultas sirve mucho para simplificar otras consultas y hacerlas menos enredadas ya que nos permite ir haciendo algo más complicado en un montón de partes simples. Todo esto se puede modelar con distintos operadores: • IN que te busca las que estén en la subconsulta • ALL retorna verdadero si todos los valores de la subconsulta cumplen la condición. • ANY retorna verdadero si cualquiera de los valores de la subconsulta cumple la condición. Veamos un ejemplo en el que ocuparemos el operador IN. Tenemos las siguientes dos tablas, 2 Digamos que queremos seleccionar aquellas películas que se estrenen el 2020. Con consultas anidadas seria: USE imdb; SELECT Titulopelicula FROM Peliculas WHERE idpelicula IN ( SELECT IDPELICULA FROM fechadeestreno WHERE fecha> '2019-12-31' AND fecha< '2021-01-01'); Lo cual nos retorna: Ahora bien, muchas de estas consultas se pueden “aplanar”, como la anterior, la cual aplanada quedaría simplemente: USE imdb; SELECT DISTINCT p.Titulopelicula FROM Peliculas p, fechadeestreno f WHERE f.idpelicula=p.idpelicula AND f.fecha> '2019-12-31' AND 3 fecha< '2021-01-01'; 2. Consultas Anidadas Correlacionada Simplemente consiste en hacer una subconsulta de la misma tabla de la que se hace la consulta, por ej: Tenemos la tabla películas: Queremos saber las películas que tienen una duración mayor al promedio, lo que nos quedaría: USE imdb; SELECT p.Titulopelicula FROM Peliculas p WHERE duracion>( SELECT AVG(duracion) FROM Peliculas); Esto retorna: 4 3. Agregación Son distintas instancias que se pueden ocupar en las selecciones o en las condiciones. Estas te facilitan la vida, en ellas podemos encontrar SUM, MIN, MAX, AVG que son respectivamente suma, mínimo, máximo y promedio. Veamos algunos ejemplos de estas: • SUMA: Queremos saber la duración total de todas las películas. SELECT SUM(duracion) as Duracion_Total FROM Peliculas; Resultado: • MIN: Queremos saber la duración mínima en Películas SELECT MIN(duracion) as Duracion_Minima FROM Peliculas; Resultado: 5 • MAX: Queremos saber la duración máxima en Películas SELECT MAX(duracion) as Duracion_Maxima FROM Peliculas; Resultado: • AVG: Queremos saber el promedio de duración de las Películas SELECT AVG(duracion) as Promedio_Duracion FROM Peliculas; Resultado: 4. COUNT Sirve para contar tuplas. Ej: • Queremos saber cuántos ratings hay SELECT Count(rating) From Rating; Resultado: • Queremos saber cuántas películas hay: 6 SELECT Count(idpelicula) From Peliculas; Resultado: Por ahora es simple, pero ya veremos casos más extensos después de ver GROUP BY. 5. GROUP BY Como bien se puede intuir el GROUP BY se puede entender como “Agrupar por”. Esta es otra clase de condición que sirve para agrupar datos y de esta forma conseguir que no haya tuplas duplicadas o bien, para poder ocupar SUM, MIN, MAX y AVG de forma más útil. Veamos algunos ejemplos, para los cuales usaremos las siguientes tablas de imdb: (En resumen estas tablas significan que hay un usuario que le da un cierto rating a una pelicula) Ejemplos: • Queremos saber el promedio de rating que tienen todas las películas: USE imdb; SELECT p.Titulopelicula as Pelicula, avg(r.rating) as Rating FROM Rating r, Peliculas p WHERE p.idpelicula = r.idpelicula GROUP BY r.idpelicula; Resultado: 7 • Queremos saber la suma de todos los ratings que ha dado cada usuario: SELECT u.mail, SUM(r.rating) FROM Usuario u, Rating r WHERE u.mail = r.mail GROUP BY (u.mail); Resultado: • Queremos saber el rating más bajo de cada usuario SELECT u.mail, MIN(r.rating) FROM Usuario u, Rating r WHERE u.mail = r.mail GROUP BY (u.mail); Resultado: 8 • Queremos saber el rating mas alto que le hayan dado a cada película: SELECT p.Titulopelicula, MAX(r.rating) FROM Peliculas p, Rating r WHERE p.idpelicula = r.idpelicula GROUP BY (p.titulopelicula); Resultado: • Queremos saber cuantos ratings ha tenido cada película: SELECT p.Titulopelicula, COUNT(r.idrating) FROM Peliculas p, Rating r WHERE r.idpelicula = p.idpelicula GROUP BY p.Titulopelicula; Resultado: 9
Compartir