10. Indique a expressão em SQL para responder às seguintes perguntas (no relatório indique também o resultado;
a. Em que locais do zoo se podem visitar aves?
SELECT DISTINCT local from animais
natural INNER JOIN classe_bio
WHERE classe LIKE 'aves'
| registo_local |
|---|
| A6 |
b. Em que locais do zoo não há carnívoros?
SELECT DISTINCT local from animais
natural INNER JOIN classe_bio
WHERE ordem not like 'carnívoros'
| registo_local |
|---|
| A6 |
| A2 |
| A1 |
c. Indique os irmãos da Kilu.
SELECT nome from animais
natural INNER JOIN cativeiro
WHERE registo_pai = (
SELECT registo_pai FROM cativeiro
NATURAL INNER JOIN animais
WHERE animais.nome = 'Kilu')
or
registo_mae = (SELECT registo_mae FROM cativeiro
NATURAL INNER JOIN animais
WHERE animais.nome = 'Kilu')
EXCEPT
SELECT nome FROM animais
WHERE nome = 'Kilu'
| nome |
|---|
| Kuli |
d. Indique os telefones do tratador responsável pela Kata.
SELECT numero FROM telefones
Natural inner JOIN tratador
Natural INNER JOIN animais
WHERE animais.nome LIKE 'Kata';
| numero |
|---|
| 266787809 |
| 919999999 |
e. Indique os telefones do responsável pelo auxiliar responsável pela local onde está a Kata.
WITH aux as (select nif from tratador_auxiliar
NATURAL INNER JOIN animais
where tratador_auxiliar.registo_local = animais.local and nome = 'Kata')
select numero from telefones
natural inner JOIN aux
Natural INNER JOIN responsavel
where responsavel.nif_funcionario = aux.nif
| numero |
|---|
| 919999996 |
| 266878806 |
f. Indique os tratamentos (data e tratamento) que a Mali já fez no zoo.
SELECT data_consulta,diagnostico FROM consultas
NATURAL INNER JOIN animais
WHERE nome LIKE 'Mali';
| data_consulta | diagnostico |
|---|---|
| 2005-08-12 | grávida |
| 2005-09-12 | cálcio injectado |
| 2005-12-12 | parto |
| 2006-07-12 | infecção |
| 2006-07-12 | antibiótico injectado |
g. Indique os nomes dos veterinários que já diagnosticaram uma gravidez a um carnívoro.
SELECT nome_func FROM funcionario
JOIN consultas on consultas.nif = funcionario.nif
join classe_bio on consultas.registo = classe_bio.registo
WHERE ordem LIKE 'carnívoros'
AND
diagnostico LIKE 'grávida'
| nome_funcionario |
|---|
| Pedro Vale |
h. Indique para cada família da ordem artiodáctilos quantos animais tem o zoo.
SELECT familia, COUNT(ordem) AS numAnimais
FROM classe_bio
WHERE ordem LIKE 'artiodáctilos'
GROUP BY familia;
| familia | numAnimais |
|---|---|
| cervídeos | 5 |
| hipopótamos | 3 |
i. Indique para cada espécie quais os pares de animais que podem ser acasalados, sabendo que não se devem acasalar pais com filhos ou irmãos.
WITH fem(femName,registo,especie) AS (SELECT animais.nome,animais.registo, especie FROM animais
NATURAL INNER JOIN classe_bio
WHERE sexo LIKE 'feminino'
ORDER BY especie),
mas(masName, registo,especie) AS (SELECT animais.nome, registo, especie FROM animais
NATURAL INNER JOIN classe_bio
WHERE sexo LIKE 'masculino'
ORDER BY especie),
catfem(nome, registo, registo_mae, registo_pai,especie) AS
(SELECT animais.nome , animais.registo,registo_mae, registo_pai,classe_bio.especie
FROM cativeiro NATURAL INNER JOIN animais
NATURAL INNER JOIN classe_bio
Where sexo like 'feminino'),
catmas(nome, registo, registo_mae, registo_pai,especie) AS
(SELECT animais.nome , animais.registo,registo_mae, registo_pai,classe_bio.especie
FROM cativeiro NATURAL INNER JOIN animais
NATURAL INNER JOIN classe_bio
Where sexo like 'masculino')
SELECT femName , masname, fem.especie FROM fem
JOIN mas ON fem.especie=mas.especie
EXCEPT
SELECT fem.femName , animais.nome, fem.especie FROM fem
JOIN cativeiro ON fem.registo = cativeiro.registo
JOIN animais ON cativeiro.registo_pai= animais.registo
EXCEPT
SELECT animais.nome, mas.masName , mas.especie FROM mas
JOIN cativeiro ON mas.registo = cativeiro.registo
JOIN animais ON cativeiro.registo_mae= animais.registo
EXCEPT
SELECT animais.nome,catmas.nome , catmas.especie from catmas
JOIN cativeiro on catmas.registo_mae=cativeiro.registo_mae
JOIN animais on cativeiro.registo=animais.registo
EXCEPT
SELECT animais.nome, catmas.nome ,catmas.especie from catmas
JOIN cativeiro on catmas.registo_pai=cativeiro.registo_pai
JOIN animais on cativeiro.registo=animais.registo
| Feminino | Masculino | especie |
|---|---|---|
| Zula | Zará | arara-azul-pequena |
| Rará | Zará | arara-azul-pequena |
| Zura | Zará | arara-azul-pequena |
| Rará | Ará | arara-azul-pequena |
| Tapi | Hipo | hipopótamo comum |
| Luka | Kaki | veado |
| Kalu | Kaki | veado |
| Kalu | Kuli | veado |
| Mali | Mata | tigre |
| Mali | Cáta | tigre |
| Aka | Cáta | tigre |
| Kata | Cáta | tigre |
| Kata | Taji | tigre |
| Mali | Taji | tigre |
j. Qual é a ordem com mais animais no zoo?
SELECT ordem, COUNT(ordem) AS num
FROM class_biologica
GROUP by ordem
Order by num DESC
LIMIT 1;
| ordem | num |
|---|---|
| artiodáctilos | 8 |
k. Qual é a ordem dos animais que têm mais de 5 consultas por ano(diagnóstico ou tratamento).
SELECT ordem, count(ordem) from classe_bio
natural INNER join consultas
where classe_bio.registo = consultas.registo
group by ordem
HAVING COUNT(ordem)>5;
| oredem | count |
|---|---|
| artiodáctilos | 12 |
| psittaciformes | 6 |
l. Indique o número de animais nascidos em cativeiro.
WITH anms as (SELECT registo, count(registo) as cat from cativeiro
group by registo)
select SUM(cat) from anms
| SUM |
|---|
| 10 |
m. Qual é o animal (nome e espécie) mais velho do zoo?
WITH A AS (SELECT data_nascimento AS dn , registo
FROM cativeiro
UNION
SELECT idd_estimada AS dn , registo
FROM captura)
SELECT nome FROM animais
WHERE registo=
(SELECT registo
FROM a
WHERE dn=(SELECT MIN(dn)
FROM a))
| maisVelho |
|---|
| Hipo |
n. Qual é o local húmido com mais mamíferos?
WITH mamiferos AS(SELECT registo FROM animais
NATURAL INNER JOIN classe_bio
WHERE classe LIKE 'mamíferos'),
mamiferosperplace AS(SELECT registo_local, COUNT(animais)AS num
FROM espacos JOIN animais
ON espacos.registo_local=animais.local
JOIN mamiferos
ON animais.registo=mamiferos.registo
WHERE espacos.clima LIKE '%húmido%'
group by registo_local)
SELECT registo_local FROM espacos
WHERE registo_local=
(SELECT registo_local
FROM mamiferosperplace
WHERE num=(SELECT MAX(num)
FROM mamiferosperplace))
| registo_local |
|---|
| A3 |
o. Para cada tratador indique o número de mamíferos por que é responsável?
WITH mamiferos AS(SELECT registo FROM animais
NATURAL INNER JOIN classe_bio
WHERE classe LIKE 'mamíferos'),
mamiferospertratador AS (SELECT nif,registo
FROM tratador NATURAL inner join mamiferos)
SELECT nome_func, COUNT(mamiferospertratador.nif)
AS mamifpertrat
FROM funcionario JOIN mamiferospertratador
ON funcionario.nif=mamiferospertratador.nif
GROUP BY nome_func
| nome_funcionario | mamifpertrat |
|---|---|
| Manuel Santos | 8 |
| Joaquim Silva | 7 |
p. Indique o nome dos animais que já foram tratados por todos os veterinários?
WITH constPedroVale as (Select registo from consultas
NATURAL INNER JOIN veterinarios
NATURAL INNER JOIN funcionario
WHERE funcionario.nome_func LIKE 'Pedro Vale'),
constIsabelSoares as (Select registo from consultas
NATURAL INNER JOIN veterinarios
NATURAL INNER JOIN funcionario
WHERE funcionario.nome_func LIKE 'Isabel Soares' )
select DISTINCT nome from animais
Natural inner join constPedroVale
NATURAL inner join constIsabelSoares
| nome |
|---|
| Tapi |
| Zula |