Questão de Banco de Dados — Geral — INSTITUTO AOCP 2026
Banco de Dados›Geral
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?
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;
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;
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;
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;
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:
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.
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:
Filtra por tipo_contratacao = 'Efetivo' — o enunciado pede funcionários terceirizados, não efetivos. Essa é uma troca direta do valor do filtro.
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.
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:
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.
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:
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.
Não filtra por salário — a condição salario >= 3000 está completamente ausente da consulta.
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.