Pular para o conteúdo principal

Questão de Banco de Dados — Geral — INSTITUTO AOCP 2026

Banco de DadosGeral
Código
qa431990
Banca
INSTITUTO AOCP
Órgão
UNIRIO
Ano
2026
Cargo
Tec ( )

Na UNIRIO, um técnico de tecnologia da informação precisa elaborar uma consulta SQL para gerar um relatório interno. O objetivo é listar os nomes dos funcionários que sejam terceirizados, possuam ao menos um dependente registrado, residam no estado do Rio de Janeiro e recebam salário igual ou superior a R$ 3.000,00. As informações estão distribuídas nas tabelas Funcionarios, Dependentes e Enderecos, vinculadas por chaves estrangeiras. Considerando esses critérios, qual comando SQL (Structured Query Language) atende corretamente à solicitação?

  1. ASELECT f.nome FROM Funcionarios f JOIN Dependentes d ON d.funcionario_id = f.id JOIN Enderecos e ON e.funcionario_id = f.id WHERE f.tipo_contratacao = 'Terceirizado'    AND e.estado = 'RJ'    AND f.salario >= 3000 GROUP BY f.id, f.nome HAVING COUNT(d.id) >= 1;
  2. BSELECT f.nome FROM Funcionarios f JOIN Enderecos e ON e.funcionario_id = f.id WHERE f.salario > 3000    AND e.estado = 'RJ' ORDER BY f.nome;
  3. CSELECT f.nome FROM Funcionarios f LEFT JOIN Dependentes d ON d.funcionario_id = f.id WHERE f.tipo_contratacao = 'Efetivo'    AND f.salario >= 3000 GROUP BY f.nome;
  4. DSELECT f.nome FROM Funcionarios f JOIN Dependentes d ON d.funcionario_id = f.id WHERE f.tipo_contratacao = 'Terceirizado'    AND f.salario >= 3000 GROUP BY f.nome;
  5. ESELECT f.nome FROM Funcionarios f JOIN Enderecos e ON e.funcionario_id = f.id JOIN Dependentes d ON d.funcionario_id = f.id WHERE e.estado = 'SP'    AND f.tipo_contratacao = 'Terceirizado' GROUP BY f.nome;
Revelar gabarito e comentário

GabaritoA — SELECT f.nome FROM Funcionarios f JOIN Dependentes d ON d.funcionario_id = f.id JOIN Enderecos e ON e.funcionario_id = f.id WHERE f.tipo_contratacao = 'Terceirizado'    AND e.estado = 'RJ'    AND f.salario >= 3000 GROUP BY f.id, f.nome HAVING COUNT(d.id) >= 1;

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: junções, filtros e agrupamento para relatório de funcionários

Gabarito: letra A. A alternativa A é a única que atende a todos os critérios do enunciado: realiza os JOINs necessários entre as três tabelas (Funcionarios, Dependentes e Enderecos), aplica os filtros de tipo de contratação 'Terceirizado', estado 'RJ' e salário >= 3000, e utiliza GROUP BY com HAVING COUNT(d.id) >= 1 para garantir que o funcionário tenha ao menos um dependente registrado. As demais alternativas omitem filtros essenciais, usam operadores incorretos ou filtram por valores errados.

Para resolver essa questão, é fundamental entender o papel de cada cláusula SQL na construção de uma consulta que combina dados de múltiplas tabelas. O JOIN (ou INNER JOIN) é usado para combinar linhas de duas ou mais tabelas com base em uma condição de igualdade entre colunas relacionadas — aqui, as chaves estrangeiras funcionario_id nas tabelas Dependentes e Enderecos que referenciam a chave primária id da tabela Funcionarios. O WHERE filtra as linhas resultantes da junção antes de qualquer agrupamento, aplicando condições sobre colunas individuais. Já o GROUP BY agrupa as linhas que possuem os mesmos valores nas colunas especificadas, permitindo o uso de funções de agregação como COUNT, SUM, AVG, MAX e MIN. Por fim, o HAVING filtra os grupos formados pelo GROUP BY, aplicando condições sobre os resultados das funções de agregação — diferente do WHERE, que não pode usar funções de agregação diretamente.

