Buscar

4. Aula de Laboratório # 4 2014.1 - Gabarito

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 3 páginas

Prévia do material em texto

Universidade Federal do Piauí – Oracle (2013.2) Prof. Dr. Luiz Claudio Demes M. Sousa 
 
Sefaz: Macintosh HD:Users:claudiodemes:Dropbox:Pessoal Dropbox:Universidades:UFPI Academico:2013.2:Fundamentos de BD:Laboratorio:Gabarito de Aula de Laboratorio # 4 2013.2.doc 1 
AULA DE LABORATÓRIO NR. 4 – SUBCONSULTAS 
 
Objetivo: Ensinar a utilização de subconsultas na cláusula 
WHERE (consultas aninhadas). 
Pré-requisito importante: Saber utilizar ALIAS (apelidos). 
TEORIA: 
A linguagem SQL permite que coloquemos em um consulta uma outra consulta na sua 
cláusula WHERE. Dessa forma, podemos ter várias consultas aninhadas. Um exemplo 
de consulta aninhada foi visto na aula de laboratório NR 3. Veja uma consulta sem 
aninhamento: 
 
Consulta sem aninhamento: 
select d.deptno, d.dname, sum(sal) 
from emp e, dept d 
where e.deptno=d.deptno 
group by d.deptno, d.dname 
having max(sal) < 5000 
A consulta acima retorna a soma total dos salários de todos os departamentos em que o 
maior salário não chega a 5000,00. 
A mesma consulta pode ser feita usando aninhamento: 
select d.deptno, d.dname, sum(sal) 
from emp e, dept d 
where d.deptno=e.deptno 
and 
5000 > (select max(sal) from emp i 
 where i.deptno = d.deptno) 
 group by deptno) 
group by d.deptno, d.dname 
Apesar da solução usando aninhamento ser mais complexa, novas possibilidades de 
soluções surgem. Trocamos simplicidade por PODER. No exemplo anterior, a 
subconsulta está sombreada. Verifique que ela fica na cláusula WHERE da consulta 
principal (chamada de consulta externa). Pense: Existe um tradeoff entre poder e 
simplicidade? 
Suponha agora que devemos retornar todos os nomes de funcionário, seu salário e nome 
do departamento em que trabalha. Além disso, o funcionário deverá ganhar mais que a 
média salarial da empresa. Nesse caso, não é possível uma solução usando having. 
Sendo assim, devemos aprender a usar consultas aninhadas para resolver esse tipo de 
questão. 
Voltando para o nosso exemplo anterior, vamos dividir a consulta em suas partes: a 
parte externa e a parte interna (sombreada). Dessa forma o entendimento de como o 
aninhamento funciona será mais fácil. Além dessa divisão, vamos retirar a linha where 
i.deptno = d.deptno da consulta interna. No futuro iremos acrescentá-la novamente. 
Feita a divisão, ficaremos com as seguintes consultas: 
EXTERNA INTERNA 
select d.deptno, d.dname, sum(sal) 
from emp e, dept d 
where d.deptno=e.deptno 
group by d.deptno, d.dname 
Select max(sal) 
from emp 
Group by deptno 
 
Os conjuntos resultantes das consultas são mostrados nos diagramas abaixo: 
 
 
Temos agora dois conjuntos e agora vamos entender como o SQL funciona: Para cada 
linha do conjunto EXTERNO, ele faz o teste da cláusula WHERE (onde está a 
subconsulta) com o conjunto INTERNO. No nosso exemplo, o teste é verificar se 5000 
é maior que o valor retornado para cada linha do conjunto INTERNO. Se o teste for 
verdadeiro, a linha testada do conjunto EXTERNO é mostrada, caso contrário, ela não é 
retornada. 
Vamos imaginar que ele já testou a linha 1 e agora está testando a linha 2 
 (20 RESEARCH 10875). O teste será realizado três vezes (uma teste para cada linha do 
conjunto INTERNO). Sendo assim os testes realizados serão: 
5000 > 5000 ? (falso) 
5000 > 3000 ? (verdade) 
5000 > 2850 ? (verdade) 
 
