SQL – Consultas
Aninhadas
Profa. Sandra de Amo
Capitulo 5 – Livro Texto
Database Management Systems
Ramakrishnan - Gehrke
Exercícios


Variantes da consulta “Dê o nome dos
marinheiros que reservaram barcos
vermelhos”
Variantes equivalentes da consulta “Dê o
nome dos estudantes do primeiro período
que estão matriculados em alguma disciplina
ministrada pela Profa. Maria Amélia”
Dê os nomes dos marinheiros que reservaram
Sailors
barcos vermelhos
Resposta
Sid Snome Status Idade
N1
SELECT S.Snome
FROM Sailors S
WHERE S.Sid IN
(SELECT R.Sid
FROM Reservas R
WHERE R.Bid IN
(SELECT B.Bid
FROM Barcos B
WHERE
B.Cor = ‘Vermelho’))
N3
N6
22
22
31
31
64
102
104
22
29
31
32
58
64
71
74
85
95
N1
N2
N3
N4
N5
N6
N7
N6
N8
N9
7
1
8
8
10
7
10
9
3
3
45
33
55,5
25,5
35
35
16
35
25,5
63,5
Reservas
Sid
22
22
22
22
31
31
31
64
Bid Dia
101 D1
102 D1
103 D3
104 D4
102 D5
103 D6
104 D7
101 D8
64
74
102
103
D9
D9
Barcos
Bid BN Cor
101 A1 Azul
102 A1 Verm
103
104
A2 Verde
A3 Verm
Dê os nomes dos marinheiros que NÃO reservaram
barcos vermelhos
Sailors
N2
SELECT S.Snome
FROM Sailors S
WHERE S.Sid NOT IN
(SELECT R.Sid
FROM Reservas R
WHERE R.Bid IN
(SELECT B.Bid
FROM Barcos B
WHERE
B.Cor = ‘Vermelho’))
N4
N5
N7
N6
N8
N9
22
22
31
31
64
102
104
Resposta
Sid Snome Status Idade
22 N1
7
45
29 N2
1
33
8
55,5
31 N3
8
32 N4
25,5
58 N5
35
10
35
64 N6
7
71 N7
10
16
N6
74
9
35
85 N8
3
25,5
95 N9
3
63,5
Reservas
Sid Bid
Dia
22 101 D1
22 102 D1
22 103 D3
22 104 D4
31 102 D5
31 103 D6
31 104 D7
64 101 D8
64 102 D9
74 103 D9
Barcos
Bid BN Cor
101 A1 Azul
102 A1 Verm
103 A2 Verde
104 A3 Verm
Dê os nomes dos marinheiros que reservaram
barcos não vermelhos Resposta Sid SnomeSailors
Status Idade
SELECT S.Snome
FROM Sailors S
WHERE S.Sid IN
(SELECT R.Sid
FROM Reservas R
WHERE R.Bid NOT IN
(SELECT B.Bid
FROM Barcos B
WHERE
B.Cor = ‘Vermelho’))
N1
N3
N6
N6
22
22
31
64
74
102
104
22
29
31
32
58
64
71
74
85
95
N1
N2
N3
N4
N5
N6
N7
N6
N8
N9
7
1
8
8
10
7
10
9
3
3
45
33
55,5
25,5
35
35
16
35
25,5
63,5
Reservas
Sid Bid Dia
22 101 D1
22 102 D1
22 103 D3
22 104 D4
31 102 D5
31 103 D6
31 104 D7
64 101 D8
64
74
102
103
D9
D9
Barcos
Bid
101
102
103
104
BN
A1
A1
A2
A3
Cor
Azul
Verm
Verde
Verm
Dê os nomes dos marinheiros que não
reservaram barcos não vermelhos Sailors
Resposta
SELECT S.Snome
FROM Sailors S
WHERE S.Sid NOT IN
(SELECT R.Sid
FROM Reservas R
WHERE R.Bid NOT IN
(SELECT B.Bid
FROM Barcos B
WHERE
B.Cor = ‘Vermelho’))
N2
N4
N5
N7
N8
N9
22
22
31
64
74
102
104
Sid Snome Status Idade
45
22 N1
7
1
29 N2
33
31 N3
55,5
8
25,5
8
32 N4
10
35
58 N5
64 N6
7
35
16
71 N7
10
74 N6
9
35
85 N8
25,5
3
95 N9
3
63,5
Reservas
Sid Bid Dia
22 101 D1
22 102 D1
22 103 D3
22 104 D4
31 102 D5
31 103 D6
31 104 D7
64 101 D8
64
74
102
103
D9
D9
Barcos
Bid
101
102
103
104
BN
A1
A1
A2
A3
Cor
Azul
Verm
Verde
Verm
Dê o nome dos estudantes do primeiro período que
estão matriculados em alguma disciplina ministrada
pela Profa. Maria Amélia”
VARIANTE 1 : Sem subconsultas aninhadas
SELECT E.ENOME
FROM ESTUDANTE E, MATRICULADO M, DISCIPLINA D, PROF P
WHERE E.PERIODO = ‘1’ AND E.ENUM = M.ENUM AND
M.DID = D.DID AND D.PID = P.PID AND
P.PNOME = ‘Maria Amélia’
Dê o nome dos estudantes do primeiro período que
estão matriculados em alguma disciplina ministrada
pela Profa. Maria Amélia”
VARIANTE 2 : com um nível de aninhamento
SELECT E.ENOME
FROM ESTUDANTE
WHERE E.PERIODO = ‘1’ AND
E.NUM IN
(SELECT M.ENUM
FROM MATRICULADO M, DISCIPLINA D, PROF P
WHERE M.DID = D.DID AND D.PID = P.PID AND
P.PNOME = ‘Maria Amélia’)
Dê o nome dos estudantes do primeiro período que
estão matriculados em alguma disciplina ministrada
pela Profa. Maria Amélia”
VARIANTE 3 : com dois níveis de aninhamento
SELECT E.ENOME
FROM ESTUDANTE
WHERE E.PERIODO = ‘1’ AND
E.NUM IN
(SELECT M.ENUM
FROM MATRICULADO M
WHERE M.DID IN (SELECT D.DID
FROM DISCIPLINA D, PROF P
WHERE D.PID = P.PID AND
P.PNOME = ‘Maria Amélia’))
Dê o nome dos estudantes do primeiro período que
estão matriculados em alguma disciplina ministrada
pela Profa. Maria Amélia”
VARIANTE 4 : com três níveis de aninhamento
SELECT E.ENOME
FROM ESTUDANTE
WHERE E.PERIODO = ‘1’ AND
E.NUM IN
(SELECT M.ENUM
FROM MATRICULADO M
WHERE M.DID IN
(SELECT D.DID
FROM DISCIPLINA D
WHERE D.PID IN
(SELECT P.PID
FROM PROF P
WHERE P.PNOME = ‘Maria Amélia’)))
Condições do WHERE – em consultas
aninhadas

