Questão FC369424
O código DDL abaixo cria três tabelas em um banco de dados relacional: CREATE TABLE Velejadores ( vid INTEGER PRIMARY KEY, nome VARCHAR(100), idade INTEGER ); CREATE TABLE Barcos (
Linguagem SQL
FGV · 2025
O código DDL abaixo cria três tabelas em um banco de dados relacional:
CREATE TABLE Velejadores (
vid INTEGER PRIMARY KEY,
nome VARCHAR(100),
idade INTEGER
);
CREATE TABLE Barcos (
bid INTEGER PRIMARY KEY,
nome VARCHAR(50),
modelo VARCHAR(50)
);
CREATE TABLE Reservas (
vid INTEGER,
bid INTEGER,
data DATE,
PRIMARY KEY (vid, bid),
FOREIGN KEY (vid) REFERENCES Velejadores(vid),
FOREIGN KEY (bid) REFERENCES Barcos(bid)
);
Considerando as tabelas acima, a seguinte consulta foi realizada:
SELECT V.nome FROM Velejadores V
WHERE NOT EXISTS (
(SELECT B.bid FROM Barcos B)
EXCEPT
(SELECT R.bid FROM Reservas R
WHERE R.vid = V.vid)
);
O retorno da consulta foram os nomes
- dos velejadores que possuem reservas para todos os barcos.
- dos barcos que não possuem reservas.
- dos velejadores que não possuem reservas.
- dos velejadores que possuem reserva para mais de um barco.
- dos barcos que possuem reservas feitas por todos os velejadores.
Mostrar resposta e comentário
Gabarito
A
Comentário do professor
A consulta retorna os nomes de velejadores que têm reserva para todos os barcos. Isso ocorre porque a subconsulta interna usa EXCEPT para calcular a diferença entre o conjunto de todos os identificadores de barcos e o conjunto de barcos reservados pelo velejador atual.
Ou seja, para cada linha de Velejadores (V), avalia-se:
\( \{bid\;de\;Barcos\} \setminus \{bid\;de\;Reservas\;onde\;vid=V.vid\} \).
Se esse conjunto diferença for vazio (NOT EXISTS), não existe barco sem reserva por aquele velejador; portanto ele reservou todos os barcos.
O SELECT final retorna V.nome desses velejadores satisfazendo a condição.
Conteúdo do catálogo FC Concursos · Atualizado em