sql exercícios de revisão

27
SQL Exercícios de Revisão Profa. Sandra de Amo Programa de Pós-graduação em Ciência da Computação – UFU 2012 - 2

Upload: tashya-hudson

Post on 02-Jan-2016

73 views

Category:

Documents


0 download

DESCRIPTION

SQL Exercícios de Revisão. Profa. Sandra de Amo Programa de Pós-graduação em Ciência da Computação – UFU 2012 - 2. Exercicio 1. SELECT E.ENOME FROM ESTUDANTE E, MATRICULADO M, DISCIPLINA D, PROF P WHERE E.PERIODO = ‘1’ AND E.ENUM = M.ENUM AND - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: SQL Exercícios de Revisão

SQLExercícios de

RevisãoProfa. Sandra de Amo

Programa de Pós-graduação em Ciência da Computação – UFU

2012 - 2

Page 2: SQL Exercícios de Revisão

Exercicio 1.

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 3: SQL Exercícios de Revisão

Exercicio 2.

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 4: SQL Exercícios de Revisão

Exercicio 3.

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

Page 5: SQL Exercícios de Revisão

Exercicio 4.a

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 6: SQL Exercícios de Revisão

Exercicio 4.bPlano da Consulta 1

Plano da Consulta 2

ΠEnome

σPnome=M.Amelia

σPeriodo =1

Estudante

Matriculado

Disciplina Professor

Matriculado

Disciplina Professor

Estudante

σPeriodo =1 ΠEnum

σPnome=M.Amelia

ΠEnome

Análise: Plano 2 é mais eficiente que o plano 1, pois no plano 2, o último (as operações são executadas na ordem “de baixo para cima” no plano) operador de junção opera sobre relações muito menores do que o último operador de junção na consulta 1. Os outros dois operadores de junção sãoexecutados de forma idêntica nos dois planos.

Page 7: SQL Exercícios de Revisão

Exercicio 4.b Plano da Consulta 4

Plano da Consulta 3

Disciplina Professor

Estudante

σPeriodo =1 ΠEnum

σPnome=M.Amelia

ΠEnome

Matriculado ΠDID

Disciplina

Professor

Estudante

σPeriodo =1 ΠEnum

σPnome=M.Amelia

ΠEnome

Matriculado ΠDID

Análise: Plano 3 é mais eficiente que o plano 2 e plano 4 é maiseficiente do que o 3. A justificativa é análoga à justificativa dadapara concluir que o plano 2 é mais eficiente do que o plano 1.

ΠPID

Page 8: SQL Exercícios de Revisão

Exercicio 5a.

a) Dê um comando SQL aninhado usando dois blocos básicos ligados pelo comando EXISTS para a seguinte consulta:

SELECT S.SnomeFROM Sailors SWHERE EXISTS

(SELECT * FROM Reservas R WHERE R.Bid = ‘103’ AND R.Sid = S.Sid)

b) Dê um comando SQL aninhado usando dois blocos básicos ligados pelo comando IN para a mesma consulta do item a)

Page 9: SQL Exercícios de Revisão

Exercicio 5b.

b) Dê um comando SQL aninhado usando dois blocos básicos ligados pelo comando IN para a mesma consulta do item a)

SELECT S.Snome

FROM Sailors S

WHERE S.SID IN

(SELECT R.SID

FROM Reservas R

WHERE R.Bid = ‘103’)

Page 10: SQL Exercícios de Revisão

Exercicio 5c.

A segunda consulta (com IN) é muito mais eficiente do que a primeira consulta (com EXISTS), pois na segunda consulta, o bloco aninhado (interno) é CORRELACIONADO com o bloco externo.

Isto é, a variável S.SID corresponde à variável S.SID do bloco externo. Isto significa que o bloco interno é executado PARA CADA TUPLA do bloco externo !!

Na primeira consulta, o bloco interno é executado UMA ÚNICA VEZ.

Page 11: SQL Exercícios de Revisão

Exercicio 6a.

a)

SELECT S.SnomeFROM Sailors SWHERE NOT EXISTS

(SELECT * FROM Reservas R WHERE R.Bid = ‘103’ AND R.Sid = S.Sid)

Page 12: SQL Exercícios de Revisão

Exercicio 6b. e 6c

b) SELECT S.SnomeFROM Sailors SWHERE S.SID NOT IN

(SELECT * FROM Reservas R WHERE R.Bid = ‘103’)

c) Consulta (b) é muito mais eficiente do que a consulta (a). Justificativa análoga à do Exercicio 5.

Page 13: SQL Exercícios de Revisão

Exercicio 7a.

a) 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 14: SQL Exercícios de Revisão

Exercicio 7bb) Você poderia dar um comando SQL para a mesma consulta do item

(a) sem utilizar o comando UNIQUE ?

SELECT S.SnomeFROM Sailors SWHERE S.SID IN (SELECT R.SID FROM Reservas R WHERE R.Bid = ‘103’

GROUP BY R.SID HAVING COUNT (*) = 1)

Page 15: SQL Exercícios de Revisão

Exercicio 8a.

a) 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 16: SQL Exercícios de Revisão

Exercicio 8b

b) Você poderia dar um comando SQL para a mesma consulta do item

(a) sem utilizar o comando ANY ?

SELECT S.Sid

FROM Sailors S

WHERE S.Status >= (SELECT MIN(S2.Status)

FROM Sailors S2

WHERE S2.Snome = ‘Horacio’)