A IN (R: Resultado de subconsulta)


A NOT IN (R: Resultado de subconsulta)


Verdadeiro se o valor do atributo A não está em R
EXISTS (R: Resultado de subconsulta)


Verdadeiro se o valor do atributo A está em R
Verdadeiro se R é não vazio
NOT EXISTS (R: Resultado de subconsulta)

Verdadeiro se R é vazio
Exemplo
Encontre nome de marinheiros que reservaram
o barco ‘103’
SELECT S.Snome
FROM Sailors S
WHERE EXISTS
(SELECT *
FROM Reservas R
WHERE R.Bid = ‘103’ AND
R.Sid = S.Sid)
Exemplo
Encontre nome de marinheiros que não
reservaram o barco ‘103’
SELECT S.Snome
FROM Sailors S
WHERE NOT EXISTS
(SELECT *
FROM Reservas R
WHERE R.Bid = ‘103’ AND
R.Sid = S.Sid)
Exemplo
Encontre nome de marinheiros que reservaram
uma única vez o barco ‘103’
SELECT S.Snome
FROM Sailors S
WHERE UNIQUE
(SELECT *
FROM Reservas R
WHERE R.Bid = ‘103’ AND
R.Sid = S.Sid)
Condições do WHERE – em consultas
aninhadas

