# #Back-end - A10-11 - 28/07
##### Aluno: Pedro Ciccone
###### tags: `Back-end`
### Exercícios aula
**0.** Para o dataset de `times_dataset`, busque:
**A.** Pelas categorias que tiveram mais honras, liste as 5 mais honradas.
```
select
category, count(*)
from times
group by
category
order by
count desc
limit 5;
```
**B.** Busque pelas categorias que tiveram entre 3 e 6 honras.
```
select *
from (
select category, count(*)
from times
group by category
order by count desc
) as honras
where count between 3 and 6;
```
**C.** Com os dados da resposta anterior, busque as honras que sejam as duas mais premiadas (baseando na resposta anterior).
```
select name, category, year
from times
where category in (
select category from (
select category, count(*)
from times
group by category
order by count desc
) as honras
where count between 3 and 6
order by count desc
limit 2
);
```
**1.** No dataset de `nobel`, busque por:
**A.** Para os países que mais tiveram honras (assume-se o país de nascimento), busque por aqueles que tiveram entre 10 e 50 honras. Dica: Subquery no `FROM`;
```
select *
from (
select birth_country, count(*)
from nobel
group by birth_country
order by count desc) as award
where count between 10 and 50;
```
**B.** Existem divisões no prêmio, a coluna `prize_share` refere-se à divisão, ex: 1/1 significa que o prêmio não foi dividido, 1/2 significa que duas pessoas dividiram a premiação, 1/3 significa 3 pessoas, e 1/4, 4 pessoas. Quais divisões são as menos comuns?
Resposta: as menos comuns são as divisões entre 4 pessoas.
```
select
prize_share, count(*)
from nobel
group by
prize_share
order by
count asc;
```
**C.** Utilizando a consulta da resposta anterior como base, busque por todas as premiações que entram na restrição de ser a menos comum em relação a divisão. Utilize subqueries para responder essa pergunta!
```
select *
from nobel
where prize_share = (
select prize_share
from nobel
group by prize_share
order by count(*) asc
limit 1
);
```
**D.** Com base nos resultados da **1.C**, obtenha a quantidade de premiações por categoria. Ordene-as por quantidade de premiações.
```
select
category, count(*)
from nobel
where prize_share = (
select prize_share
from nobel
group by prize_share
order by count(*) asc
limit 1
)
group by
category
order by
count desc;
```
**E.** Utilizando a consulta da resposta anterior como base, busque pela categoria que obteve acima de 30 honras. Utilize subquery para responder essa pergunta!
```
select *
from (
select category, count(*) from nobel
where prize_share = (
select prize_share
from nobel
group by prize_share
order by count(*) asc
limit 1
)
group by category
order by count desc
) as amount
where
count > 30;
```
**2.** Nos datasets de `cervejas` e `cervejarias`, busque por:
**A.** Quais palavras mais comuns para nomes de cervejarias? Liste as mais comuns e limite a quantidade em 4 itens.
```
select distinct
unnest (string_to_array (name, ' ')) as nomes,
count(name)
from cervejarias
group by
nomes
order by
count desc
limit 4;
```
**B.** Quais palavras mais comuns para nomes de cervejas? Liste as mais comuns e limite a quantidade em 5 itens.
```
select distinct
unnest (string_to_array (name, ' ')) as nomes,
count(name)
from cervejas
group by
nomes
order by
count desc
limit 5;
```
**C.** Agora, busque pelas palavras menos comuns para os nomes de cervejarias, aquelas que são utilizadas apenas uma vez. Qual a quantidade de palavras que são usadas apenas uma vez?
```
select count(*) from
(select nome, count(*) from
(select unnest (string_to_array (name, ' ')) as nome
from cervejarias
) as menos_usadas
group by nome
order by count(*) desc
) as cervejarias_qtd
where count = 1;
```
**D.** Agora, ao invés de cervejarias, busque por palavras menos utilizadas para cervejas, aquelas que são utilizadas apenas uma vez. Qual a quantidade de palavras que são usadas apenas uma vez?
```
select count(*) from
(select nome, count(*) from
(select unnest (string_to_array (name, ' ')) as nome
from cervejas
) as menos_usadas
group by nome
order by count(*) desc
) as cervejas_qtd
where count = 1;
```
**E.** Busque por todas as palavras que apareçam tanto em nome de cervejarias quanto em nome de cervejas, qual a quantidade de palavras que entram nessa condição? Dica: Interseção!
```
select count(cervejas.nome) from (
select unnest (string_to_array (name, ' ')) as nome, count(*)
from cervejas
group by nome
order by count(*) desc
) as cervejas
inner join
(select * from (
select unnest (string_to_array (name, ' ')) as nome, count(*)
from cervejarias
group by nome
order by count(*) desc) as cervejarias
) as cervejarias
on cervejas.nome = cervejarias.nome
; = cervejarias.nome
group by nome;
```
**3.** No dataset do `netflix`, busque por:
**A.** A lista de todos atores ou atrizes que participaram de alguma produção.
```
select distinct unnest(string_to_array(casting, ', '))
from netflix;
```
**B.** Depois, encontre a quantidade de participações que cada um desses atores e atrizes tiveram.
```
select
unnest(string_to_array(casting, ', ')) as actors,
count(*)
from netflix
group by actors
order by count desc;
```
**C.** Depois, busque os/as 10 que mais tiveram participações.
```
select
unnest(string_to_array(casting, ', ')) as actors,
count(*)
from netflix
group by actors
order by
count desc
limit 10;
```
**D.** Desconsiderando o exercício anterior (**3.C**), para a lista de todos os atores e atrizes e suas participações, busque por aqueles que tiveram entre 10 e 30 participações, mas não aqueles que tiveram entre 15 e 20 participações.
```
select * from (
select
unnest(string_to_array(casting, ', ')) as actors,
count(*)
from netflix
group by actors
order by
count desc
) as participacoes
where
count between 10 and 30
and not count between 15 and 20
;
```
**E.** Com base na lista de todos os atores e atrizes e suas participações, busque por aqueles que tiveram 10 ou mais participações em produções de países exclusivos (somente um país participou da produção) e que não atuaram em filmes indianos (India).
```
select * from (
select
unnest(string_to_array(casting, ', ')) as actors,
country,
count(*)
from netflix
where
country <> '%,%'
and country <> 'India'
group by actors, country
order by
count desc
) as participacoes
where count >= 10
;
```
**F.** Quais atores ou atrizes atuaram também como diretores em alguma produção? Após encontrar as informações, ordene-as em ordem alfabética. Dica: JOIN!
```
select actors.nome from
(select distinct
unnest(string_to_array (casting, ', ')) as nome
from netflix) as actors
inner join
(select distinct
unnest(string_to_array (director, ', ')) as nome
from netflix) as directors
on actors.nome = directors.nome
order by actors.nome asc
;
```
**4.** No dataset do `netflix`, busque por:
**A.** A lista das produções realizadas por países exclusivos (apenas um país participou da produção).
```
select distinct
title,
unnest(string_to_array(country, ', ')) as country
from netflix
order by
title asc;
```
**B.** As palavras mais comuns nos títulos para todas as produções de países exclusivos, ordenando-as pela quantidade. Não se preocupe com pontuações (`:`, `,`, `!`) no título.
```
select
unnest(string_to_array(title, ' ')) as palavras,
count(*)
from netflix
where
country not like '%,%'
group by palavras
order by count desc
;
```
**C.** Utilizando a query anterior como base, busque por palavras que foram utilizadas entre 20 e 40 vezes.
```
select * from (
select unnest(string_to_array(title, ' ')) as palavras,
count(*)
from netflix
where
country not like '%,%'
group by palavras
order by count desc
) as contagem
where
count between 20 and 40
;
```
**D.** A partir da questão **4.B**, encontre a oitava palavra mais utilizada em títulos.
```
select contagem.palavras from (
select
unnest(string_to_array(title, ' ')) as palavras,
count(*)
from netflix
where
country not like '%,%'
group by palavras
order by count desc
) as contagem
offset 7
limit 1
;
```