- Selecionar o nome das categorias que começam pela letra 'S', ordenado alfabeticamente pelo nome.
select name from category where name like 'S%' order by name asc;
Os seguintes carateres têm um significado especial: o '%' representa um número arbitrário de quaisquer caracteres e o '_' representa um qualquer caracter.
- Selecionar o primeiro e último nome de todos os atores, ordenado alfabeticamente pelo primeiro e último nome.
select first_name, last_name from actor order by first_name asc,last_name asc;
- Selecionar o título dos filmes alugados pelo cliente número 258, ordenado alfabeticamente pelo título.
select title from (
select distinct film_id, title from film natural join inventory natural join rental
where customer_id = 258 order by 1 asc
) as tmp;
- Selecionar o título dos filmes em que participa o actor 'HARRISON BALE', ordenado alfabeticamente pelo título.
select title from film natural join film_actor natural join actor
where first_name = 'HARRISON' And last_name='BALE' order by title asc;
ou
select title from film
where film_id in (
select film_id from film_actor where actor_id in (
select actor_id from actor where first_name = 'HARRISON' And last_name='BALE')) order by 1 asc;
- Selecionar o primeiro e último nome dos clientes que têm atualmente DVDs alugados, ordenado alfabeticamente pelo primeiro e último nome.
select first_name, last_name from customer where customer_id in (
select customer_id from rental where return_date is NULL
) order by first_name asc, last_name asc;
- Selecionar o primeiro e último nome de cada empregado e o primeiro e último nome do respetivo gerente, ordenado alfabeticamente pelo primeiro e último nome dos empregados.
select E.first_name, E.last_name, G.first_name, G.last_name
from staff as E inner join store as Eloja on E.store_id = Eloja.store_id, staff as G inner join store as Gloja on G.staff_id=Gloja.manager
where Eloja.store_id = Gloja.store_id order by E.first_name ,E.last_name;
- Selecionar o primeiro e último nome dos atores que participam em filmes da categoria 'Drama', ordenado alfabeticamente pelo primeiro e último nome (note que existem duas atrizes com o nome 'SUSAN DAVIS').
select first_name, last_name from
(select distinct first_name, last_name, actor_id from actor natural join film_actor natural join film natural join category
where name = "Drama" order by 1 asc, 2 asc) as tmp;
- Selecionar o primeiro e último nome de todos os clientes e de todos os empregados, ordenado alfabeticamente pelo primeiro e último nome.
(select first_name, last_name from staff)
union all
(select first_name, last_name from customer)
order by first_name asc, last_name asc;
O union all ao contrário do union, permite a existência de tuplos iguais.
- Selecionar os títulos dos filmes com maior duração, ordenado alfabeticamente pelo título.
select title from film
where length = (select max(length) from film);
- Selecionar o título dos filmes que nunca foram alugados pelo cliente 'LEE HAWKS' mas que já foram alugados por outros clientes, ordenado alfabeticamente pelo título.
SELECT title FROM film
WHERE film_id IN
(SELECT film_id FROM inventory WHERE inventory_id IN
(SELECT inventory_id FROM rental))
AND film_id NOT IN
(SELECT film_id from inventory WHERE inventory_id IN
(SELECT inventory_id FROM rental WHERE customer_id IN
(SELECT customer_id FROM customer WHERE first_name = "LEE" AND last_name = "HAWKS")));
by: @yat0 e @boilnkettle
- Selecionar o título dos filmes em que não participa nenhum ator, ordenado alfabeticamente pelo título.
select title from film where film_id not in
(select film_id from film_actor) order by title;
- Selecionar o título dos filmes, com existência de DVDs, que nunca foram alugados, ordenado alfabeticamente pelo título.
select title from film natural join inventory where inventory_id not in (
select inventory_id from rental) order by title;
ou da seguinte forma mais explicita:
select title from film where film_id in (
select film_id from inventory where inventory_id not in (
select inventory_id from rental)) order by title;
- Selecionar o primeiro e último nome dos clientes que alugaram filmes de todas as categorias, com existência de DVDs, ordenado alfabeticamente pelo primeiro e último nome.
select first_name, last_name from customer
where customer_id in
(select customer_id from rental natural join inventory natural join film group by customer_id
having count(distinct category_id) = (
select count(distinct category_id) from film))
order by 1,2;
by: @WarriorofNothing
- Selecionar o primeiro e último nome dos atores que já participaram em filmes de todas as categorias, com existência de filmes, ordenado alfabeticamente pelo primeiro e último nome.
select first_name, last_name from film natural join film_actor natural join actor
group by actor_id having count(distinct category_id) = (select count(distinct category_id) from film) order by 1,2;
ou
select first_name, last_name from actor
where actor_id in
(select actor_id from film_actor natural join film group by actor_id
having count(distinct category_id) = (select count(distinct category_id) from film))
order by 1,2;
by: @WarriorofNothing
- Selecionar por país, o número de empregados que trabalham em lojas desse país, ordenado alfabeticamente pelo país.
select country, sum(num) from (
select store.country, 1 as num
from staff, store
where staff.store_id=store.store_id
UNION ALL
select country, 0 from store where store_id not in (
select store_id from staff)
) as temp group by country order by country asc;
- Selecionar por título de filme, o número de DVDs que dele existem, ordenado alfabeticamente pelo título.
select title, sum(num) from(
select title, 1 as num from film natural join inventory
UNION ALL
select title, 0 as num from film
where film_id not in (select film_id from inventory)
) as temp group by title order by title asc;
- Selecionar o título dos filmes em que participa o actor 'HARRISON BALE' que já tiveram mais do que 20 alugueres, ordenado alfabeticamente pelo título.
select title from film where film_id in
(select film_id from film natural join
film_actor natural join actor
where first_name = 'HARRISON' and last_name = 'BALE')
and film_id in (
select film_id from film natural join inventory natural join rental
group by film_id having count(film_id)>20)
order by title asc ;
- Selecionar o título dos filmes dos quais há mais DVDs, ordenado alfabeticamente pelo título.
select title from film natural join inventory
group by 1
having count(inventory_id) = (select count(inventory_id)
from inventory
group by film_id
order by 1 desc limit 1)
order by 1;
- Selecionar o primeiro e último nome dos clientes que já fizeram devoluções tardias, ordenado alfabeticamente pelo primeiro e último nome.
select first_name, last_name from (
select distinct first_name, last_name, customer_id from customer natural join rental natural join inventory natural join film
where return_date > rent_date + rental_duration
or (return_date is null and datediff(now(), rent_date ) > rental_duration)
order by 1,2) as tmp1;
- Selecionar por nome de categoria, o número médio de actores por filme dessa categoria, ordenado alfabeticamente pelo nome.
select name, avg(c) from category natural join (
select film_id, category_id , count(actor_id) as c from film natural left join film_actor group by 1,2
union all
select NUll as film_id, category_id, 0 as c from category where category_id not in (select category_id from film natural left join film_actor)
) as tmp
group by 1 order by 1;
ou
SELECT name, IFNULL(AVG(length),0) AS average
FROM category
NATURAL LEFT JOIN film
GROUP BY category.category_id
- Selecionar os pares de actores (primeiro e último nome de cada ator) que mais vezes contracenaram juntos, ordenado alfabeticamente pelo primeiro e último de ambos os atores.
SELECT a.first_name, a.last_name, b.first_name, b.last_name
FROM ((SELECT *
FROM actor NATURAL JOIN film_actor) AS a
JOIN
(SELECT *
FROM actor NATURAL JOIN film_actor) AS b
ON a.film_id=b.film_id AND a.actor_id<b.actor_id)
GROUP BY a.actor_id, b.actor_id
HAVING COUNT(a.film_id)=(SELECT MAX(c)
FROM (SELECT a.first_name AS af, a.last_name AS al, b.first_name AS bf, b.last_name AS bl, COUNT(a.film_id) AS c
FROM ((SELECT *
FROM actor NATURAL JOIN film_actor) AS a
JOIN
(SELECT *
FROM actor NATURAL JOIN film_actor) AS b
ON a.film_id=b.film_id AND a.actor_id<b.actor_id)
GROUP BY a.actor_id, b.actor_id) AS t)
ORDER BY 1,2,3,4;
by: @boilnkettle
- Selecionar o título dos filmes da categoria 'Sports', ordenado alfabeticamente pelo título.
select title from film natural join category
where name = 'Sports' order by 1 asc;
- Selecionar o primeiro e último nome dos atores que participam no filme 'WYOMING STORM', ordenado alfabeticamente pelo primeiro e último nome.
select first_name, last_name from actor natural join film_actor natural join film
where title='WYOMING STORM' order by 1, 2;
- Selecionar o primeiro e último nome dos atores que participam em filmes da categoria 'Drama', ordenado alfabeticamente pelo primeiro e último nome.
select first_name, last_name from (
select distinct actor_id ,first_name, last_name
from actor natural join film_actor natural join film natural join category
where name = 'drama'
) as tmp order by 1, 2;
- Selecionar o título dos filmes que apenas podem ser alugados na loja número 1, ordenado alfabeticamente pelo título.
select distinct title from film natural join inventory
where store_id = 1 and film_id not in (
select film_id from film natural join inventory
where store_id <> 1
)order by 1 asc;
- Selecionar o primeiro e último nome dos atores que já contracenaram com a actriz 'JULIA ZELLWEGER', ordenado alfabeticamente pelo primeiro e último nome.
select distinct first_name, last_name from actor natural join film_actor
where !(first_name='JULIA' and last_name='ZELLWEGER') and film_id in (
select film_id from actor natural join film_actor
where first_name='JULIA' and last_name='ZELLWEGER'
) order by 1, 2;
- Selecionar o número total de atores diferentes que entraram em filmes da categoria 'Action'.
select count(*) from (select distinct actor_id from film_actor natural join film natural join category
where name = 'Action') as tmp;
- Selecionar o primeiro e último nome dos clientes que já alugaram filmes em lojas situadas no mesmo país onde moram, ordenado alfabeticamente pelo primeiro e último nome.
select distinct first_name, last_name from inventory natural join rental natural join customer, store
where store.country = customer.country order by 1 asc, 2 asc;
- Selecionar, por categoria, o nome da categoria e a média da duração dos filmes dessa categoria, ordenado alfabeticamente pelo nome.
select name, avg(length) from (select name, length from film natural join category
union ALL
select name , 0 from category where category_id not in (select category_id from category natural join film)
) as tmp group by name order by 1 asc;
- Selecionar o nome das categorias para as quais existem mais filmes, ordenado alfabeticamente pelo nome.
select name from category
where category_id in (select category_id from film natural join category
group by category_id having count(film_id) = (select max(maxi) from (
select count(film_id) as maxi
from category natural join film group by category_id) as tmp1));
- Selecionar o primeiro e último nome dos clientes cujos alugueres de filmes totalizam a maior duração em minutos, ordenado alfabeticamente pelo primeiro e último nome.
select first_name, last_name from customer
where customer_id in (select customer_id from film natural join inventory natural join rental natural left join customer
group by customer_id having sum(length) = (select max(duracao) from (select sum(length) as duracao
from film natural join inventory natural join rental natural left join customer group by customer_id) as tmp1)) order by 1, 2;