Ejercicios vistas

Crear una vista que nos muestre el pais, la ciudad, la dirección y el nombre de los clientes. La podemos llamar clientes_direccion

Con esa vista creada será muy fácil mostrar los clientes de Argentina o Italia

Crear una vista que nos relacione la película con sus pagos. Que nos muestre el id de la película, el title, y todos los datos de payment.

Con esa vista sería muy fácil ver el total de pagos por película.

Creando vistas en mysql

Categorías, películas y actores:

create view pelistotal as
select category_id, category.name nombrecategoria,
film_id,title,actor_id,
first_name,last_name 
from category join film_category using (category_id)
join film using (film_id)
join film_actor using (film_id)
join actor using (actor_id)

La usamos como una tabla normal:

select name,count(actor_id) total 
from pelistotal 
group by category_id
select * from actor 
where actor_id not in (
SELECT actor_id FROM pelistotal where name='action');

Como hacer una consulta del tipo actores que no han trabajado en películas de acción si usar subconsultas. Primero creamos la vista en positivo:

create view actores_accion as 
select actor_id,first_name,last_name from 
category join film_category using (category_id)
join film using (film_id)
join film_actor using (film_id)
join actor using (actor_id) 
where name='action'

Y después hacemos un left join y buscamos los nulos:

SELECT * FROM actor left join actores_accion using(actor_id)
where actores_accion.first_name is null

Ejemplos Create view

create view peliculas_pais as
select country, count(rental_id) total
from country join city using (country_id)
join address using(city_id)
join customer using(address_id)
join rental using(customer_id)
group by country_id
CREATE VIEW peliculas_categoria AS
select name, count(film_id) total
from category join film_category using (category_id)
group by category_id

 

Ejercicios repaso mysql

Encontrar los clientes que hayan gastado más de 100 dólares

Mostrar los diez actores que han trabajado en más películas

Buscar las películas que se hayan alquilado más de 20 veces

Clientes de España o Argentina

Películas para niños (children) o familiares (Family)

Actores que no hayan trabajado en películas para niños o familiares

Actores que hayan trabajado en películas que no se hayan alquilado nunca

Ejercicios subconsultas

Clientes que no han alquilado películas del actor con actor_id=1

Actores que no han trabajado en películas que duren más de 180 minutos

Actores que han trabajado en películas que no duran más de 180 minutos

Categorías que no tienen películas que duren más de 180 minutos

Clientes que no han pagado más de 10 dólares por alquilar una película.

Ejercicios left/right

Número de veces que se ha alquilado una película, incluyendo las que no se han alquilado nunca

Número de actores por película, incluyendo las películas que no tengan actores

Una consulta que me muestre juntas los nombres de las ciudades y los nombres de los distritos en las direcciones.


select title, count(rental_id) total
from film left join inventory using (film_id)
left join rental using (inventory_id)
group by film_id

select title,count(actor_id) total
from film left join film_actor using (film_id)
left join actor using (actor_id)
group by film_id

select city territorio from city
union
select district territorio from address
order by territorio

Ejemplos left/right join


SELECT country,count(city_id) total FROM sakila.country left join city using(country_id)
group by country_id
having total=0

select country from country left join city using(country_id)
where city_id is null

select * from film left join film_actor using(film_id)
where actor_id is null;

select * from film_actor right join film using(film_id)
where actor_id is null;

select * from actor left join film_actor using(actor_id)
where film_id is null

SELECT * FROM customer left join rental using(customer_id)
where rental_id is null

Ejercicios agrupados

Mostrar la categoría con más películas

Mostrar los cinco clientes que más han gastado

Mostrar los países que tengan menos de 10 clientes

Mostrar los actores que han trabajado en más de 20 películas

Mostrar los actores que han trabajado en 5 o más  películas de acción


select name,count(film_id) total
from category join film_category using (category_id)
join film using (film_id)
group by category_id
order by total desc
limit 1

select first_name, last_name, sum(amount) total
from customer join payment using (customer_id)
group by customer_id
order by total desc limit 5

select country,count(customer_id) total
from customer join address using (address_id)
join city using (city_id)
join country using (country_id)
group by country_id
having total<10

select first_name,last_name, count(film_id) total
from actor join film_actor using (actor_id)
join film using (film_id)
group by actor_id
having total>20

select first_name,last_name, count(film_id) total
from actor join film_actor using (actor_id)
join film using (film_id)
join film_category using (film_id)
join category using (category_id)
where name='action'
group by actor_id
having total>=5

Ejemplos where + join

Buscar los países que tengan entre 10 y 20 ciudades que tengan una letra ‘a’


select country, count(city_id) total
from country join city using(country_id)
where city like '%a%' -- Primero filtro las ciudades con una 'a' y después las cuento
group by country_id
having total between 10 and 20 -- este filtro se aplica después de contar
order by total desc