Universidade Federal do Piauí – Oracle (2013.2) Prof. Dr. Luiz Claudio Demes M. Sousa 
 
Sefaz: Macintosh HD:Users:claudiodemes:Dropbox:Pessoal Dropbox:Universidades:UFPI Academico:2013.2:Fundamentos de BD:Laboratorio:Gabarito de Aula de Laboratorio # 4 2013.2.doc 2 
Como nos testes acima, temos dois testes verdadeiros, o resultado final irá mostrar 
 20 RESEARCH 10875 DUAS VEZES!. Isso aconteceu porque retiramos da consulta 
interna a linha where i.deptno = d.deptno. Essa linha faz com que o conjunto 
INTERNO retorne apenas uma linha, ao invés de três. A linha retornada será 
exatamente o maior salário do departamento que se está testando no momento. Como 
estamos pegando como exemplo a linha 20 RESEARCH 10875, no momento que o 
SQL estiver testando essa linha, teremos os conjuntos abaixo, se a linha where 
i.deptno = d.deptno. for acrescentada: 
 
Sendo assim, teremos apenas um teste que será verdadeiro e a linha 2 será retornada 
apenas uma vez, aos invés de duas. Dando assim, o resultado correto. 
 
Perguntas: 
+ Qual a linha do conjunto interno quando o SQL estiver testando a linha 3 do 
conjunto externo? 
+ A cláusula where i.deptno = d.deptno afeta o resultado para a linha 1? 
Por quê? 
Observe a importância do ALIAS. Só conseguimos acrescentar a cláusula where 
i.deptno = d.deptno utilizando uma ALIAS para DEPT na consulta EXTERNA e 
um ALIAS para EMP na consulta INTERNA. 
No nosso exemplo, utilizamos um teste em que o operador era maior que (>). Nas 
consultas aninhadas, podemos ter ainda os seguintes operadores, além dos comuns: 
 
 
 
 
 
OPER EXEMPLO DE USO EXPLICAÇÂO 
IN 5000 IN (select Max(sal) 
from emp) 
5000 é um valor QUE ESTÁ no conjunto 
interno? 
NOT IN 5000 NOT IN (select 
Max(sal) from emp) 
5000 é um valor QUE NÃO ESTÁ no 
conjunto interno? 
EXISTS 5000 EXISTS (select 
Max(sal) from emp) 
5000 é um valor QUE EXISTE no 
conjunto interno? 
NOT 
EXISTS 
5000 NOT EXISTS (select 
Max(sal) from emp) 
5000 é um valor QUE NÃO EXISTE no 
conjunto interno? 
ALL 5000 > ALL (select 
Max(sal) from emp) 
5000 é MAIOR QUE TODOS os valores do 
conjunto interno? 
ANY 5000 > ANY (select 
Max(sal) from emp) 
5000 é MAIOR QUE QUALQUER um dos 
valores do conjunto interno? 
 
EXERCÍCIOS PRÁTICOS 
1. Retorne o NOME, SALARIO E NUMERO DO DEPARTAMENTO dos 
funcionários que ganham mais que a média salarial da 
empresa. 
2. Retorne o NOME dos departamentos que possuem mais de 4 
funcionários. (use consultas aninhadas); 
3. Retorne o NOME, SALARIO E NOME DO DEPARTAMENTO dos 
funcionários que ganham mais que QUALQUER um dos 
funcionários do departamento 20. 
4. Retorne o NOME, SALARIO E NOME DO DEPARTAMENTO dos 
funcionários que ganham mais que a média de QUALQUER um 
dos departamentos da empresa. 
5. Retorne o NOME, SALARIO E NOME DO DEPARTAMENTO dos 
funcionários que não trabalham no departamento 10 (use 
consultas aninhadas). 
6. Selecione o NOME DO FUNCIONARIO e NOME DO DEPARTAMENTO 
dos funcionários que trabalham em um departamento que 
possui mais de 4 funcionários lotados. 
7. Selecione os funcionários que gerenciam mais de dois 
funcionários; 
8. Selecione os funcionários que não gerenciam ninguém; 
9. Desafio 1: Selecione os funcionários que ganham mais 
que a média de seus departamentos e que não gerenciam 
ninguém. 
10. Desafio 2: Selecione os funcionários gerentes que 
ganham mais que a média salarial da empresa. 
 
 
 