A > ANY (R: Resultado de subconsulta)


A > ALL (R: Resultado de subconsulta)


Verdadeiro se o valor do atributo A é maior do que
qualquer valor em R
A <> ALL (R: Resultado de subconsulta)


Verdadeiro se o valor do atributo A é maior do que
algum valor de R
Verdadeiro se o valor de A não está em R
A = ANY (R: Resultado de subconsulta)

Verdadeiro se o valor de A está em R
Exemplo

Encontre os identificadores de marinheiros cujo
status é melhor do que algum marinheiro chamado
“Horácio”
SELECT S.Sid
FROM Sailors S
WHERE S.Status >= ANY
(SELECT S2.Status
FROM Sailors S2
WHERE S2.Snome =
‘Horacio’)
Exemplo

Encontre os identificadores de marinheiros
que têm os maiores status.
SELECT S.Sid
FROM Sailors S
WHERE S.Status >= ALL
(SELECT S2.Status
FROM Sailors S2)
Exercício 1

Quais são os nomes dos marinheiros mais jovens
que reservaram o barco 103 ?
SELECT S.Snome
FROM Sailors
WHERE S.Idade <= ALL
(SELECT S2.Idade
FROM S2 Sailors, R Reservas
WHERE R.Sid = S2.Sid
AND R.Bid = 103)
Consultas Aninhadas Correlacionadas
(a evitar - ineficientes)
Encontre nome de marinheiros que reservaram
o barco ‘103’
SELECT S.Snome
FROM Sailors S
WHERE EXISTS
(SELECT *
Consulta executada
repetidamente: uma
FROM
Reservas
R
vez para cada tupla
da relação Sailors
WHERE R.Bid = ‘103’ AND
R.Sid = S.Sid)
Exercício 2

A consulta a seguir é correlacionada ?
SELECT S.Snome
FROM Sailors
WHERE S.Idade <= ALL
(SELECT S2.Idade
FROM S2 Sailors, R Reservas
WHERE R.Sid = S2.Sid
AND R.Bid = 103)
Resposta: Não
Como simular operador de Intersecção
Encontre os nomes de marinheiros que reservaram barcos
verdes e vermelhos.
SELECT S.Snome
FROM Sailors S, Reservas R, Barcos B
WHERE S.Sid = R.Sid AND R.Bid = B.Bid AND
B.Cor = ‘Vermelho’ AND S.Sid IN
(SELECT S2.Sid
FROM Sailors S2, Barcos B2, Reservas R2
WHERE S2.Sid = R2.Sid AND R2.Bid =
B2.Bid AND B2.Cor = ‘Verde’)
Variante: calcula a mesma resposta ?
(SIM)
SELECT S.Snome
FROM Sailors S
WHERE S.Sid IN
( (SELECT R.Sid
FROM Barcos B, Reservas R
WHERE R.Bid = B.Bid AND
B.Cor = ‘Vermelho’)
INTERSECT
(SELECT R.Sid
FROM Barcos B, Reservas R
WHERE R.Bid = B.Bid AND
B.Cor = ‘Verde’) )
Variante: calcula a mesma resposta ?
(NÃO !!)
(SELECT S.Snome
FROM Sailors S, Barcos B, Reservas R
WHERE S.Sid = R.Sid AND R.Bid = B.Bid AND
B.Cor = ‘Vermelho’)
INTERSECT
(SELECT S.Snome
FROM Sailors S, Barcos B, Reservas R
WHERE S.Sid = R.Sid AND R.Bid = B.Bid AND
B.Cor = ‘Verde’)
Exercício 3 : Operador de Diferença