Page 17: SQL Exercícios de Revisão

Exercicio 9a.

a) Encontre os identificadores de marinheiros que têm os maiores status.

SELECT S.SidFROM Sailors SWHERE S.Status >= ALL

(SELECT S2.Status FROM Sailors S2)

Page 18: SQL Exercícios de Revisão

Exercicio 9b

b) Você poderia dar um comando SQL para a mesma consulta do item (a) sem utilizar o comando ALL ?

SELECT S.Sid

FROM Sailors S

WHERE S.Status = (SELECT MAX(S2.Status)

FROM Sailors S2)

Page 19: SQL Exercícios de Revisão

Exercício 10. Dê comando SQL para a seguinte consulta, usando dois blocos SQL aninhados, sem comandos de agregação:

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 20: SQL Exercícios de Revisão

Exercicio 11.

SELECT S.SnomeFROM Sailors SWHERE EXISTS

(SELECT * FROM Reservas R WHERE R.Bid = ‘103`

AND R.Sid = S.Sid)

SELECT S.SnomeFROM SailorsWHERE S.Idade <= ALL (SELECT S2.Idade FROM S2 Sailors, R Reservas WHERE R.Sid = S2.Sid AND R.Bid = 103)

Considere as duas consultas abaixo. Diga quais delas são correlacionadas e por que. Diga também o que cada retorna.

A consulta à esquerda é correlacionada, Pouco eficiente. A execução do bloco interno é feita diversas vezes a medida que o bloco externo é executado. Retorna: Nomes de marinheiros que reservaram o barco 103.

A consulta à direita não é correlacionada. O bloco interno é executado uma única vez, é independente do bloco externo. Retorna: Nomes de marinheiros que são mais ou igualmente jovens do que algum marinheiro que reservou o barco 103.

Page 21: SQL Exercícios de Revisão

Exercicio 12.O objetivo deste exercicio é dar um comando SQL para retornar os nomes dos marinheiros que reservaram algum barco vermelhor e algum barco verde.

As alternativas 1 e 2 são corretas. A alternativa 3 NÃO é correta.

Caso a relação SAILORS contenha dois marinheiros com o mesmo nome, onde um deles reservou um barco vermelho (mas não reservou barco verde) e o outro reservou um barco verde (mas não reservou um barco vermelho), este nome comum dos dois marinheiros será retornado na resposta da consulta, o que é incorreto.

Page 22: SQL Exercícios de Revisão

Exercicio 13.O objetivo deste exercicio é dar um comando SQL para retornar os nomes dos marinheiros que reservaram barcos vermelhos e não reservaram barcos verdes.

As alternativas 1 e 2 são corretas. A alternativa 3 NÃO é correta.

Caso a relação SAILORS contenha dois marinheiros com o mesmo nome, onde um deles reservou um barco vermelho (mas não reservou barco verde) e o outro reservou um barco vermelho e um barco verde este nome comum dos dois marinheiros não vai ser retornado, o que é incorreto, pois um dos marinheiros com este nome, o primeiro, satisfaz a condição da consulta: reservou barco vermelho mas não reservou barco verde.

Page 23: SQL Exercícios de Revisão

Exercicio 14.O objetivo deste exercicio é dar um comando SQL para retornar os nomes dos marinheiros que reservaram barcos vermelhos ou verdes.

As 3 alternativas propostas estão corretas. Veja que a alternativa 3, contrariamente ao que ocorreu nos dois exercicios anteriores (12 e 13), é correta.

Suponha que um nome de marinheiro está na resposta da alternativa 3. Então ou um marinheiro com este nome reservou o barco vermelho (e portanto este nome com certeza vai aparecer na resposta da alternativa 1 e 2) ou um marinheiro com este nome reservou o barco verde (portanto este nome com certeza vai aparecer na resposta da alternativa 1 e 2).

Suponha que um nome de marinheiro NÃO ESTÁ na resposta da alternativa 3. Então não existe marinheiro com este nome que tenha reservado o barco vermelho ou verde. Logo este nome de marinheiro não pode aparecer na resposta da alternativa 1 ou 2.

Page 24: SQL Exercícios de Revisão

a) Consulta retorna os nomes 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

Exercicio 15.

b) Esta consulta é correlacionada.

Page 25: SQL Exercícios de Revisão

Exercicio 16aa) Consulta retorna os nomes 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 26: SQL Exercícios de Revisão

Exercicio 16b

b) Esta consulta é correlicionada. Bem menos eficiente do que a consulta do Exercicio 15, embora ambas sejam correlacionadas.

A razão é por que a consulta do exercicio 16 tem duas variáveis correlacionadas. Isto é, dois blocos que são executados diversas vezes, dentro da execução do bloco externo. Na consulta 15, só um bloco é executado diversas vezes dentro da execução do bloco externo.

Page 27: SQL Exercícios de Revisão

Encontrar os nomes dos barcos que foram reservados por todos os marinheiros com idade igual a 20 anos.

SELECT B.BNOME

FROM BARCOS B

WHERE NOT EXISTS

( ( SELECT S.SID

FROM SAILORS S

WHERE S.IDADE = 20

EXCEPT

(SELECT R.SID

FROM RESERVAS R

WHERE R.BID = B.BID) )

Identificadores de marinheiros com 20anos que não reservaram o barcocom identificadorB.BID

Exercicio 17.

b) Esta consulta SQL é correlacionada.