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.