Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2025

Banco de DadosConsultas e Comandos em SQL
Código
ce417326
Banca
CESPE / CEBRASPE
Órgão
PF
Ano
2025
Cargo
Estat ( )

A seguir, são apresentados um modelo de banco de dados, consistindo de quatro tabelas, bem como os comandos SQL utilizados para a criação e a inserção de dados nessas tabelas.

 

Imagem associada para resolução da questão

 

criação das tabelas


CREATE TABLE Envolvido (
  idEnvolvido INT NOT NULL,
  Alcunha VARCHAR(45) NULL DEFAULT NULL,
  PRIMARY KEY (idEnvolvido));


CREATE TABLE TipoInquerito (
  idTipoInquerito INT NOT NULL,
  TipoInquerito VARCHAR(45) NOT NULL,
  PRIMARY KEY (idTipoInquerito));


CREATE TABLE Inquerito (
  idInquerito INT NOT NULL,
  NumeroInquerito INT NOT NULL,
  idTipoInquerito INT NOT NULL,
  PRIMARY KEY (idInquerito),
    FOREIGN KEY (idTipoInquerito)
    REFERENCES TipoInquerito (idTipoInquerito));


CREATE TABLE EnvolvidoInquerito (
  idEnvolvido INT NOT NULL,
  idInquerito INT NOT NULL,
  PRIMARY KEY (idEnvolvido, idInquerito),
    FOREIGN KEY (idEnvolvido)
    REFERENCES Envolvido (idEnvolvido),
    FOREIGN KEY (idInquerito)
    REFERENCES Inquerito (idInquerito));


inserção de dados nas tabelas

 

INSERT INTO Envolvido (idEnvolvido, Alcunha)
VALUES (10, 'Gargamel');

INSERT INTO Envolvido (idEnvolvido, Alcunha)
VALUES (20, 'Vingador');

INSERT INTO Envolvido (idEnvolvido, Alcunha)
VALUES (30, 'Esqueleto');

 

