```sql CUBOS ACADEMY Semana de Desafio - Módulo 1 - Grupos 1, 2 e 3 GRUPO 1 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(*) from harry_potter where blood_status is not null and blood_status ='Half-blood' or blood_status = 'Muggle-born' group by house order by count(*) 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. select house, count(*) from harry_potter where blood_status is not null and house is not null and blood_status ='Pure-blood' group by house order by count(*) limit 1 ; 3 Quantas pessoas existem na família Weasley (assuma pessoas com algum nome de Weasley)? select count(*) from harry_potter where name like '%Weasley' ; 4 Existe alguém na família Weasley que não seja ruivo (Red)? select count(*) 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, Non-corporeal ou None(do inglês, desconhecido) e ordene-os pela quantidade decrescentemente, limitando nos 3 maiores resultados. select 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, 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. select * from (select split_part(name, ' ', 2) as sobrenome, name, species from harry_potter where species <> 'Ghost' and birth is not null) as fundadores where (sobrenome = 'Gryffindor' or sobrenome = 'Ravenclaw' or sobrenome = 'Slytherin' or sobrenome ='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 e suas casas? Desconsidere aqueles que não estão associados a nenhuma casa. A Resposta deve conter apenas o nome desses bruxos. select name from harry_potter where house <> 'Slytherin' and loyalty like '%Voldemort%' ; GRUPO 2 1 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 =. select name, house, loyalty from harry_potter where death = '2 May, 1998' and death is not null order by house ; 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: ser do gênero masculino. seus pais tinham desafiado Voldemort três vezes e sobreviveram. ele teria um poder que Voldemort era incapaz ou não queria compreender. nascido nos últimos dias de julho de 1980, ano em que a profecia foi feita (possivelmente 29, 30 ou 31). se mais de uma pessoa nascesse que satisfizer os requisitos, o próprio Voldemort iria escolher a quem acabaria por se referir. Sua meta é encontrar nomes que poderiam satisfazer nossa vontade de descobrir quem poderia ser o herói. Observação: Bom, como dizia o ditado: O inimigo do meu inimigo é meu amigo. Podemos assumir que aliados a Albus Dumbledore, Albus ou a Order of the Phoenix (Ordem da Fênix) eram também inimigos de Voldermort. Então isso pode ser um bom indicativo para tentar identificar nosso(s) herói(s). Com base nesses requisitos quem são os possíveis heróis? A resposta deve conter apenas o nome do bruxo. select name from harry_potter where gender = 'Male' and birth between '29 July, 1980' and '31, July, 1980' and loyalty like '%Dumbledore%' ; 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. select * from (select nome, count(*) from (select unnest(string_to_array(job, ' | ')) as nome from harry_potter) as trabalho group by nome order by count desc) as hp1 where count > 2 ; ou select nome, count(*) from (select unnest(string_to_array(job, ' | ')) as nome from harry_potter) as trabalho group by nome order by count desc limit 5 ; 4 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: select name from harry_potter where name not in (select name from harry_potter where house <> 'Slytherin' and loyalty like '%Voldemort%') and birth like '%September%' and death is null and loyalty is not null and house not like '%|%' and gender = 'Female' and patronus <> 'Unknown' and patronus <> 'Non-corporeal' ; ou select name from harry_potter where birth like '%September%' and death is null and loyalty is not null and house not like '%|%' and gender = 'Female' and patronus <> 'Unknown' and patronus <> 'Non-corporeal' ; GRUPO 3 1. Todas proposições abaixo PRECISAM ser executadas em uma só consulta podendo utilizar subconsultas. 1.A. Busque por todos os nomes de bruxos e quebre as palavras a fim de encontrarmos cada palavra usada como nome; Primeiros 5 registros (podem não ser os mesmos registros) select name from (select unnest(string_to_array(name, ' ')) as name from harry_potter where gender = 'Male' ) as nome 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)); select name, count(*) from (select unnest(string_to_array(name, ' ')) as name from harry_potter ) as nome group by name limit 5 ; 1.C. Ordene-as palavras usadas como nome pela quantidade de repetições; select name, count(*) from (select unnest(string_to_array(name, ' ')) as name from harry_potter ) as nome1 group by name order by count desc limit 5 ; 1.D. Filtre por todos aqueles nomes que tiveram 4 ou mais repetições; select * from (select name, count(*) from (select unnest(string_to_array(name, ' ')) as name from harry_potter ) as nome1 group by name order by count desc ) as repeticoes 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); select tab1.name, tab1.nome, tab1.house from (select unnest(string_to_array(name, ' ')) as nome, name, house from harry_potter) tab1 inner join (select * from (select name, count(*) from (select unnest(string_to_array(name, ' ')) as name from harry_potter) as nome1 group by name ) as repeticoes where count >= 4 ) tab2 on tab2.name = tab1.nome ; 1.F. Agora, filtre apenas por aqueles que estejam vinculados a casa de magia (house sejam IS NOT NULL); select tab1.name, tab1.nome, tab1.house from (select unnest(string_to_array(name, ' ')) as nome, name, house from harry_potter) tab1 inner join (select * from (select name, count(*) from (select unnest(string_to_array(name, ' ')) as name from harry_potter) as nome1 group by name ) as repeticoes where count >= 4 ) tab2 on tab2.name = tab1.nome where house is not null ; 1.G. Agora, encontre a quantidade de pessoas por casa de magia (house). select tab1.house, count(tab1.house) from (select unnest(string_to_array(name, ' ')) as nome, name, house from harry_potter) tab1 inner join (select * from (select name, count(*) from (select unnest(string_to_array(name, ' ')) as name from harry_potter) as nome1 group by name ) as repeticoes where count >= 4 ) tab2 on tab2.name = tab1.nome where tab1.house is not null group by tab1.house order by count ; 2. Todas proposições abaixo PRECISAM ser executadas em uma só consulta podendo utilizar subconsultas. O quadribol é um esporte bastante popular entre bruxos e existem várias posições muito parecidas com o Futebol ou Volei. No Quadribol, existem o apanhador (Seeker), o artilheiro (Chaser), o batedor (Beater) e até mesmo o goleiro (Keeper); A coluna de habilidades (skills) listam várias habilidades separadas por | (barra vertical entre espaços). Responda as perguntas abaixo com uma única consulta podendo utilizar subqueries: A. Entre todas as habilidades, quebre-as e busque por aquelas que falem sobre as posições do Quadribol citadas anteriormente no enunciado. select * from (select unnest(string_to_array(skills, ' | ')) as nome from harry_potter ) as habilidade where nome = 'Seeker' or nome = 'Chaser' or nome = 'Beater' or nome = 'Keeper' limit 5 ; B. Sabendo das informações da questão anterior (2.A), liste a quantidade de jogadores por posição; select nome, count(*) from (select unnest(string_to_array(skills, ' | ')) as nome from harry_potter) as habilidade where nome = 'Seeker' or nome = 'Chaser' or nome = 'Beater' or nome = 'Keeper' group by nome order by nome ; 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; select nome, count(*) from (select unnest(string_to_array(skills, ' | ')) as nome from harry_potter) as habilidade where nome = 'Seeker' or nome = 'Chaser' or nome = 'Beater' or nome = 'Keeper' group by nome order by count(*) limit 1 ; D. Sabendo das informações da questão anterior (2.C), busque por todos os jogadores que são da posição encontrada. select jogador1.name, jogador2.nome from (select name, unnest(string_to_array(skills, ' | ')) as nome1 from harry_potter) as jogador1 inner join (select nome, count(*) from (select unnest(string_to_array(skills, ' | ')) as nome from harry_potter) as habilidade where nome = 'Seeker' or nome = 'Chaser' or nome = 'Beater' or nome = 'Keeper' group by nome order by count(*) limit 1) as jogador2 on jogador1.nome1 = jogador2.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. select donos.name, animal.patronus from (select name, patronus from harry_potter ) as donos inner join (select * from (select patronus, count(*) from harry_potter where patronus is not null and patronus <> 'None' and patronus <> 'Non-corporeal' and patronus <> 'Unknown' group by patronus order by count(*) desc ) as patronus where count >= 2) as animal on donos.patronus = animal.patronus order by donos.patronus ; 4. Todas proposições abaixo PRECISAM ser executadas em uma só consulta podendo utilizar subconsultas: A. Busque por todas possibilidades individuais de lealdade (Loyalty). Dica: os valores estão listados separando cada valor por | (barra vertical entre espaços); select unnest(string_to_array(loyalty, '|')) as nome from harry_potter limit 5 ; B. Após saber da informação (4.A), busque por estas mesmas lealdades e suas respectivas quantidades; select nome, count(*) from (select unnest(string_to_array(loyalty, ' | ')) as nome from harry_potter) as leal group by nome order by count(*) desc ; 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). select * from (select nome, count(*) from (select unnest(string_to_array(loyalty, ' | ')) as nome from harry_potter) as leal group by nome order by count(*) desc) as leal2 where nome <> 'Minister of Magic' and count = 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 ©. select name , hp2.nome from(select name, unnest(string_to_array(loyalty, ' | ')) as nome from harry_potter) as hp inner join (select * from (select nome, count(*) from (select unnest(string_to_array(loyalty, ' | ')) as nome from harry_potter) as leal group by nome order by count(*) desc) as leal2 where nome <> 'Minister of Magic' and count = 4 ) as hp2 on hp.nome = hp2.nome ;