Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FUNDATEC 2023

Banco de DadosSQL
Código
qq896803
Banca
FUNDATEC
Órgão
PROCERGS
Ano
2023
Nível
Superior
Cargo
ANC - Analista em Computação - Ênfase em Programação de Sistemas na Tecnologia Java
Para responder à questão, considere o modelo entidade-relacionamento (ER) apresentado pela Figura 1 abaixo:


Imagem da questão
Figura 1 – Modelo entidade-relacionamento (ER)
Considerando o modelo ER apresentado pela Figura 1, analise expressão SQL abaixo.select car_id, max(emc_salario)from empregadocargo, cargowhere empregadocargo.car_id = cargo.car_idgroup by car_idhaving max(emc_salario) > 1000order by max(emc_salario) desc;Qual alternativa está correta ao executar essa expressão SQL?
  1. AExibe car_id e o maior valor de emc_salario de cada car_id, cujos valores de emc_salario sejam maiores que 1000, em ordem decrescente de emc_salario.
  2. BApresenta car_id e emc_salario, cujos valores de emc_salario sejam maiores que 1000, em ordem decrescente de emc_salario.
  3. CMostra car_id e emc_salario dos 1000 primeiros maiores valores de emc_salario, em ordem decrescente de emc_salario.
  4. DApresenta os 1000 primeiros registros, dos atributos car_id e max(emc_salario), ordenados decrescentemente por max(emc_salario).
  5. EA expressão não executa corretamente porque possui erro de sintaxe.
Revelar gabarito e comentário

GabaritoE — A expressão não executa corretamente porque possui erro de sintaxe.

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: GROUP BY, HAVING e ORDER BY

Gabarito: letra E. A expressão SQL apresentada contém um erro de sintaxe: a cláusula HAVING está sendo usada sem a cláusula GROUP BY, o que é obrigatório em SQL padrão. A alternativa E é a única que identifica corretamente esse problema.

A consulta tenta agrupar os registros por car_id e, para cada grupo, calcular o maior emc_salario. A intenção é clara: usar GROUP BY car_id e HAVING max(emc_salario) > 1000. No entanto, a cláusula GROUP BY está ausente, e o HAVING aparece sozinho, o que viola a sintaxe do SQL. Em bancos de dados relacionais, o HAVING só pode ser usado em conjunto com GROUP BY (ou com funções de agregação, mas sempre após um agrupamento).

Vamos entender o papel de cada cláusula:

  • SELECT: define as colunas que serão retornadas. Aqui, car_id e max(emc_salario).

  • FROM: indica as tabelas envolvidas. Aqui, empregadocargo e cargo.

  • WHERE: filtra linhas antes do agrupamento. Aqui, faz a junção entre as tabelas.

  • GROUP BY: agrupa linhas com valores iguais nas colunas especificadas. Aqui está o problema: essa cláusula não existe na consulta.

  • HAVING: filtra grupos após o agrupamento. Só pode ser usado se houver GROUP BY.

  • ORDER BY: ordena o resultado final.

A ordem lógica de execução de uma consulta SQL é:

  1. FROM (e JOIN)

  2. WHERE

  3. GROUP BY

  4. HAVING

  5. SELECT

  6. ORDER BY

Sem o GROUP BY, o HAVING não tem sentido, pois não há grupos para filtrar. A maioria dos SGBDs (MySQL, PostgreSQL, SQL Server, Oracle) retornará um erro de sintaxe ao executar essa consulta.

Para que a consulta funcionasse, ela deveria ser escrita assim:

select car_id, max(emc_salario)
from empregadocargo, cargo
where empregadocargo.car_id = cargo.car_id
group by car_id
having max(emc_salario) > 1000
order by max(emc_salario) desc;

Nesse caso, ela exibiria, para cada car_id, o maior emc_salario, mas apenas para os grupos cujo maior salário fosse superior a 1000, ordenados do maior para o menor.

A pegadinha da questão está em reconhecer que a ausência do GROUP BY torna a consulta inválida. As alternativas A a D descrevem resultados que seriam obtidos se a consulta estivesse correta, mas nenhuma delas corresponde ao que realmente acontece: um erro de sintaxe.

  1. 1FROM / JOIN
  2. 2WHERE
  3. 3GROUP BY
  4. 4HAVING
  5. 5SELECT
  6. 6ORDER BY
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Descreve o resultado esperado de uma consulta com GROUP BY e HAVING funcionando corretamente. No entanto, a consulta original não possui GROUP BY, então ela não executa. A alternativa A seria correta se a consulta tivesse GROUP BY car_id, mas não é o caso.

Alternativa B — ❌ Incorreta

Afirma que a consulta apresenta car_id e emc_salario (sem agregação) e filtra por emc_salario > 1000. Isso não corresponde à consulta, que usa max(emc_salario) e HAVING. Além disso, a consulta não executa por erro de sintaxe.

Alternativa C — ❌ Incorreta

Interpreta erroneamente o HAVING max(emc_salario) > 1000 como se fosse um filtro de "1000 primeiros maiores valores". O HAVING é um filtro de grupos, não um limitador de linhas. E, novamente, a consulta não executa.

Alternativa D — ❌ Incorreta

Também interpreta o HAVING como um limitador de registros ("1000 primeiros registros"). Não é isso que o HAVING faz, e a consulta está com erro de sintaxe.

Alternativa E — ✅ Correta ⟵ GABARITO

Identifica corretamente que a expressão SQL não executa por erro de sintaxe. O erro é a ausência da cláusula GROUP BY, que é obrigatória para o uso do HAVING. Essa é a única alternativa que reflete o comportamento real da consulta.

NÃO CAIA NESSA!

A banca tenta induzir o candidato a analisar o resultado da consulta como se ela estivesse correta, mas o erro de sintaxe é o ponto central. Muitos candidatos marcam a alternativa A, que descreve o resultado esperado, sem perceber que a consulta não executa. Fique atento: sempre verifique se a consulta está sintaticamente correta antes de analisar o resultado.

NÃO CAIA NESSA!

Na prova, quando uma consulta SQL parecer estranha, verifique a ordem das cláusulas. Lembre-se: GROUP BY vem antes de HAVING. Se o HAVING aparecer sem GROUP BY, a consulta está errada. Essa é uma pegadinha clássica em concursos.

Gabarito: letra E

Link permanente: /questoes/qq896803