Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — VUNESP 2023

Banco de DadosConsultas 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 é:

  1. ASELECT Nome, Modelo FROM Computador, Usuário;
  2. BSELECT Nome, Modelo FROM Computador C, Usuário U, Usa S WHERE C.ID = S.ID AND U.Código = S.Código;
  3. CSELECT Nome, Modelo FROM Computador C, Usuário U, Usa S WHERE ID (C, S) AND Código (U, S);
  4. DSELECT Nome, Modelo FROM Computador C, Usuário U, Usa S WHERE C AND S (ID); S AND U (Código);
  5. 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árioUsaComputador, 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).

  1. 1FROM: listar tabelas
  2. 2WHERE: igualar chaves
  3. 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.

Gabarito: letra B

Link permanente: /questoes/vu195447