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.
Considere o seguinte esquema de banco de dados:
Estudante(Enum, Enome, Curso, Idade, Periodo)
Aula(Did, Weekday, Sala, Horário)
Disciplina(Did, Dnome, Pid)
Prof(Pid,Pnome,Dept)
Matriculado(Enum,Did)
Dê um comando SQL com um único bloco SQL para a seguinte
consulta:
Dar o nome dos estudantes do primeiro período que estão
matriculados em alguma disciplina ministrada pela Profa. Maria
Amélia
Exercicio 2.
Dê um comando SQL com DOIS blocos SQL (aninhados) para a
mesma consulta do Ex. 1:
Dar o nome dos estudantes do primeiro período que estão
matriculados em alguma disciplina ministrada pela Profa. Maria
Amélia
Exercicio 3.
Dê um comando SQL com TRES blocos SQL (aninhados) para a
mesma consulta do Ex. 1:
Dar o nome dos estudantes do primeiro período que estão
matriculados em alguma disciplina ministrada pela Profa. Maria
Amélia
Exercicio 4.
a) Dê um comando SQL com QUATRO blocos SQL (aninhados) para a
mesma consulta do Ex. 1:
Dar o nome dos estudantes do primeiro período que estão
matriculados em alguma disciplina ministrada pela Profa. Maria
Amélia
b) Para cada um dos comandos SQL dos Ex. 1, 2, 3, 4 dar o plano de
execução (com operadores da álgebra relacional) correspondentes
e analise a eficiência de cada comando.
Exercicio 5.
Considere o esquema de banco de dados:
Barcos(Bid,Bnome,Color)
Reservas(Bid,Sid,Day)
Sailors(Sid,Snome,Status,Idade)
a) Dê um comando SQL aninhado usando dois blocos básicos ligados
pelo comando EXISTS para a seguinte consulta:
Encontre nome de marinheiros que reservaram o barco ‘103’
b) Dê um comando SQL aninhado usando dois blocos básicos ligados
pelo comando IN para a mesma consulta do item a)
c) Compare a eficiência dos dois comandos SQL dados.
Exercicio 6.
a) Dê um comando SQL aninhado usando dois blocos básicos ligados
pelo comando NOT EXISTS para a seguinte consulta:
Encontre nome de marinheiros que não reservaram o barco ‘103’
b) Dê um comando SQL aninhado usando dois blocos básicos ligados
pelo comando NOT IN para a mesma consulta do item a)
c) Compare a eficiência dos dois comandos SQL dados.
Exercicio 7.
a) Dê um comando SQL aninhado usando dois blocos básicos ligados
pelo comando UNIQUE para a seguinte consulta, sem utilizar
comandos de agregação:
Encontre nome de marinheiros que reservaram uma única vez o barco
‘103’
b) Você poderia dar um comando SQL para a mesma consulta do item
(a) sem utilizar o comando UNIQUE ?
Exercicio 8.
a) Dê um comando SQL aninhado usando dois blocos básicos ligados
pelo comando ANY para a seguinte consulta, sem utilizar comandos
de agregação:
Encontre os identificadores de marinheiros cujo status é melhor do que
algum marinheiro chamado “Horácio”
b) Você poderia dar um comando SQL para a mesma consulta do item
(a) sem utilizar o comando ANY ?
Exercicio 9.
a) Dê um comando SQL aninhado usando dois blocos básicos ligados
pelo comando ALL para a seguinte consulta, sem utilizar comandos
de agregação:
Encontre os identificadores de marinheiros que têm os maiores status.
b) Você poderia dar um comando SQL para a mesma consulta do item
(a) sem utilizar o comando ALL ?
Exercício 10.
a) 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 ?
b) Você poderia dar um comando SQL para a mesma consulta do item
(a) usando um único bloco SQL (podendo usar agregação) ?
Exercicio 11.
Considere as duas consultas abaixo. Diga quais delas são correlacionadas
e por que. Diga também o que cada retorna.
SELECT S.Snome
FROM Sailors S
WHERE EXISTS
(SELECT *
FROM Reservas R
WHERE R.Bid = ‘103`
AND
R.Sid = S.Sid)
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)
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.
Analise as tres propostas abaixo e diga
para cada uma delas se é correta ou
Incorreta justificando sua resposta.
Alternativa 1:
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’)
Alternativa 2:
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
FROM Barcos B, Reservas R
WHERE R.Bid = B.Bid AND
B.Cor = ‘Verde’) )
Alternativa 3:
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’)
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.
Analise as tres propostas abaixo e diga
para cada uma delas se é correta ou
Incorreta justificando sua resposta.
Alternativa 1:
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’)
Alternativa 2:
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
FROM Barcos B, Reservas R
WHERE R.Bid = B.Bid AND
B.Cor = ‘Verde’) )
Alternativa 3:
(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 14.
O objetivo deste exercicio é dar um
comando SQL para retornar os nomes dos
marinheiros que reservaram barcos
vermelhos ou verdes.
Analise as duas propostas abaixo e diga
para cada uma delas se é correta ou
incorreta justificando sua resposta.
Alternativa 1:
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’)
Alternativa 2:
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
FROM Barcos B, Reservas R
WHERE R.Bid = B.Bid AND
B.Cor = ‘Verde’) )
Alternativa 3:
(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’)
Exercicio 15.
a) Analise a seguinte consulta SQL e diga o que ela retorna.
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) )
b) Esta consulta é correlacionada ?
Exercicio 16.
a) Analise a seguinte consulta SQL e diga o que ela retorna.
SELECT S.SNOME
FROM SAILORS S
WHERE 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) )
b) Esta consulta é correlacionada ?
Exercício 17
Dê comando SQL para a seguinte consulta:
Encontrar os nomes dos barcos que foram reservados por todos os
marinheiros com idade igual a 20 anos.
Download

Revisão SQL - Sandra de Amo