SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management...

Preview:

Citation preview

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) )

Recommended