Logo Studenta

AYUDANTÍA 4 ENUNCIADO Y SOLUCIÓN

¡Estudia con miles de materiales!

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

Otros materiales