A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

SQL – Consultas Aninhadas

Cópias: 1
SQL – Consultas Aninhadas e Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Apresentações semelhantes


Apresentação em tema: "SQL – Consultas Aninhadas"— Transcrição da apresentação:

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

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

3 Dê os nomes dos marinheiros que reservaram barcos vermelhos
Sailors Resposta N1 Sid Snome Status Idade 22 N1 7 45 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 29 N2 1 33 31 N3 8 55,5 N6 32 N4 8 25,5 58 N5 10 35 64 N6 7 35 71 N7 10 16 22 74 N6 9 35 22 85 N8 3 25,5 31 95 N9 3 63,5 31 Reservas 64 Barcos Sid Bid Dia 22 101 D1 Bid BN Cor 22 102 104 102 D1 101 A1 Azul 22 103 D3 102 A1 Verm 22 104 D4 103 A2 Verde 31 102 D5 104 A3 Verm 31 103 D6 31 104 D7 64 101 D8 64 102 D9 74 103 D9

4 Dê os nomes dos marinheiros que NÃO reservaram barcos vermelhos
Sailors N2 Resposta N4 Sid Snome Status Idade N5 22 N1 7 45 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’)) N7 29 N2 1 33 N6 31 N3 8 55,5 32 N4 8 N8 25,5 58 N5 10 35 N9 64 N6 7 35 71 N7 10 16 22 74 N6 9 35 22 85 N8 3 25,5 31 95 N9 3 63,5 31 Reservas 64 Barcos Sid Bid Dia 22 101 D1 Bid BN Cor 102 104 22 102 D1 101 A1 Azul 22 103 D3 102 A1 Verm 22 104 D4 103 A2 Verde 31 102 D5 104 A3 Verm 31 103 D6 31 104 D7 64 101 D8 64 102 D9 74 103 D9

5 Dê os nomes dos marinheiros que reservaram barcos não vermelhos
Sailors Resposta Sid Snome Status Idade N1 22 N1 7 45 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’)) N3 29 N2 1 33 N6 31 N3 8 55,5 N6 32 N4 8 25,5 58 N5 10 35 64 N6 7 35 71 N7 10 16 22 74 N6 9 35 22 85 N8 3 25,5 31 95 N9 3 63,5 64 Reservas 74 Barcos Sid Bid Dia 22 101 D1 Bid BN Cor 22 102 D1 101 A1 Azul 102 104 22 103 D3 102 A1 Verm 22 104 D4 103 A2 Verde 31 102 D5 104 A3 Verm 31 103 D6 31 104 D7 64 101 D8 64 102 D9 74 103 D9

6 Dê os nomes dos marinheiros que não reservaram barcos não vermelhos
Sailors Resposta Sid Snome Status Idade N2 22 N1 7 45 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’)) N4 29 N2 1 33 N5 31 N3 8 55,5 N7 32 N4 8 25,5 N8 58 N5 10 35 64 N6 7 35 N9 71 N7 10 16 74 N6 9 35 22 85 N8 3 25,5 22 95 N9 3 63,5 31 Reservas 64 Barcos Sid Bid Dia 74 22 101 D1 Bid BN Cor 22 102 D1 101 A1 Azul 22 103 D3 102 A1 Verm 102 104 22 104 D4 103 A2 Verde 31 102 D5 104 A3 Verm 31 103 D6 31 104 D7 64 101 D8 64 102 D9 74 103 D9

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

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

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

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

11 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

12 Exemplo SELECT S.Snome FROM Sailors S WHERE EXISTS (SELECT *
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)

13 Exemplo SELECT S.Snome FROM Sailors S WHERE NOT EXISTS (SELECT *
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)

14 Exemplo SELECT S.Snome FROM Sailors S WHERE UNIQUE (SELECT *
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)

15 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

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

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

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

19 Consultas Aninhadas Correlacionadas (a evitar - ineficientes)
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) Consulta executada repetidamente: uma vez para cada tupla da relação Sailors

20 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

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

22 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 B.Cor = ‘Verde’) )

23 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 B.Cor = ‘Verde’)

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

25 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 B.Cor = ‘Verde’) )

26 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 B.Cor = ‘Verde’)

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

28 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 B.Cor = ‘Verde’) )

29 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 B.Cor = ‘Verde’)

30 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

31 Variante (sem EXCEPT) 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 ( SELECT R.BID FROM RESERVAS R WHERE R.BID = B.BID AND R.SID = S.SID) ) Identificadores de barcos que não foram reservados pelo marinheiro com Identificador SID Identificadores de barcos que foram reservados pelo marinheiro com Identificador SID

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


Carregar ppt "SQL – Consultas Aninhadas"

Apresentações semelhantes


Anúncios Google