Questão de Banco de Dados — Consultas e Comandos em SQL — VUNESP 2023
Banco de Dados›Consultas e Comandos em SQL
Código
vu195447
Banca
VUNESP
Órgão
UNICAMP
Ano
2023
Cargo
PTIC ( )
Considere as seguintes tabelas de um banco de dados relacional.
Computador (ID, Modelo, Fabricante) Usuário (Código, Nome, Função) Usa (Código, ID), sendo Código e ID chaves estrangeiras com origem nas tabelas Usuário e Computador, respectivamente.
O comando SQL para obter nome do usuário e modelo de computador utilizado é:
ASELECT Nome, Modelo FROM Computador, Usuário;
BSELECT Nome, Modelo FROM Computador C, Usuário U, Usa S WHERE C.ID = S.ID AND U.Código = S.Código;
CSELECT Nome, Modelo FROM Computador C, Usuário U, Usa S WHERE ID (C, S) AND Código (U, S);
DSELECT Nome, Modelo FROM Computador C, Usuário U, Usa S WHERE C AND S (ID); S AND U (Código);
ESELECT Nome, Modelo FROM Computador C, Usuário U, Usa S WHERE C (∗) = S (∗) AND U (∗) = S (∗);
Revelar gabarito e comentário▾
GabaritoB — SELECT Nome, Modelo
FROM Computador C, Usuário U, Usa S
WHERE C.ID = S.ID AND U.Código = S.Código;
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Consultas SQL com múltiplas tabelas: junção (JOIN) e produto cartesiano
Gabarito: letra B. Para obter o nome do usuário e o modelo do computador utilizado, é necessário combinar as três tabelas (Computador, Usuário e Usa) por meio de uma junção, relacionando as chaves estrangeiras da tabela associativa Usa com as chaves primárias das tabelas originais. A alternativa B faz exatamente isso, usando a sintaxe de junção implícita (vírgula no FROM e condição de igualdade no WHERE).
A questão cobra o conceito de junção (JOIN) em SQL, que é a operação que combina linhas de duas ou mais tabelas com base em uma condição de relacionamento. No modelo relacional, os dados são distribuídos em tabelas para evitar redundância, e a junção é o mecanismo que permite recuperar informações que estão espalhadas. A tabela Usa é uma tabela associativa (ou de relacionamento), que armazena os pares (Código, ID) indicando qual usuário utiliza qual computador. Para responder à consulta, precisamos percorrer o caminho: Usuário → Usa → Computador, unindo as tabelas pelas chaves.
A sintaxe clássica de junção (SQL-92) usa a cláusula JOIN ... ON, mas a questão apresenta a forma mais antiga (SQL-89), em que as tabelas são listadas no FROM separadas por vírgula e a condição de junção é colocada no WHERE. Ambas são equivalentes. O importante é que a condição de junção deve comparar as colunas que representam o mesmo conceito: C.ID = S.ID (o ID do computador na tabela Computador deve ser igual ao ID na tabela Usa) e U.Código = S.Código (o código do usuário na tabela Usuário deve ser igual ao código na tabela Usa).
Vamos entender o que cada alternativa faz:
A) Faz um produto cartesiano entre Computador e Usuário, sem qualquer condição de junção. Isso retorna todas as combinações possíveis entre um computador e um usuário, o que não corresponde à relação real de uso. Além disso, não inclui a tabela Usa, então não há como saber qual usuário usa qual computador.
B) Correta. Lista as três tabelas e aplica as condições de junção corretas no WHERE, relacionando as chaves estrangeiras da tabela Usa com as chaves primárias das tabelas Computador e Usuário.
C) A sintaxe ID (C, S) não é válida em SQL. A condição de junção deve ser uma expressão de comparação, como C.ID = S.ID. A forma apresentada não é reconhecida pelo SQL padrão.
D) A sintaxe C AND S (ID) também é inválida. Não é possível usar AND dessa forma para relacionar colunas. A condição correta seria C.ID = S.ID AND U.Código = S.Código.
E) A expressão C (∗) = S (∗) não é uma sintaxe SQL válida. O asterisco (*) é usado para selecionar todas as colunas, mas não pode ser usado em uma condição de igualdade dessa maneira.
A pegadinha da questão está em reconhecer a sintaxe correta de junção. Muitas vezes, o candidato pode se confundir com as alternativas que usam notações inventadas ou que omitem a condição de junção, resultando em um produto cartesiano. A chave é lembrar que, para unir tabelas, é necessário comparar as colunas que representam a mesma informação (as chaves).
1FROM: listar tabelas
2WHERE: igualar chaves
3SELECT: colunas desejadas
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Esta alternativa realiza um produto cartesiano entre as tabelas Computador e Usuário, sem nenhuma condição de junção. Isso significa que ela retorna todas as combinações possíveis entre um computador e um usuário, o que não reflete a relação real de uso. Além disso, a tabela Usa, que é essencial para conectar as duas tabelas, não é incluída na consulta. Portanto, o resultado não traz a informação correta de qual usuário utiliza qual computador.
Alternativa B — ✅ Correta ⟵ GABARITO
Esta alternativa está correta porque:
Lista as três tabelas no FROM: Computador C, Usuário U e Usa S.
Aplica as condições de junção no WHERE: C.ID = S.ID (relaciona o ID do computador com o ID na tabela Usa) e U.Código = S.Código (relaciona o código do usuário com o código na tabela Usa).
Seleciona as colunas desejadas: Nome (da tabela Usuário) e Modelo (da tabela Computador).
Essa é a forma clássica de junção implícita, que produz o resultado esperado: para cada registro na tabela Usa, ela encontra o usuário correspondente e o computador correspondente, retornando o nome e o modelo.
Alternativa C — ❌ Incorreta
A sintaxe ID (C, S) não é válida em SQL. A condição de junção deve ser uma expressão de comparação, como C.ID = S.ID. A forma apresentada não é reconhecida pelo SQL padrão e, portanto, a consulta não seria executada corretamente.
Alternativa D — ❌ Incorreta
A expressão C AND S (ID) é inválida. O operador AND é usado para combinar condições booleanas, mas não pode ser usado dessa forma para relacionar colunas. A condição correta seria C.ID = S.ID AND U.Código = S.Código. A sintaxe apresentada não é aceita pelo SQL.
Alternativa E — ❌ Incorreta
A expressão C (∗) = S (∗) não é uma sintaxe SQL válida. O asterisco (*) é usado para selecionar todas as colunas de uma tabela, mas não pode ser usado em uma condição de igualdade dessa maneira. A condição de junção deve comparar colunas específicas, como C.ID = S.ID.