Universidade Federal do Piauí – Oracle (2013.2) Prof. Dr. Luiz Claudio Demes M. Sousa 
 
Sefaz: Macintosh HD:Users:claudiodemes:Dropbox:Pessoal Dropbox:Universidades:UFPI Academico:2013.2:Fundamentos de BD:Laboratorio:Gabarito de Aula de Laboratorio # 4 2013.2.doc 3 
 
1. Retorne o NOME, SALARIO E NUMERO DO 
DEPARTAMENTO dos funcionários que ganham 
mais que a média salarial da empresa. 
Select ENAME, SAL, DEPTNO from EMP where SAL > 
(Select AVG(SAL) from EMP); 
 
2. Retorne o NOME dos departamentos que 
possuem mais de 4 funcionários. (use 
consultas aninhadas); 
Select DNAME from DEPT D where 4 > (Select 
count(empno) from EMP where D.deptno = 
E.deptno); 
 
3. Retorne o NOME, SALARIO E NOME DO 
DEPARTAMENTO dos funcionários que ganham 
mais que QUALQUER um dos funcionários do 
departamento 20. 
Select DNAME, ENAME, SAL from DEPT D, EMP E 
where E.Deptno = D.Deptno and sal > (Select 
min(sal) from EMP I where I.deptno = 20); 
 
4. Retorne o NOME, SALARIO E NOME DO 
DEPARTAMENTOdos funcionários que ganham 
mais que a média de QUALQUER um dos 
departamentos da empresa. 
Select DNAME, ENAME, SAL from DEPT D, EMP E 
where E.Deptno = D.Deptno and sal > any (Select 
avg(sal) from EMP I group by deptno); 
 
5. Retorne o NOME, SALARIO E NOME DO 
DEPARTAMENTO dos funcionários que não 
trabalham no departamento 10 (use consultas 
aninhadas). 
Select DNAME, ENAME, SAL from DEPT D, EMP E 
where E.Deptno = D.Deptno and deptno <> 
(Select deptno from Dept where Deptno = 10); 
 
6. Selecione o NOME DO FUNCIONARIO e NOME DO 
DEPARTAMENTO dos funcionários que trabalham 
em um departamento que possui mais de 4 
funcionários lotados. 
Select DNAME, ENAME from DEPT D, EMP E where 
E.Deptno = D.Deptno AND 4 < (Select 
count(empno) from Emp I where I.Deptno = 
E.Deptno); 
 
7. Selecione os funcionários que gerenciam 
mais de dois funcionários; 
Select ENAME from EMP E where E.empno in 
(Select G.empno from Emp I, Emp G where 
I.Mgr = G.Empno group by mgr having 
count(empno) > 2); 
 
8. Selecione os funcionários que não gerenciam 
ninguém; 
Select ENAME from EMP E where E.empno not in 
(Select mgr from Emp) 
 
 
9. Desafio 1: Selecione os funcionários que 
ganham mais que a média de seus 
departamentos e que não gerenciam ninguém. 
Select ENAME from EMP E where E.sal > 
(select Avg(Sal) from Emp K where K.deptno = 
E.deptno) And E.empno not in (Select mgr 
from Emp) 
 
10. Desafio 2: Selecione os funcionários 
gerentes que ganham mais que a média 
salarial da empresa. 
Select ENAME from EMP E where E.sal > 
(select Avg(Sal) from Emp) And E.empno in 
(Select mgr from Emp)

Outros materiais