sql – consultas aninhadas profa. sandra de amo capitulo 5 – livro texto database management...
TRANSCRIPT
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 barcos vermelhos SELECT S.SnomeFROM Sailors SWHERE S.Sid IN
(SELECT R.Sid FROM Reservas R WHERE R.Bid IN
(SELECT B.Bid FROM Barcos B WHERE B.Cor = ‘Vermelho’))
Sailors
Reservas
Sid Snome Status Idade22293132586471748595
N1N2N3N4N5N6N7N6N8N9
7188107
10933
453355,525,53535163525,563,5
Sid Bid Dia222222223131 31
74
64
101102103104102103
101
102
D1D1D3D4D5
64
104
103
D6D7D8
D9
D9
Bid BN Cor
Barcos
101102
103
104
A1
A1
A2
A3
Verm
VermVerde
Azul102
104
22
313122
64
N1
N3
N6
Resposta
Dê os nomes dos marinheiros que NÃO reservaram barcos vermelhos
SELECT S.SnomeFROM Sailors SWHERE S.Sid NOT IN
(SELECT R.Sid FROM Reservas R WHERE R.Bid IN
(SELECT B.Bid FROM Barcos B WHERE B.Cor = ‘Vermelho’))
Sailors
Reservas
Sid SnomeStatus Idade22293132586471748595
N1N2N3N4N5N6N7N6N8N9
718810710933
453355,525,535351635
25,563,5
Sid Bid Dia
222222223131 31
74
64
101102103104102103
101
102
D1D1D3D4D5
64
104
103
D6D7
D8
D9
D9
Bid BN Cor
Barcos
101102
103
104
A1A1
A2A3
Verm
VermVerde
Azul102
104
22
313122
64
N2N4
N7
Resposta
N5
N8N9
N6
Dê os nomes dos marinheiros que reservaram barcos não vermelhos SELECT S.SnomeFROM Sailors SWHERE S.Sid IN
(SELECT R.Sid FROM Reservas R WHERE R.Bid NOT IN
(SELECT B.Bid FROM Barcos B WHERE B.Cor = ‘Vermelho’))
Sailors
Reservas
Sid SnomeStatus Idade
22293132586471748595
N1N2N3N4N5N6N7N6N8N9
7188
107
10933
453355,525,53535163525,563,5
Sid Bid Dia
222222223131 31
74
64
101102103104102103
101
102
D1D1D3D4D5
64
104
103
D6D7
D8
D9D9
Bid BN Cor
Barcos
101
102
103104
A1
A1
A2
A3
Verm
VermVerde
Azul102
104
22
3122
64
N1N3N6
Resposta
74
N6
Dê os nomes dos marinheiros que não reservaram barcos não vermelhosSELECT S.SnomeFROM Sailors SWHERE 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’))
102
104
22
3122
64
N2N4N5
Resposta
74
N7N8N9
Sailors
Reservas
Sid SnomeStatus Idade
22293132586471748595
N1N2N3N4N5N6N7N6N8N9
7188
107
10933
453355,525,53535163525,563,5
Sid Bid Dia
222222223131 31
74
64
101102103104102103
101
102
D1D1D3D4D5
64
104
103
D6D7
D8
D9D9
Bid BN Cor
Barcos
101
102
103104
A1
A1
A2
A3
Verm
VermVerde
Azul
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 ESTUDANTEWHERE E.PERIODO = ‘1’ ANDE.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 ESTUDANTEWHERE E.PERIODO = ‘1’ ANDE.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)
Verdadeiro se o valor do atributo A está em R 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 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.SnomeFROM Sailors SWHERE 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.SnomeFROM Sailors SWHERE 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.SnomeFROM Sailors SWHERE 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)
Verdadeiro se o valor do atributo A é maior do que algum valor de R
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 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.SidFROM Sailors SWHERE 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.SnomeFROM SailorsWHERE 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.SnomeFROM Sailors SWHERE EXISTS
(SELECT * FROM Reservas R WHERE R.Bid = ‘103’ AND R.Sid = S.Sid)
Consulta executada repetidamente: uma vez para cada tuplada relação Sailors
Exercício 2
A consulta a seguir é correlacionada ?
SELECT S.SnomeFROM SailorsWHERE 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çãoEncontre 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.SnomeFROM Sailors SWHERE 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.SnomeFROM Sailors SWHERE 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.SnomeFROM Sailors SWHERE 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 comidentificador Sid
Variante (sem EXCEPT) Dê o nome dos marinheiros que reservaram todos os barcos.
SELECT S.SNOMEFROM SAILORS SWHERE NOT EXISTS
(( 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 comIdentificador SID
Identificadoresde barcosque não foramreservados pelomarinheiro com Identificador SID
Exercício 5
Dê o nome dos marinheiros que reservaram todos os barcos vermelhos.
SELECT S.SNOMEFROM SAILORS SWHERE 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) )