Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2025
Banco de Dados›Consultas e Comandos em SQL
Código
fc150337
Banca
FCC
Órgão
Pref SP
Ano
2025
Cargo
Ana ( )
A Secretaria Municipal de Mobilidade e Trânsito de uma Prefeitura solicitou um estudo para determinar a melhor rota entre dois bairros (A e B) considerando diversos fatores, tais como distância, tempo estimado de viagem, condições da estrada e custo do combustível. Os dados estão nas duas tabelas seguintes de um Banco de Dados Relacional Oracle: ■ Bairros: Contém informações sobre cada bairro, incluindo um ID único, nome e coordenadas geográficas. ■ Rotas: Contém informações sobre as rotas existentes entre os bairros, como ID da rota, bairro de origem, bairro de destino, distância, tempo estimado, condição da estrada e custo estimado. Em uma consulta utilizando INNER JOIN, a expressão SQL correta para encontrar a rota mais eficiente entre dois bairros específicos, com base nos critérios definidos pelo órgão, é
ASELECT * FROM ROTAS WHERE bairro_origem = 'Bairro A' AND bairro_destino = 'Bairro B' AND MIN (r . distancia) INNER JOIN ROTAS AND BAIRROS;
BSELECT r . id_rota, MIN (r . distancia) FROM ROTAS r INNER JOIN BAIRROS b ON r . bairro_ origem - b . id bairro WHERE b . nome= 'Bairro A' GROUP BY r . id rota ;
CSELECT r . id_rota , r .distancia, r . tempo_estimado FROM ROTAS r INNER JOIN BAIRROS b ON r . bairro_origem = b . id_bairro WHERE b . nome= 'Bairro A' AND r . bairro_destino = 'Bairro B' ORDER BY r . distancia ASC, r . tempo_estimado ASC;
DSELECT INNER JOIN r . id_rota, r . distancia, r . tempo_estimado FROM ROTAS r WHERE bairro_origem = 'Bairro A' ANDAND bairro_destino = 'Bairro B' ORDER BY r . distancia ASC;
ESELECT r . id_rota , r . distancia, r . tempo_estimado FROM ROTAS r INNER JOIN BAIRROS b ON r .bairro_origem = b . id_bairro WHERE b . nome= 'Bairro A';
Revelar gabarito e comentário▾
GabaritoC — SELECT r . id_rota , r .distancia, r . tempo_estimado FROM ROTAS r INNER JOIN BAIRROS b ON r . bairro_origem = b . id_bairro WHERE b . nome= 'Bairro A' AND r . bairro_destino = 'Bairro B' ORDER BY r . distancia ASC, r . tempo_estimado ASC;
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 INNER JOIN: selecionando a rota mais eficiente
Gabarito: letra C. A consulta correta deve combinar as tabelas ROTAS e BAIRROS por meio de um INNER JOIN, filtrar as rotas que partem do bairro A e chegam ao bairro B, e ordenar os resultados pela distância e pelo tempo estimado, de forma crescente, para destacar a rota mais eficiente. A alternativa C é a única que apresenta a sintaxe correta e completa para esse objetivo.
O INNER JOIN é uma operação da linguagem SQL que combina registros de duas ou mais tabelas com base em uma condição de igualdade entre colunas relacionadas. No contexto do problema, a tabela ROTAS possui uma coluna bairro_origem que referencia o ID do bairro na tabela BAIRROS. Para obter o nome do bairro de origem (e não apenas o ID), é necessário unir as duas tabelas por essa chave. A consulta deve então filtrar as linhas onde o nome do bairro de origem é 'Bairro A' e o destino é 'Bairro B', e ordenar o resultado pela distância e pelo tempo estimado, em ordem crescente, para que a primeira linha retornada seja a rota mais curta e rápida.
A cláusula ORDER BY é fundamental para classificar os resultados. No SQL, a ordenação padrão é crescente (ASC), mas é uma boa prática explicitá-la. A alternativa C utiliza ORDER BY r.distancia ASC, r.tempo_estimado ASC, o que atende perfeitamente ao requisito de encontrar a rota mais eficiente, priorizando a menor distância e, em caso de empate, o menor tempo.
É importante notar que a consulta não precisa usar funções de agregação como MIN, pois o objetivo é listar as rotas ordenadas, e não calcular um valor agregado. O uso de MIN sem GROUP BY, como na alternativa A, é inválido, e a alternativa B agrupa por id_rota, o que não faz sentido para encontrar a rota mais eficiente entre dois bairros específicos.
A pegadinha desta questão está na combinação de três elementos: a necessidade do INNER JOIN para acessar o nome do bairro, o filtro duplo (origem e destino) e a ordenação por dois critérios. Muitos candidatos podem esquecer o JOIN ou o filtro de destino, ou usar funções de agregação de forma incorreta. A alternativa C é a única que reúne todos os elementos corretamente.
1INNER JOIN (origem = id)
2Filtro origem e destino
3ORDER BY distância, tempo
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Esta alternativa apresenta uma sintaxe inválida. A cláusula WHERE não pode conter uma função de agregação como MIN diretamente, e a cláusula INNER JOIN está posicionada de forma incorreta, após o WHERE. Além disso, não há uma condição de junção entre as tabelas ROTAS e BAIRROS. A consulta tenta usar MIN(r.distancia) dentro do WHERE, o que é proibido, pois funções agregadas só podem aparecer na lista de seleção ou na cláusula HAVING, e não no WHERE. A sintaxe correta exigiria uma subconsulta ou uma cláusula GROUP BY, mas mesmo assim não atenderia ao objetivo de listar as rotas ordenadas.
Alternativa B — ❌ Incorreta
Esta alternativa usa MIN(r.distancia) na lista de seleção e agrupa por r.id_rota. Isso retornaria uma linha para cada rota, com a distância mínima, mas como cada rota tem uma única distância, o MIN não teria efeito. Além disso, o filtro WHERE b.nome = 'Bairro A' não inclui a condição de destino, então a consulta retornaria todas as rotas que partem do bairro A, independentemente do destino. O GROUP BY por id_rota é desnecessário e não ajuda a encontrar a rota mais eficiente entre dois bairros específicos. A consulta não ordena os resultados, então não há garantia de que a rota mais eficiente seja a primeira.
Alternativa C — ✅ Correta ⟵ GABARITO
Esta alternativa está correta porque:
Utiliza INNER JOIN entre ROTAS e BAIRROS com a condição ON r.bairro_origem = b.id_bairro, permitindo acessar o nome do bairro de origem.
Filtra as rotas com WHERE b.nome = 'Bairro A' AND r.bairro_destino = 'Bairro B', garantindo que apenas as rotas entre os dois bairros específicos sejam retornadas.
Ordena os resultados por r.distancia ASC, r.tempo_estimado ASC, colocando a rota mais curta e rápida em primeiro lugar.
Seleciona as colunas relevantes: id_rota, distancia e tempo_estimado.
Alternativa D — ❌ Incorreta
Esta alternativa tem dois erros graves: a cláusula INNER JOIN está posicionada de forma incorreta, logo após o SELECT, e não há condição de junção. Além disso, há um erro de digitação: ANDAND em vez de AND. A consulta não faz a junção com a tabela BAIRROS, então não é possível filtrar pelo nome do bairro. Ela tenta filtrar diretamente por bairro_origem = 'Bairro A', mas como não há JOIN, essa coluna pode não existir na tabela ROTAS (na verdade, existe, mas o nome do bairro pode ser um ID, não um nome). A ordenação por distância é correta, mas a falta do JOIN e o erro de sintaxe tornam a consulta inválida.
Alternativa E — ❌ Incorreta
Esta alternativa faz o INNER JOIN corretamente e filtra pelo nome do bairro de origem, mas não inclui a condição de destino. Portanto, retornaria todas as rotas que partem do bairro A, independentemente do destino. Além disso, não há ordenação, então não é possível identificar a rota mais eficiente. A consulta está incompleta para o objetivo proposto.