Dê os nomes dos marinheiros que reservaram
barcos vermelhos e não reservaram barcos verdes.
SELECT S.Snome
FROM Sailors S, Reservas R, Barcos B
WHERE S.Sid = R.Sid AND R.Bid = B.Bid AND
B.Cor = ‘Vermelho’ AND S.Sid NOT IN
(SELECT S2.Sid
FROM Sailors S2, Barcos B2, Reservas R2
WHERE S2.Sid = R2.Sid AND R2.Bid =
B2.Bid AND B2.Cor = ‘Verde’)
Variante: Calcula a mesma resposta ?
(SIM)
SELECT S.Snome
FROM Sailors S
WHERE S.Sid IN
( (SELECT R.Sid
FROM Barcos B, Reservas R
WHERE R.Bid = B.Bid AND
B.Cor = ‘Vermelho’)
EXCEPT
(SELECT R.Sid
FROM Barcos B, Reservas R
WHERE R.Bid = B.Bid AND
B.Cor = ‘Verde’) )
Variante: calcula a mesma resposta ?
(NÃO !!)
(SELECT S.Snome
FROM Sailors S, Barcos B, Reservas R
WHERE S.Sid = R.Sid AND R.Bid = B.Bid AND
B.Cor = ‘Vermelho’)
EXCEPT
(SELECT S.Snome
FROM Sailors S, Barcos B, Reservas R
WHERE S.Sid = R.Sid AND R.Bid = B.Bid AND
B.Cor = ‘Verde’)
Exercicio 4 : Operador de União

Dê o nome dos marinheiros que reservaram
barcos vermelhos ou verdes.
SELECT S.Snome
FROM Sailors S, Reservas R, Barcos B
WHERE S.Sid = R.Sid AND R.Bid = B.Bid AND
B.Cor = ‘Vermelho’ OR S.Sid IN
(SELECT S2.Sid
FROM Sailors S2, Barcos B2, Reservas R2
WHERE S2.Sid = R2.Sid AND R2.Bid =
B2.Bid AND B2.Cor = ‘Verde’)
Variante: Calcula a mesma resposta ?
(SIM)
SELECT S.Snome
FROM Sailors S
WHERE S.Sid IN
( (SELECT R.Sid
FROM Barcos B, Reservas R
WHERE R.Bid = B.Bid AND
B.Cor = ‘Vermelho’)
UNION
(SELECT R.Sid
FROM Barcos B, Reservas R
WHERE R.Bid = B.Bid AND
B.Cor = ‘Verde’) )
Variante: calcula a mesma resposta ?
(SIM !!)
(SELECT S.Snome
FROM Sailors S, Barcos B, Reservas R
WHERE S.Sid = R.Sid AND R.Bid = B.Bid AND
B.Cor = ‘Vermelho’)
UNION
(SELECT S.Snome
FROM Sailors S, Barcos B, Reservas R
WHERE S.Sid = R.Sid AND R.Bid = B.Bid AND
B.Cor = ‘Verde’)
Operador de Divisão

Dê o nome dos marinheiros que reservaram todos os barcos.
SELECT S.SNOME
FROM SAILORS S
WHERE NOT EXISTS
( ( SELECT B.BID
FROM BARCOS B
EXCEPT
(SELECT R.BID
FROM RESERVAS R
WHERE R.SID = S.SID) )
Identificadores de
barcos que não
foram
reservados pelo
marinheiro com
identificador Sid
Variante (sem EXCEPT)

Dê o nome dos marinheiros que reservaram todos os barcos.
SELECT S.SNOME
FROM SAILORS S
WHERE NOT EXISTS
Identificadores
de barcos
que não foram
reservados pelo
marinheiro com
Identificador SID
(( SELECT B.BID
FROM BARCOS B
WHERE NOT EXISTS
( SELECT R.BID
FROM RESERVAS R
WHERE R.BID = B.BID
AND
R.SID = S.SID) )
Identificadores de
barcos que foram
reservados pelo
marinheiro com
Identificador SID
Exercício 5

Dê o nome dos marinheiros que reservaram todos os
barcos vermelhos.
SELECT S.SNOME
FROM SAILORS S
WHERE NOT EXISTS
( (SELECT B.BID
FROM BARCOS B, RESERVAS R
WHERE B.Cor = ‘Vermelho’)
EXCEPT
(SELECT R.BID
FROM RESERVAS R
WHERE R.SID = S.SID) )
Download

SQL – Consultas Aninhadas e Agregação