No caso concreto, o requisito "possuam ao menos um dependente registrado" exige uma verificação de contagem: para cada funcionário, precisamos contar quantos dependentes existem na tabela Dependentes e garantir que esse número seja maior ou igual a 1. Isso só é possível com GROUP BY (agrupando por funcionário) e HAVING COUNT(d.id) >= 1. Sem o GROUP BY/HAVING, a consulta não conseguiria expressar essa condição de forma correta — um simples WHERE não funcionaria, pois não há uma coluna direta que indique "tem dependente".

Um ponto importante é a diferença entre INNER JOIN e LEFT JOIN. O INNER JOIN retorna apenas as linhas que possuem correspondência em ambas as tabelas; o LEFT JOIN retorna todas as linhas da tabela à esquerda, mesmo que não haja correspondência na tabela à direita (nesse caso, as colunas da direita ficam com NULL). Para o requisito "possuam ao menos um dependente", o INNER JOIN com Dependentes é suficiente e até mais eficiente, pois já descarta funcionários sem dependentes. O LEFT JOIN também funcionaria, mas exigiria um HAVING COUNT(d.id) >= 1 para filtrar os que têm dependente — e, nesse caso, o INNER JOIN é mais direto.

A pegadinha que a banca explora aqui é a combinação de múltiplos critérios: muitos candidatos esquecem de incluir o JOIN com Enderecos (necessário para filtrar por estado) ou o GROUP BY/HAVING (necessário para a condição de dependentes). Outros trocam o operador >= por > (excluindo quem ganha exatamente R$ 3.000,00) ou filtram por estado errado ('SP' em vez de 'RJ'). A alternativa correta precisa contemplar todos os requisitos simultaneamente.

Guarde a estrutura mental: JOINs para conectar as tabelas → WHERE para filtrar linhas → GROUP BY para agrupar → HAVING para filtrar grupos. É exatamente essa sequência que separa a alternativa correta das demais.

Critério

A (✅ Gabarito)

B

C

D

E

JOIN com Dependentes

✅ Sim

❌ Não

✅ Sim (LEFT JOIN)

✅ Sim

✅ Sim

JOIN com Enderecos

✅ Sim

✅ Sim

❌ Não

❌ Não

✅ Sim

Filtro tipo_contratacao

✅ 'Terceirizado'

❌ Ausente

❌ 'Efetivo'

✅ 'Terceirizado'

✅ 'Terceirizado'

Filtro estado

✅ 'RJ'

✅ 'RJ'

❌ Ausente

❌ Ausente

❌ 'SP'

Filtro salário

>= 3000

> 3000

>= 3000

>= 3000

❌ Ausente

Condição dependente (GROUP BY/HAVING)

HAVING COUNT(d.id) >= 1

❌ Ausente

❌ Ausente (sem HAVING)

HAVING COUNT(d.id) >= 1

❌ Ausente (sem HAVING)

Alternativa A — ✅ Correta ⟵ GABARITO

A alternativa A está correta porque:

  • Realiza JOIN com Dependentes e Enderecos, conectando as três tabelas pelas chaves estrangeiras funcionario_id.

  • Filtra no WHERE por tipo_contratacao = 'Terceirizado', estado = 'RJ' e salario >= 3000 — atendendo aos três critérios de filtragem.

  • Usa GROUP BY f.id, f.nome para agrupar por funcionário (incluindo o id para evitar agrupamento incorreto de funcionários homônimos).

  • Usa HAVING COUNT(d.id) >= 1 para garantir que o funcionário tenha ao menos um dependente registrado.

