Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2024

Banco de DadosConsultas e Comandos em SQL
Código
fc147218
Banca
FCC
Órgão
BAHIAGÁS
Ano
2024
Cargo
APO ( )

Considere duas tabelas em um banco de dados relacional de uma companhia de gás: uma tabela chamada Consumidor, que armazena informações sobre os clientes que consomem gás e outra tabela chamada OrdemServico, que contém informações sobre as ordens de serviços prestados pela companhia de gás para um dado cliente. A relação entre as tabelas é um para muitos, ou seja, uma dada ordem de serviço se refere a um único cliente e um cliente pode ter mais de um serviço prestado a ele. As tabelas estão normalizadas.

 

A tabela Consumidor tem nome_cons e endereço_cons e o identificador é codigo_cons. A tabela OrdemServico tem nome_serv e valor_serv e o identificador é codigo_serv. O codigo_cons é chave estrangeira em OrdemServico.

 

Para obter o nome e o endereço do consumidor e os serviços prestados a ele - nome do serviço e valor do serviço - usando o T-SQL em condições ideais e usando INNER JOIN, o código escrito foi

 

SELECT c.nome cons,

c.endereço_cons,

s.nome_serv,

s.valor_serv

FROM    I   .

INNER JOIN    II    c.codigo_cons    III   ;

 

Para o código estar correto, as lacunas I, II e III devem conter, respectivamente,

  1. Aconsumidor c - ordemservico s ON - = s.codigo_cons
  2. Bconsumidor c - ordemservico s WHERE - s.codigo_cons
  3. Cconsumidor c - ordemservico s ON - = c.codigo_cons
  4. Dordemservico s - consumidor c LIKE - s.codigo_cons
  5. Eordemservico s - consumidor e WHERE - = c.codigo_cons
Revelar gabarito e comentário

GabaritoA — consumidor c - ordemservico s ON - = s.codigo_cons

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

SQL: INNER JOIN e sintaxe de junção

Gabarito: letra A. A consulta correta usa FROM consumidor c INNER JOIN ordemservico s ON c.codigo_cons = s.codigo_cons, pois a condição de junção deve comparar a chave primária da tabela Consumidor com a chave estrangeira correspondente em OrdemServico. A alternativa A é a única que preenche as lacunas com a sintaxe válida do INNER JOIN.

O INNER JOIN é um dos tipos de junção mais utilizados em SQL. Ele combina registros de duas tabelas com base em uma condição de igualdade, retornando apenas as linhas que possuem correspondência em ambas as tabelas. No contexto do enunciado, temos duas tabelas normalizadas: Consumidor (com codigo_cons como chave primária) e OrdemServico (com codigo_serv como chave primária e codigo_cons como chave estrangeira). A relação é de um para muitos: um consumidor pode ter várias ordens de serviço, mas cada ordem pertence a um único consumidor.

A sintaxe básica de um INNER JOIN é:

SELECT colunas
FROM tabela1 alias1
INNER JOIN tabela2 alias2 ON alias1.coluna = alias2.coluna;

A cláusula ON é obrigatória e define a condição de junção. Nela, comparamos a chave primária da tabela Consumidor (c.codigo_cons) com a chave estrangeira da tabela OrdemServico (s.codigo_cons). É importante notar que a ordem dos operandos na condição não altera o resultado, mas a referência correta às colunas é essencial.

A pegadinha desta questão está na inversão das referências: algumas alternativas trocam c.codigo_cons por s.codigo_cons na condição, o que estaria incorreto, pois a chave estrangeira está em OrdemServico e deve ser comparada com a chave primária de Consumidor. Além disso, a alternativa B usa WHERE em vez de ON, o que é inválido na sintaxe do INNER JOIN.

Alternativa A — ✅ Correta ⟵ GABARITO

A alternativa A preenche as lacunas corretamente: consumidor c - ordemservico s ON - = s.codigo_cons. A consulta completa fica:

SELECT c.nome_cons, c.endereço_cons, s.nome_serv, s.valor_serv
FROM consumidor c
INNER JOIN ordemservico s ON c.codigo_cons = s.codigo_cons;

A condição ON c.codigo_cons = s.codigo_cons compara a chave primária de Consumidor com a chave estrangeira em OrdemServico, garantindo que cada ordem de serviço seja associada ao consumidor correto. A sintaxe está completa e válida.

Alternativa B — ❌ Incorreta

A alternativa B usa WHERE em vez de ON na cláusula de junção. No INNER JOIN, a condição de junção deve ser especificada com ON, não com WHERE. O WHERE é usado para filtrar linhas após a junção, mas não pode substituir o ON na sintaxe do JOIN. Portanto, a consulta resultante seria inválida.

Alternativa C — ❌ Incorreta

A alternativa C inverte a condição de junção: ON - = c.codigo_cons. Isso resultaria em ON s.codigo_cons = c.codigo_cons, o que é equivalente à alternativa A, pois a igualdade é comutativa. No entanto, a lacuna III está preenchida com = c.codigo_cons, o que, na ordem da consulta, ficaria ON s.codigo_cons = c.codigo_cons. Apesar de ser logicamente equivalente, a alternativa C não corresponde à estrutura exata da consulta, pois a lacuna II deveria conter ON e a lacuna III a condição completa. A alternativa A é a que preenche corretamente todas as lacunas na ordem esperada.

Alternativa D — ❌ Incorreta

A alternativa D usa LIKE em vez de ON e inverte a ordem das tabelas. O LIKE é um operador de comparação de padrões, não uma cláusula de junção. Além disso, a ordem das tabelas no FROM e no JOIN está invertida, o que não é um erro em si, mas a sintaxe com LIKE é inválida para junções.

Alternativa E — ❌ Incorreta

A alternativa E usa WHERE em vez de ON e o alias e para a tabela Consumidor, mas o alias correto é c. Além disso, a condição = c.codigo_cons está incompleta, pois falta a referência à coluna da tabela OrdemServico. A sintaxe está incorreta.

Gabarito: letra A

Link permanente: /questoes/fc147218