# DESAFIO DE BACK END - MODULO 1 ## Grupo 1 - Questões - Contagem, Agrupamentos e Comparações **1.** Quantos bruxos nascidos-trouxa (Muggle-born) ou mestiços (Half-blood) existem em cada casa (house)? Ordene-os decrescentemente e limite a busca em quatro (4) registros. Observe que não temos certeza sobre blood_status de alguns bruxos. Mas, nós estamos buscando aqui nessa questão pelos bruxos que são Muggle-born, Half-blood ou Muggle-born or Half-blood. ```sql select House, count(blood_status) from harry_potter where House is not null and (blood_status = 'Muggle-born' or blood_status = 'Half-blood') group by House order by count(blood_status) desc limit 4; ``` **2.** Qual é a casa que tem a menor quantidade de sangues-puro (Pure-blood), assumindo apenas aqueles que têm-se certeza? Remova, também, aqueles casos que a casa (House) seja nula e o (Blood Status) seja nula. ```sql select House, count(blood_status) from harry_potter where House is not null and blood_status = 'Pure-blood' and blood_status is not null group by House order by count(blood_status) limit 1; ``` **3.** Quantas pessoas existem na família Weasley (assuma pessoas com algum nome de Weasley)? ```sql select count(name) from harry_potter where name like '%Weasley' ; ``` **4.** Existe alguém na família Weasley que não seja ruivo (Red)? ```sql select count(name) from harry_potter where name like '%Weasley' and hair_colour = 'red' ; ``` **5.** Todo bruxo consegue aprender o feitiço do patrono, um feitiço de proteção que toma forma de um animal. É um feitiço complexo e nem todos os bruxos possuem um patrono. Existem pessoas que possuem o mesmo animal patrono (patronus)? Remova os casos em que os valores sejam Unknown (do inglês, desconhecido), Non-corporeal (Não possui forma animal) ou None (nenhum) e ordene-os pela quantidade decrescentemente, limitando nos 3 maiores resultados. ```sql select distinct patronus, count(*) from harry_potter where patronus <> 'Unknown' and patronus <> 'Non-corporeal' and patronus <> 'None' group by patronus order by count(*) desc limit 3 ; ``` **6.** Utilizando apenas uma consulta com possibilidade de subqueries, responda: busque pelos quatro bruxas ou bruxos que possuem nomes que deram origem ao nome das casas de Hogwarts (House). Remova aqueles que sejam da espécie fantasma (Ghost). A resposta deve conter o sobrenome, o nome e a espécie. ```sql select split_part(name, ' ', 2) as sobrenome, name, species from harry_potter where species <> 'Ghost' and name like '%Ravenclaw%' or name like '%Slytherin%' or name like '%Gryffindor%' or name like '%Hufflepuff%'; ``` **7.** Existiam bruxos que não eram da casa (house) Sonserina (Slytherin) que eram leais ao Lord Voldemort? Se existiram, qual são seus nomes? Desconsidere aqueles que não estão associados a nenhuma casa. A Resposta deve conter apenas o nome desses bruxos. ```sql select name from harry_potter where house <> 'Slytherin' and loyalty like '%Lord Voldemort%' ``` ## Grupo 2 - Questões - Lógica **1.** (REVISAR) A Batalha de Hogwarts foi uma intensa batalha em que vários bruxos morreram. Esta batalha ocorreu no dia 2 de maio (2 May) de 1998. Busque pelas quantidade de mortos nesta batalha entre aqueles que lutavam por Albus Dumbledore (Dumbledore's Army ou Albus Dumbledore) ou a Ordem da Fênix (Order of the Phoenix) versus aqueles que lutavam a favor de Lord Voldemort ou eram comensais da morte (Death Eaters), inclui-se também o nome Tom Marvolo Riddle que é o verdadeiro nome de Lord Voldemort. A resposta deve conter apenas os nomes, as casas e as lealdades. Dica: a busca por Dumbledore's Army pode ser feita da seguinte forma Dumbledore''s Army, ou seja com duas aspas simples ao pesquisar usando LIKE ou =. ```sql select name, house, loyalty from harry_potter where death = '2 May, 1998' and loyalty like '%Dumbledore''s Army%' or (loyalty like '%Albus Dumbledore%' or loyalty like '%Order of the Phoenix%' or loyalty like '%Lord Voldemort%' or loyalty like '%Death Eaters%' or loyalty like '%Tom Marvolo Riddle%') limit 9 ; ``` **2.** A primeira profecia de Sibila Trelawney é uma famosa profecia que colocou em dúvida quem seria o herói que teria poder para derrotar o grande vilão, Lord Voldemort. Provavelmente os bruxos não tinham um banco de dados tão interessante quanto o nosso mas a profecia tinha alguns requisitos que curiosamente alguns destes podem ser validados pelo dataset, a profecia dizia que um menino teria as seguintes características: ```sql select name from harry_potter where gender = 'Male' and (loyalty like '%Albus Dumbledore%' or loyalty like '%Order of the Phoenix%' or loyalty like '%Order of the Phoenix%') and ( birth = '29 July, 1980' or birth = '30 July, 1980' or birth = '31 July, 1980') ; ``` **3.** Busque por todos os trabalhos (job) e separe-os individualmente e por fim, ordene-os por quantidade descrecente, além disso, filtre-os por aqueles que possuem acima de 2. Lembre-se um personagem pode ter zero ou mais trabalhos e àqueles maiores que 1 são separados por | (barra vertical entre espaços); Cuidado: existe uma armadilha nessa pergunta: na resposta deve existir apenas trabalhos distintos. ```sql -- questao 3, grupo 2 select * from( select distinct unnest (string_to_array(job, ' | ')) as trabalho, count(job) from harry_potter group by trabalho order by count(job) desc ) as new_table where new_table.count >2; ``` **4.** (REVISAR. NÃO USEI SUBQUERIE MAS A RESPOSTA ESTÁ CERTA) Busque por todos aqueles que entram nessas restrições: * Nasceram em Setembro September (birth); * Não faleceram (death); * Não possuem nomes iguais àqueles achados na questão 7 (utilize subquery); * Possuem lealdade associada a alguém (loyalty); * Que seu patrono não seja Unknown nem Non-corporeal; * Que possuam alguma casa (house); * Sejam do gênero feminino (gender); A resposta deve conter os nomes das bruxas: ```sql select name from harry_potter where birth like '%September%' and death is null and loyalty is not null and patronus <> 'Unknown' and patronus <> 'Non-corporeal' and house is not null and gender = 'Female' --and name <> 'Peter Pettigrew' and name <> 'Quirinus Quirrell' ``` ## Grupo 3 - Questões - Subqueries e JOIN **1.A.** Busque por todos os nomes de bruxos e quebre as palavras a fim de encontrarmos cada palavra usada como nome; ```sql select unnest(string_to_array(name, ' ')) as nome from harry_potter limit 5; ``` **1.B.** Agora, agrupe os nomes a fim de encontrar a quantidade de vezes que o certo nome é repetido. (Lembre-se, existem pessoas com famílias, então espera-se repetição de nomes (que apareçam número maior do que 1)); ```sql select unnest(string_to_array(name, ' ')) as nome, count(name) from harry_potter group by name limit 5; ``` **1.C.** Ordene-as palavras usadas como nome pela quantidade de repetições; ```sql select * from (select nome1, count(*) from (select unnest (string_to_array(name, ' ')) as nome1 from harry_potter ) as new_table group by nome1 order by count(*) desc limit 5 ) as tabela; ``` **1.D.** Filtre por todos aqueles nomes que tiveram 4 ou mais repetições; ```sql select * from (select nome1, count(*) from (select unnest (string_to_array(name, ' ')) as nome1 from harry_potter ) as new_table group by nome1 order by count(*) desc ) as tabela where count >= 4; ``` **1.E.** Agora utilizando o recurso de JOIN, encontre todos os personagens que possuem nome que esteja no grupo encontrado na questão anterior (1.D); ```sql select * from(select name, unnest (string_to_array(name, ' ')) as nome, house from harry_potter) harry inner join (select * from (select nome1, count(*) from (select unnest (string_to_array(name, ' ')) as nome1 from harry_potter ) as new_table group by nome1 order by count(*) desc ) as tabela where count >= 4) hp on hp.nome1 = harry.nome; ``` **1.F.** Agora, filtre apenas por aqueles que estejam vinculados a casa de magia (house sejam IS NOT NULL); ```sql select * from(select name, unnest (string_to_array(name, ' ')) as nome, house from harry_potter) harry inner join (select * from (select nome1, count(*) from (select unnest (string_to_array(name, ' ')) as nome1 from harry_potter ) as new_table group by nome1 order by count(*) desc ) as tabela where count >= 4) hp on hp.nome1 = harry.nome where house is not null; ``` **1.G.** Agora, encontre a quantidade de pessoas por casa de magia (house). ```sql select house, count (nome)from(select name, unnest (string_to_array(name, ' ')) as nome, house from harry_potter) harry inner join (select * from (select nome1, count(*) from (select unnest (string_to_array(name, ' ')) as nome1 from harry_potter ) as new_table group by nome1 order by count(*) desc ) as tabela where count >= 4) hp on hp.nome1 = harry.nome where house is not null group by house ; ``` **2.A** Entre todas as habilidades, quebre-as e busque por aquelas que falem sobre as posições do Quadribol citadas anteriormente no enunciado. ```sql select unnest(string_to_array(skills, ' | ')) as nome from harry_potter where skills = 'Seeker' or skills = 'Keeper' or skills = 'Beater' or skills = 'Chaser' limit 5 ; ``` **2.B.** Sabendo das informações da questão anterior (2.A), liste a quantidade de jogadores por posição; ```sql select nome, count(nome) from ( select unnest(string_to_array(skills, ' | ')) as nome from harry_potter ) as table2 where (nome = 'Keeper' or nome = 'Seeker' or nome = 'Chaser' or nome = 'Beater') group by nome limit 5 ; ``` **2.C.** Sabendo das informações da questão anterior (2.B), ordene-os os registros encontrados e busque pela posição que possui MENOR quantidade de jogadores; ```sql select nome, count(nome) from ( select unnest(string_to_array(skills, ' | ')) as nome from harry_potter ) as table2 where (nome = 'Keeper' or nome = 'Seeker' or nome = 'Chaser' or nome = 'Beater') group by nome order by count(nome) limit 1 ; ``` **2.D.** Sabendo das informações da questão anterior (2.C), busque por todos os jogadores que são da posição encontrada. ```sql select name, nome1 from ( select name, unnest(string_to_array(skills, ' | ')) as nome1 from harry_potter) as table3 inner join( select nome, count(nome) from ( select unnest(string_to_array(skills, ' | ')) as nome from harry_potter ) as table2 where (nome = 'Keeper' or nome = 'Seeker' or nome = 'Chaser' or nome = 'Beater') group by nome order by count(nome) limit 1 ) as table4 on table3.nome1 = table4.nome ; ``` **3.** Para aqueles bruxos possuam patrono e que esses patronos não sejam Unknown, None e Non-corporeal nem NULL, busque pelos bruxos ou bruxas que possuem o mesmo animal. Por fim, ordene-os alfabeticamente e traga a informação de nome e o patrono. ```sql select name, patronus from harry_potter where patronus in ( select patronus from ( select patronus, count(patronus) from ( select name, patronus from harry_potter ) as table1 group by patronus ) as table2 where patronus is not null and patronus <> 'Unknown' and patronus <> 'None' and patronus <> 'Non-corporeal' and count >1 ) order by patronus ; ``` **4.A.** Busque por todas possibilidades individuais de lealdade (Loyalty). Dica: os valores estão listados separando cada valor por | (barra vertical entre espaços); ```sql select unnest (string_to_array(loyalty, ' | ' )) as lealdade from harry_potter limit 5; ``` **4.B.** Após saber da informação (4.A), busque por estas mesmas lealdades e suas respectivas quantidades; ```sql select unnest (string_to_array(loyalty, ' | ' )) as nome, count(*) from harry_potter group by nome order by count(*) desc ; ``` **4.C.** Após saber da informação (4.B), busque por aquela lealdade que possui quantidade igual a 4 e que não seja igual ao ministro da magia (Minister of Magic). ```sql select * from ( select unnest (string_to_array(loyalty, ' | ' )) as nome, count(*) from harry_potter group by nome order by count(*) desc ) as table1 where nome <> 'Minister of Magic' and count = 4 ; ``` **4.D.** Após saber da informação (4.C), busque pelo nome das pessoas que possuem lealdade ao indíviduo ou organização encontrada na ©. ```sql select name from ( -- esse select está mostrando os nomes select name, unnest (string_to_array(loyalty, ' | ' )) as nome1 from harry_potter -- esse select esta districhando as lealdades pq na primeira tabela as lealdades foram separadas. o name é para referenciar a tabela para nao ficar vazia quando usar o inner join ) as table3 inner join ( select * from ( select unnest (string_to_array(loyalty, ' | ' )) as nome, count(*) from harry_potter group by nome order by count(*) desc ) as table1 where nome <> 'Minister of Magic' and count = 4 )as table2 on table3.nome1 = table2.nome -- aqui ele ta unindo a igualdade entre as tabelas ```