Agregados en Mysql

-- Cuantos hay de algo, cuanto suma algo...
-- ¿Cuantas películas hay por categoría?
-- funciones de agregado: count, sum, min, max, avg...
-- La opción de agrupar por algo GROUP BY

-- Cuantas películas hay por categoría
select name, count(film_id) from category join film_category using(category_id)
join film using (film_id)
group by name;

-- Cuantos actores tienen el mismo nombre
select first_name, count(last_name) total from actor
group by first_name;

-- ¿Cuantos actores trabajan en cada película?

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

-- ¿Cual es la película con más actores?

select title, count(actor_id) num_actores from actor join film_actor using(actor_id)
join film using(film_id)
group by title
order by num_actores desc 
limit 1;

-- Total de pagos por cliente

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

Categorías y países

select name,country from category join film_category using (category_id)
join film using (film_id)
join inventory using (film_id)
join rental using (inventory_id)
join customer using (customer_id)
join address using (address_id)
join city using (city_id)
join country using (country_id)
where name='Action' and country='Argentina'

left y right join

-- Relacionar los registros que aparecen en las dos tablas
-- Si mi registro no tiene registros relacionados en la otra tabla
-- NO APARECE

select country,city
from country inner join city using(country_id)
where city like 'T%';

-- ¿Cómo puedo hacer que aparezcan?
-- Cambiar el tipo de join: left, right

select country,city
from country left join city using(country_id)
where country like 'A%';


select country,city
from country right join city using(country_id)
where city like 'T%';

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


select country,city
from country right join city using(country_id)
where country is null

Ejercicios Join

1.- Titulos de películas de acción
2.- Nombres de actores que hayan trabajado en películas de rating ‘G’ o ‘PG’
3.- Nombres de clientes de Argentina
4.- Nombres de actores que hayan trabajado en categoría ‘Children’ o ‘Family’

Ejemplos join

https://www.w3schools.com/sql/sql_join.asp

Nuestra base de datos es relacional, así que relacionamos las tablas mediante el join:


SELECT country, city, city_id
FROM country join city on country.country_id=city.country_id;

select country,city
from country join city using(country_id);

SELECT name, title FROM category join film_category
on category.category_id=film_category.category_id
join film on film_category.film_id=film.film_id;

SELECT name, title FROM category join film_category
using(category_id)
join film using(film_id);

SELECT name, title FROM category join film_category
using(category_id)
join film using(film_id)
where name in ('Family','Children') and title like '%strange%'
and rating='G'

-- ¿Qué actores han trabajado en documentales?

SELECT distinct name, first_name, last_name FROM category 
join film_category
on category.category_id=film_category.category_id
join film
on film_category.film_id=film.film_id
join film_actor
on film.film_id=film_actor.film_id
join actor
on film_actor.actor_id=actor.actor_id
where name='Documentary'
order by name, first_name, last_name

Ejercicios operadores básicos

Seleccionar todos los actores cuyo nombre empieze por ‘A’ y el apellido acabe por ‘N’
Seleccionar todos los actores cuyo id esté entre 20 y 70 y el apellido empiece por ‘A’
Seleccionar todas las películas (tabla film) cuyo rental_duration sea 3
Seleccionar todas las películas (tabla film) cuyo rental_duration sea 3 y el title empiece por ‘A’
Seleccionar todas las películas (tabla film) cuyo rental_duration sea 3 y el title empiece por ‘A’ o el rating sea ‘G’
Seleccionar todas las películas cuyo rating sea ‘G’, ‘PG’ o ‘R’

Operador SQL

between: valores en un rango

select * from actor
where actor_id between 20 and 25

in: Valores en una lista

select * from actor

where first_name in (‘ED’,’TED’)

Like: Valores siguiendo un patrón


-- Caracteres comodin: % cualquier cadena _ cualquier caracter
-- Empiecen por
select * from actor
where first_name like 'EL%';
-- Acaben por
select * from actor
where first_name like '%EN';
-- Empiecen y acaben por
select * from actor
where first_name like 'E%N';
-- Contengan
select * from actor
where first_name like '%AN%';

-- El guión bajo encaja con un sólo carácter</pre>
select * from actor
where first_name like '_AN';

select * from actor
where first_name like '%AN';

select * from actor
where first_name like '_E_';

select * from actor
where first_name like 'T_M';