A combinação GROUP BY + HAVING é a forma correta de aplicar uma condição sobre uma agregação (contagem de dependentes). O INNER JOIN com Dependentes já elimina funcionários sem dependentes, mas o HAVING torna a intenção explícita e é necessário caso haja alguma linha duplicada por outros motivos.

Alternativa B — ❌ Incorreta

A alternativa B está incorreta por dois motivos principais:

  1. Não faz JOIN com a tabela Dependentes — portanto, não há como verificar se o funcionário possui ao menos um dependente. O requisito "possuam ao menos um dependente registrado" fica completamente ausente.

  2. Usa salario > 3000 em vez de salario >= 3000 — o operador > exclui funcionários que ganham exatamente R$ 3.000,00, contrariando o critério "salário igual ou superior a R$ 3.000,00".

Além disso, a consulta não possui GROUP BY nem HAVING, o que seria necessário para a condição de dependentes. O ORDER BY f.nome é irrelevante para os critérios do relatório.

Alternativa C — ❌ Incorreta

A alternativa C está incorreta porque:

  1. Filtra por tipo_contratacao = 'Efetivo' — o enunciado pede funcionários terceirizados, não efetivos. Essa é uma troca direta do valor do filtro.

  2. Não faz JOIN com a tabela Enderecos — portanto, não há como filtrar por estado 'RJ'. O requisito de residência no Rio de Janeiro fica ausente.

  3. Usa LEFT JOIN com Dependentes — embora o LEFT JOIN seja válido, sem um HAVING COUNT(d.id) >= 1 a consulta retornaria funcionários sem dependentes também, violando o requisito.

A combinação de filtro errado de contratação e ausência do filtro de estado torna a consulta completamente inadequada.

Alternativa D — ❌ Incorreta

A alternativa D está incorreta porque:

  1. Não faz JOIN com a tabela Enderecos — o requisito de residir no estado do Rio de Janeiro (e.estado = 'RJ') não pode ser verificado, pois a tabela Enderecos não é incluída na consulta.

  2. Embora use JOIN com Dependentes, GROUP BY e HAVING COUNT(d.id) >= 1 (corretos para a condição de dependentes), a ausência do filtro de estado é um erro grave que desqualifica a alternativa.

A consulta atende parcialmente aos critérios (terceirizado, salário >= 3000, com dependente), mas falha no critério de localização.

Alternativa E — ❌ Incorreta

A alternativa E está incorreta porque:

  1. Filtra por estado = 'SP' — o enunciado pede funcionários que residam no estado do Rio de Janeiro ('RJ'), não em São Paulo ('SP'). Essa é uma troca direta do valor do filtro.

  2. Não filtra por salário — a condição salario >= 3000 está completamente ausente da consulta.

  3. Embora faça JOIN com Enderecos e Dependentes, use GROUP BY e filtre por 'Terceirizado', a ausência do filtro de salário e o estado errado tornam a consulta incorreta.

A alternativa E é um distrator clássico: inclui os JOINs corretos, mas erra nos valores dos filtros.

NÃO CAIA NESSA!

A banca adora trocar os valores dos filtros para confundir. Aqui, a alternativa E usa 'SP' em vez de 'RJ', e a alternativa C usa 'Efetivo' em vez de 'Terceirizado'. Além disso, a alternativa B usa > em vez de >=, excluindo quem ganha exatamente R$ 3.000,00. Fique atento a esses detalhes — eles são a diferença entre acertar e errar. Com treino, você enxerga essas trocas de longe 💪

PEGA ESSA DICA!

Para questões de SQL com múltiplos critérios, monte um checklist mental: (1) quais tabelas preciso juntar? (2) quais filtros aplicar no WHERE? (3) há alguma condição de agregação (como "ao menos um") que exija GROUP BY/HAVING? Verifique cada alternativa contra esse checklist, item por item, e elimine as que falharem em qualquer ponto.

Gabarito: letra A

Link permanente: /questoes/qa431990