Banco de Dados
Introdução a BD
Prof. Marcelo Iury de Sousa Oliveira
marcelo@ci.ufpb.br
http://sites.google.com/site/marceloiury
Banco de Dados
Aula 8 – SQL: Consultas Aninhadas e Conjuntos
(Baseado no material da Profa. Bernadette Lóscio)
FROM alunos a, notas b WHERE a.matricula = b. matricula
AND b.media >80;
2
Motivação
Alunos | |
Matricula | Nome |
V001 | Val Donato |
V002 | Seu Pereira |
V003 | Totonho |
V004 | Chico Cesar |
Notas | |
Matricula | Media |
V001 | 95 |
V002 | 80 |
V003 | 74 |
V004 | 81 |
3
Motivação
Vamos aninhar consultas?
Exemplo
Banco de Dados de Exemplo
Insert into Disciplina values ('Artes das Trevas', 'IF971', '60h') ;
Insert into Disciplina values ('Trato de Criaturas Mágicas', 'IF972', '60h');
Insert into Disciplina values ('Defesa Contra Artes das Trevas', 'IF973', '75h');
Insert into Disciplina values ('Poções', 'IF974', '75h');
Insert into Disciplina values ('Herbologia', 'IF975', '60h');
Insert into Departamento values ('Magia', 'D003');
Insert into Departamento values ('Ervas e Plantas', 'D001');
Insert into Departamento values ('Criaturas Mágicas', 'D001');
Insert into Professor values ('Severo Snape', '16710', 'Adjunto 1', 1000.00, 'D003') ;
Insert into Professor values ('Remo Lupin', '16720', 'Adjunto 2', 2000.00, 'D003');
Insert into Professor values ('Rúbeo Hagrid', '16730', 'Adjunto 1', 1500.00, 'D001');
Insert into Professor values ('Horácio Slughorn', '16740', 'Adjunto 1', 1500.00, 'D003');
Insert into Professor values ('Pomona Sprout', '16750', 'Adjunto 1', 1500.00, 'D002');
Insert into Professor values ('Guilhermina Grubbly-Plank', '16760', 'Adjunto 1', 1500.00, 'D001');
Insert into Ministra values ('16710', 'IF971', '2020.1');
Insert into Ministra values ('16710', 'IF971', '2020.2');
Insert into Ministra values ('16730', 'IF972', '2020.1');
Insert into Ministra values ('16730', 'IF972', '2020.2');
Insert into Ministra values ('16720', 'IF973', '2020.1');
Insert into Ministra values ('16720', 'IF973', '2020.2');
Insert into Ministra values ('16740', 'IF974', '2020.1');
Insert into Ministra values ('16760', 'IF975', '2020.2');
Insert into Ministra values ('16760', 'IF975', '2021.1');
Banco de Dados de Exemplo
https://docs.google.com/document/d/1V_8KfV0HjSR8epXMxdJIGHe-oZKC2UPiM4mxQtQPhZ0/edit?usp=sharing
Consultas aninhadas
Consultas Aninhadas
Consultas aninhadas
Consultas Aninhadas
https://www.ibm.com/docs/en/informix-servers/12.10?topic=statements-subqueries-in-from-clause
https://www.ibm.com/docs/en/informix-servers/12.10?topic=statements-subqueries-in-projection-clause
Consultas aninhadas
Tipos de Consultas Aninhadas
Consultas aninhadas
SELECT siape, nome, salario
FROM Professor
WHERE cod_depto = (SELECT numero_depto
FROM Departamento
WHERE nome_depto = ‘Magia’);
Consultas Aninhadas
Cláusulas ANY e SOME
ANY e SOME
Cláusulas ANY e SOME
ANY e SOME
Cláusulas ANY e SOME
ANY e SOME
SELECT siape, nome, salario
FROM Professor
WHERE salario > ANY (SELECT salario FROM Professor
WHERE cod_depto = ‘D001’);
Cláusula ALL
ALL
Cláusula ALL
ALL
Cláusula ALL
SELECT siape, nome, salario
FROM Professor
WHERE salario > ALL (SELECT salario FROM Professor
WHERE cod_depto = ‘D003’);
ALL
Cláusula IN
IN
Cláusula IN
IN
SELECT siape, nome, salario
FROM Professor
WHERE cod_depto IN (SELECT numero_depto FROM departamento
WHERE nome_depto = ‘Magia’);
EXISTS e NOT EXISTS
Exists e Not Exists
EXISTS e NOT EXISTS
Exists e Not Exists
EXISTS e NOT EXISTS
Exists e Not Exists
EXISTS e NOT EXISTS
SELECT P.siape, P.nome, P.salario
FROM Professor P
WHERE EXISTS (SELECT M.* FROM Ministra M
WHERE P.siape = M.siape AND M.cod_disciplina = ‘IF971’);
Exists e Not Exists
EXISTS e NOT EXISTS
SELECT P.siape, P.nome, P.salario
FROM Professor P
WHERE EXISTS (SELECT M.* FROM Ministra M
WHERE P.siape = M.siape AND M.cod_disciplina = ‘IF971’);
Exists e Not Exists
EXISTS e NOT EXISTS
Exists e Not Exists
EXISTS e NOT EXISTS
Exists e Not Exists
SELECT P.siape, P.nome, P.salario
FROM Professor P
WHERE NOT EXISTS (SELECT D.numero_depto FROM Departamento D WHERE P.cod_depto = D.numero_depto AND D.nome_depto = ‘Magia’);
Consultas aninhadas – IMPORTANTE!!!
Exists e Not Exists
Consultas aninhadas
Consultas Aninhadas
https://www.w3resource.com/sql/insert-statement/insert-using-subqueries.php
https://www.w3resource.com/sql/update-statement/update-using-subqueries.php
https://www.w3resource.com/sql/delete-statement/delete-with-subqueries.php
Funções de Agregação
Funções de Agregação
Funções de Agregação
Funções de Agregação
Funções de Agregação
MAX
SELECT MAX(P.salario) FROM Professor P, Departamento D WHERE P.cod_depto = D.numero_depto AND D.nome_depto = ‘Magia’;
Funções de Agregação
COUNT
SELECT COUNT(*) FROM Professor P, Departamento D WHERE D.numero_depto = P.cod_depto
AND D.nome_depto = ‘Magia’
AND P.salario > 1000
Funções de Agregação
SUM
SELECT SUM(P.salario) FROM Professor P, Departamento D WHERE D.numero_depto = P.cod_depto
AND D.nome_depto = ‘Magia’
Funções de Agregação
AVG
SELECT AVG(P.salario) FROM Professor P, Departamento D WHERE D.numero_depto = P.cod_depto
AND D.nome_depto = ‘Magia’
Funções de Agregação
Funções de Agregação e Consultas Aninhadas
SELECT P.nome, P.salario FROM Professor P WHERE p.salario IN (SELECT MAX(salario) FROM Professor)
Funções de Agregação
Funções de Agregação e Grupos de Dados
Cláusula GROUP BY
Group By
Cláusula GROUP BY
SELECT Sexo, Count(*) FROM Professor
GROUP BY Sexo;
Sexo | Count(*) |
F | 63 |
M | 75 |
Group By
Cláusulas GROUP BY
Group By
SELECT cod_depto, COUNT(*), AVG(salario)
FROM Professor
GROUP BY cod_depto
Cláusula GROUP BY
Agrupamento das tuplas pelo Dnr
Resultado da consulta
Group By
Cláusula GROUP BY
Se houver valores nulos no atributo de agrupamento (Professor sem departamento), é criado um grupo separado para todas as tuplas com valor NULL no atributo de agrupamento.
Group By
Cláusula HAVING
Having
Cláusula HAVING
Having
SELECT P.siape, P.nome, COUNT(*)
FROM Professor P, Ministra M
WHERE P.siape = M.siape
GROUP BY P.siape, P.nome
HAVING COUNT(*) > 2
Cláusulas GROUP BY e HAVING
ATTENTION PLEASE!
Considere as seguintes relações:
Professor (nome, siape, categoria, salario, cod_depto)
Disciplina (nome, cod_disciplina, carga_horária)
Departamento (nome_depto, numero_depto)
Ministra (siape, cod_disciplina, periodo)
Escreva as seguintes consultas em SQL:
Exercícios
Exercícios