32
SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

Embed Size (px)

Citation preview

Page 1: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

SQL – Consultas Aninhadas

Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

Page 2: 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”

Page 3: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 4: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 5: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 6: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 7: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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’

Page 8: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 9: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 10: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 11: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 12: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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)

Page 13: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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)

Page 14: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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)

Page 15: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 16: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 17: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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)

Page 18: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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)

Page 19: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 20: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 21: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 22: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 23: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 24: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 25: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 26: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 27: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 28: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 29: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 30: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 31: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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

Page 32: SQL – Consultas Aninhadas Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

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