INSERT INTO TipoInquerito (idTipoInquerito,
TipoInquerito) VALUES (11, 'Inquérito
Policial');

INSERT INTO TipoInquerito (idTipoInquerito,
TipoInquerito) VALUES (12, 'Inquérito Civil');
INSERT INTO TipoInquerito (idTipoInquerito,
TipoInquerito) VALUES (13, 'Notícia-Crime');

INSERT INTO Inquerito (idInquerito,
NumeroInquerito, idTipoInquerito) VALUES (1,111, 13);
INSERT INTO Inquerito (idInquerito,
NumeroInquerito, idTipoInquerito) VALUES(2,121, 12);
INSERT INTO Inquerito (idInquerito,
NumeroInquerito, idTipoInquerito) VALUES(3,131, 13);
INSERT INTO Inquerito (idInquerito,
NumeroInquerito, idTipoInquerito) VALUES (4,444, 11);
INSERT INTO Inquerito (idInquerito,
NumeroInquerito, idTipoInquerito) VALUES(5,555, 13);

 

INSERT INTO EnvolvidoInquerito (idEnvolvido,
idInquerito) VALUES (10, 1);
INSERT INTO EnvolvidoInquerito (idEnvolvido,
idInquerito) VALUES (20, 1);
INSERT INTO EnvolvidoInquerito (idEnvolvido,
idInquerito) VALUES (20, 4);
INSERT INTO EnvolvidoInquerito (idEnvolvido,
idInquerito) VALUES (30, 1);
INSERT INTO EnvolvidoInquerito (idEnvolvido,
idInquerito) VALUES (30, 3);
INSERT INTO EnvolvidoInquerito (idEnvolvido,
idInquerito) VALUES (30, 5);

 

Considerando as informações precedentes, julgue o próximo item, relativos à SQL.

 

Considere o comando SQL a seguir.

 

SELECT DISTINCT I.NumeroInquerito
FROM Envolvido AS E
INNER JOIN EnvolvidoInquerito AS EI ON
E.idEnvolvido = EI.idEnvolvido
INNER JOIN Inquerito AS I ON EI.idInquerito =
I.idInquerito
GROUP BY I.NumeroInquerito
HAVING COUNT(I.idInquerito) > 1;

 

Ao ser executado, esse comando apresentará o resultado seguinte.

 

NumeroInquerito
111

  1. CCerto
  2. EErrado
Revelar gabarito e comentário

GabaritoC — Certo

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, GROUP BY e HAVING com COUNT

Gabarito: Certo. A consulta executa um INNER JOIN entre Envolvido, EnvolvidoInquerito e Inquerito, agrupa pelo número do inquérito e, com HAVING COUNT(I.idInquerito) > 1, filtra apenas os números que aparecem mais de uma vez na relação EnvolvidoInquerito. Como o inquérito de número 111 (idInquerito = 1) está associado a três envolvidos (10, 20 e 30), ele é o único que satisfaz a condição, retornando exatamente a linha 111.

O comando combina três conceitos centrais da linguagem SQL: a junção interna (INNER JOIN), o agrupamento (GROUP BY) e o filtro sobre grupos (HAVING). O INNER JOIN combina linhas de duas tabelas quando a condição de junção é verdadeira — aqui, liga Envolvido a EnvolvidoInquerito pela chave idEnvolvido, e depois liga o resultado a Inquerito pela chave idInquerito. O GROUP BY I.NumeroInquerito agrupa as linhas resultantes por número de inquérito, e o HAVING COUNT(I.idInquerito) > 1 filtra os grupos que tenham mais de uma linha — ou seja, inquéritos com mais de um envolvido.

Vamos aplicar isso aos dados. A tabela EnvolvidoInquerito registra as associações:

idEnvolvido

idInquerito

10

1

20

1

20

4

30

1

30

3

30

5

O inquérito 1 (número 111) aparece três vezes (envolvidos 10, 20 e 30). O inquérito 4 (número 444) aparece uma vez (envolvido 20). Os inquéritos 3 (número 131) e 5 (número 555) aparecem uma vez cada (envolvido 30). O inquérito 2 (número 121) não aparece em EnvolvidoInquerito, então não entra no resultado do INNER JOIN. Após o agrupamento por NumeroInquerito, temos:

NumeroInquerito

COUNT(I.idInquerito)

111

3

444

1

131

1

555

1

O HAVING COUNT(I.idInquerito) > 1 mantém apenas o grupo com contagem maior que 1, ou seja, o número 111. O SELECT DISTINCT é redundante aqui, pois o GROUP BY já garante a unicidade dos valores de NumeroInquerito no resultado. Portanto, o resultado é exatamente a tabela apresentada no enunciado.

A pegadinha que a banca explora é a confusão entre WHERE e HAVING. O WHERE filtra linhas antes do agrupamento; o HAVING filtra grupos depois da agregação. Se o candidato tentasse usar WHERE COUNT(...) > 1, o comando falharia, pois funções agregadas não podem ser usadas no WHERE. Além disso, é preciso notar que o COUNT conta as linhas do grupo — aqui, cada linha representa um envolvido no inquérito, então a contagem reflete o número de envolvidos por inquérito.

Guarde a distinção entre WHERE e HAVING: é exatamente nela que esta questão se decide. O WHERE age linha a linha, antes do GROUP BY; o HAVING age grupo a grupo, depois da agregação.

Item — ✅ CERTO

A consulta está correta e produz o resultado indicado. O INNER JOIN combina as três tabelas, o GROUP BY I.NumeroInquerito agrupa por número de inquérito e o HAVING COUNT(I.idInquerito) > 1 seleciona apenas os números que aparecem mais de uma vez. Como o inquérito 111 (idInquerito = 1) tem três envolvidos, ele é o único que passa no filtro. O SELECT DISTINCT é desnecessário, mas não altera o resultado, pois o GROUP BY já garante valores únicos.

Gabarito: Certo

Link permanente: /questoes/ce417326