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
ce417324
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 TI.TipoInquerito,
COUNT(I.idTipoInquerito) AS quantidade
FROM Envolvido AS E
INNER JOIN EnvolvidoInquerito AS EI ON
E.idEnvolvido = EI.idEnvolvido
INNER JOIN Inquerito AS I ON EI.idInquerito =
I.idInquerito
INNER JOIN TipoInquerito AS TI ON
I.idTipoInquerito = TI.idTipoInquerito
GROUP BY TI.TipoInquerito;

 

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

 

TipoInquerito        quantidade

Inquérito Policial        1
Inquérito Civil           1
Notícia-Crime             3

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

GabaritoE — Errado

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ção INNER JOIN e Agregação com GROUP BY

Gabarito: Errado. O comando SQL apresentado não produz o resultado mostrado na tabela, pois a contagem de inquéritos por tipo está incorreta. A consulta realiza uma junção interna (INNER JOIN) entre as tabelas, o que exclui registros sem correspondência, e a contagem resultante para cada tipo de inquérito não corresponde aos valores apresentados (Inquérito Policial: 1, Inquérito Civil: 1, Notícia-Crime: 3).

A consulta em questão utiliza INNER JOIN para combinar as tabelas Envolvido, EnvolvidoInquerito, Inquerito e TipoInquerito. O INNER JOIN retorna apenas as linhas que possuem correspondência em todas as tabelas envolvidas. Em seguida, a cláusula GROUP BY agrupa os resultados por TipoInquerito e a função COUNT(I.idTipoInquerito) conta quantas linhas existem em cada grupo. Para verificar se o resultado está correto, é necessário analisar os dados inseridos e executar a consulta passo a passo.

Vamos analisar os dados das tabelas:

  • Envolvido: (10, 'Gargamel'), (20, 'Vingador'), (30, 'Esqueleto')

  • TipoInquerito: (11, 'Inquérito Policial'), (12, 'Inquérito Civil'), (13, 'Notícia-Crime')

  • Inquerito: (1, 111, 13), (2, 121, 12), (3, 131, 13), (4, 444, 11), (5, 555, 13)

  • EnvolvidoInquerito: (10, 1), (20, 1), (20, 4), (30, 1), (30, 3), (30, 5)

A consulta faz a junção de Envolvido com EnvolvidoInquerito, depois com Inquerito e, por fim, com TipoInquerito. O resultado intermediário da junção (antes do GROUP BY) é uma lista de pares (Envolvido, Inquerito) com o tipo correspondente. Vamos listar as combinações:

  • Envolvido 10 está no inquérito 1 (tipo 13 - Notícia-Crime)

  • Envolvido 20 está no inquérito 1 (tipo 13 - Notícia-Crime)

  • Envolvido 20 está no inquérito 4 (tipo 11 - Inquérito Policial)

  • Envolvido 30 está no inquérito 1 (tipo 13 - Notícia-Crime)

  • Envolvido 30 está no inquérito 3 (tipo 13 - Notícia-Crime)

  • Envolvido 30 está no inquérito 5 (tipo 13 - Notícia-Crime)

Agora, contando por tipo:

  • Inquérito Policial (tipo 11): aparece apenas no inquérito 4, que tem o envolvido 20. Portanto, a contagem é 1.

  • Inquérito Civil (tipo 12): aparece apenas no inquérito 2, mas o envolvido 20 não está associado a ele (não há registro em EnvolvidoInquerito para o inquérito 2). Portanto, a contagem é 0.

  • Notícia-Crime (tipo 13): aparece nos inquéritos 1, 3 e 5. As associações são: inquérito 1 (envolvidos 10, 20, 30), inquérito 3 (envolvido 30), inquérito 5 (envolvido 30). Total de associações: 3 + 1 + 1 = 5. Portanto, a contagem é 5.

O resultado correto da consulta seria:

TipoInquerito

quantidade

Inquérito Policial

1

Inquérito Civil

0

Notícia-Crime

5

O resultado apresentado no enunciado (Inquérito Policial: 1, Inquérito Civil: 1, Notícia-Crime: 3) está incorreto. A contagem de Inquérito Civil deveria ser 0, pois não há nenhum envolvido associado a um inquérito desse tipo. A contagem de Notícia-Crime deveria ser 5, pois há cinco associações de envolvidos com inquéritos desse tipo. Portanto, o item está Errado.

A pegadinha desta questão está em não considerar que o INNER JOIN elimina os inquéritos que não possuem envolvidos associados. O inquérito 2 (Inquérito Civil) não tem nenhum envolvido, então ele não aparece no resultado. Além disso, é preciso contar corretamente as associações, não o número de inquéritos distintos. O candidato pode contar apenas os inquéritos distintos (1, 3, 5 para Notícia-Crime) e esquecer que cada envolvido gera uma linha no resultado, aumentando a contagem.

1Conta associações (linhas)
Não conta inquéritos distintos
Cada envolvido gera linha
2Descarta sem correspondência
Inquérito sem envolvido some
Ex.: Inquérito Civil (id 2)
3Resultado correto
Policial: 1
Civil: 0
Notícia-Crime: 5
INNER JOIN + COUNT
LEVELsoulevel.com.br
INNER JOIN + COUNT: Conta associações (linhas) (Não conta inquéritos distintos, Cada envolvido gera linha); Descarta sem correspondência (Inquérito sem envolvido some, Ex.: Inquérito Civil (id 2)); Resultado correto (Policial: 1, Civil: 0, Notícia-Crime: 5)
NÃO CAIA NESSA!

A banca explora a diferença entre contar inquéritos distintos e contar associações (linhas da junção). No INNER JOIN, cada par (envolvido, inquérito) gera uma linha, e o COUNT conta todas elas. Além disso, o INNER JOIN descarta inquéritos sem envolvidos, como o Inquérito Civil (id 2), que não aparece no resultado. O candidato pode contar apenas os inquéritos distintos e errar a contagem.

PEGA ESSA DICA!

Para resolver questões de SQL com junções e agrupamento, execute a consulta mentalmente em etapas: 1) identifique as tabelas envolvidas e as chaves de junção; 2) liste todas as combinações resultantes da junção; 3) aplique o GROUP BY e conte as linhas de cada grupo. Lembre-se de que o INNER JOIN só retorna linhas com correspondência em todas as tabelas, e o COUNT conta todas as linhas do grupo, não valores distintos.

Gabarito: Errado

Link permanente: /questoes/ce417324