Skip to content

Instantly share code, notes, and snippets.

@MrSuicideParrot
Last active May 16, 2018 16:43
Show Gist options
  • Save MrSuicideParrot/b9295abf9b032e0797e83474a0a6a2b3 to your computer and use it in GitHub Desktop.
Save MrSuicideParrot/b9295abf9b032e0797e83474a0a6a2b3 to your computer and use it in GitHub Desktop.
Resoluções dos exercicios de SQL da cadeira Base de Dados do ano 2017

Resoluções de Base de Dados - 2017

Conteúdo:

SQL1 - Aula 6

  1. 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.

  1. 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;
  1. 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;
  1. 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;
  1. 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;
  1. 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;
  1. 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;

SQL2 - Aula 7

  1. 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.

  1. 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);
  1. 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

  1. 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;
  1. 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;
  1. 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

  1. 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


SQL3 - Aula 8

  1. 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;
  1. 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;
  1. 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 ;
  1. 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;
  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;
  1. 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
  1. 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


SQL4 - Aula 9

  1. 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;
  1. 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;
  1. 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;
  1. 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;
  1. 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;
  1. 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;
  1. 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;
  1. 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;
  1. 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));
  1. 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;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment