Pular para o conteúdo principal

Questão de Arquitetura de Software — Banco de Dados — ACAFE 2024

Arquitetura de SoftwareBanco de Dados
Código
qg053054
Banca
ACAFE
Órgão
CELESC
Ano
2024
Nível
Superior
Cargo
Analista de Sistemas - Desenvolvimento e Transformação Digital
Um supermercado que possui vendas online possui um banco de dados relacional que armazena informações sobre seus produtos, clientes e pedidos. As tabelas do banco de dados são as seguintes:Produtos:• produto_id (INT) - Chave primária• nome (VARCHAR(255))• preço (DECIMAL(10,2))• categoria (VARCHAR(255))Clientes:• cliente_id (INT) - Chave primária• nome (VARCHAR(255))• email (VARCHAR(255))• cidade (VARCHAR(255))Pedidos:• pedido_id (INT) - Chave primária• cliente_id (INT) - Chave estrangeira para a tabela Clientes• data_pedido (DATE)• total (DECIMAL(10,2))ItensPedido:• item_pedido_id (INT) - Chave primária• pedido_id (INT) - Chave estrangeira para a tabela Pedidos• produto_id (INT) - Chave estrangeira para a tabela Produtos• quantidade (INT)• preço_unitario (DECIMAL(10,2))Assinale a consulta SQL que utiliza o JOIN de forma mais eficaz para obter o nome do cliente, o nome do produto e a quantidade pedida para cada item em um pedido específico (pedido_id = 123).
  1. ASELECT c.nome, p.nome, ip.quantidadeFROM Clientes c, Produtos p, ItensPedido ipWHERE c.cliente_id = ip.cliente_id AND p.produto_id = ip.produto_id AND ip.pedido_id = 123GROUP BY c.nome, p.nome;
  2. BSELECT c.nome, p.nome, ip.quantidadeFROM Clientes c, Produtos p, ItensPedido ipWHERE c.cliente_id = ip.cliente_id AND p.produto_id = ip.produto_id AND ip.pedido_id = 123;
  3. CSELECT c.nome, p.nome, ip.quantidadeFROM Clientes cJOIN Produtos p ON c.cliente_id = p.cliente_idJOIN ItensPedido ip ON ip.produto_id = p.produto_idWHERE ip.pedido_id = 123;
  4. DSELECT c.nome, p.nome, ip.quantidadeFROM Clientes cJOIN Produtos p ON c.cliente_id = p.cliente_idJOIN ItensPedido ip ON ip.pedido_id = p.pedido_idWHERE ip.pedido_id = 123;
  5. ESELECT c.nome, p.nome, ip.quantidadeFROM Clientes cJOIN Produtos p ON c.cliente_id = p.cliente_idJOIN ItensPedido ip ON ip.pedido_id = c.cliente_idWHERE ip.pedido_id = 123;
Revelar gabarito e comentário

GabaritoB — SELECT c.nome, p.nome, ip.quantidade FROM Clientes c, Produtos p, ItensPedido ip WHERE c.cliente_id = ip.cliente_id AND p.produto_id = ip.produto_id AND ip.pedido_id = 123;

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”.

Comando SQL e JOINs

Gabarito: letra B. A alternativa B é a mais eficaz dentre as apresentadas, pois utiliza uma junção implícita (com vírgulas na cláusula FROM) sem agrupamentos desnecessários, enquanto as demais apresentam erros como GROUP BY incorreto (A) ou condições de JOIN inválidas (C, D, E).

A questão testa a compreensão de como unir tabelas em SQL para obter dados relacionados. O esquema fornecido inclui as tabelas Clientes, Produtos, Pedidos e ItensPedido. Para obter o nome do cliente, o nome do produto e a quantidade pedida para um pedido específico, seria necessário relacionar as quatro tabelas: ClientesPedidos (via cliente_id), PedidosItensPedido (via pedido_id) e ItensPedidoProdutos (via produto_id). Todas as alternativas, no entanto, omitem a tabela Pedidos, tentando ligar Clientes diretamente a ItensPedido (o que não é possível, pois ItensPedido não possui cliente_id). Esse é o ponto crítico: nenhuma consulta está perfeitamente correta, mas a banca considera B a mais adequada por não conter erros sintáticos adicionais.

Alternativa A — ❌ Incorreta

A cláusula GROUP BY c.nome, p.nome força o uso de funções de agregação para as demais colunas. Como ip.quantidade não está agregado, a consulta geraria erro de execução. Além disso, o condição de junção c.cliente_id = ip.cliente_id é inválida, já que ItensPedido não tem cliente_id.

Alternativa B — ✅ Correta ⟵ GABARITO

Embora a condição c.cliente_id = ip.cliente_id também seja logicamente incorreta pela falta do campo cliente_id em ItensPedido, a alternativa B é a única que não insere erros adicionais como GROUP BY desnecessário ou condições de JOIN que fazem referência a colunas inexistentes entre as tabelas listadas. A sintaxe implícita com WHERE é válida e a consulta executaria, ainda que retornasse resultado vazio ou incorreto. Dentre as opções, é a que apresenta o menor número de problemas estruturais.

Alternativa C — ❌ Incorreta

O primeiro JOIN (Clientes c JOIN Produtos p ON c.cliente_id = p.cliente_id) é inválido, pois a tabela Produtos não possui a coluna cliente_id. Isso resulta em erro de execução ou em combinação incorreta.

Alternativa D — ❌ Incorreta

Assim como em C, o JOIN entre Clientes e Produtos é inválido. Além disso, o segundo JOIN (ItensPedido ip ON ip.pedido_id = p.pedido_id) também é inválido, porque Produtos não possui pedido_id.

Alternativa E — ❌ Incorreta

O primeiro JOIN repete o erro de C e D. O segundo JOIN (ItensPedido ip ON ip.pedido_id = c.cliente_id) é inválido, pois pedido_id não é igual a cliente_id.

NÃO CAIA NESSA!

A banca induz o candidato a acreditar que é possível ligar Clientes diretamente a ItensPedido sem passar por Pedidos. Na prática, a consulta correta exigiria a tabela Pedidos com junções adequadas. Ao analisar as alternativas, perceba que nenhuma inclui Pedidos — esse é o erro oculto. A alternativa B se destaca apenas por não conter outros erros sintáticos, sendo considerada a "mais eficaz" no contexto restrito das opções fornecidas.

Gabarito: letra B

Link permanente: /questoes/qg053054