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
ce417327
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 que se segue.

 

SELECT DISTINCT COUNT(E.Alcunha) as
Quantidade
FROM Envolvido AS E
INNER JOIN EnvolvidoInquerito AS EI ON
E.idEnvolvido = EI.idEnvolvido
WHERE ALCUNHA LIKE '%E%';

 

Ao ser executado, esse comando apresentará o resultado a seguir.

 

Quantidade
1

  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 – Consulta com DISTINCT, COUNT e LIKE

Gabarito: Errado. O comando SELECT DISTINCT COUNT(E.Alcunha) não retorna o valor 1, pois a função COUNT é uma função de agregação que conta todas as linhas resultantes da junção, e o DISTINCT aplicado sobre o resultado da agregação não elimina duplicatas das linhas originais — ele apenas garante que o valor agregado (o número 3) apareça uma única vez. O resultado correto seria 3, não 1.

A questão envolve a compreensão de como a cláusula DISTINCT interage com funções de agregação como COUNT. Vamos analisar o comando passo a passo.

Primeiro, a consulta faz um INNER JOIN entre as tabelas Envolvido e EnvolvidoInquerito, relacionando cada envolvido aos inquéritos em que participa. A condição WHERE ALCUNHA LIKE '%E%' filtra os envolvidos cuja alcunha contém a letra "E" (maiúscula ou minúscula, dependendo do SGBD).

Vamos identificar os envolvidos que atendem ao filtro:

  • Gargamel (id 10): contém a letra "e"? Sim, "Gargamel" tem "e" no final. → Participa do inquérito 1.

  • Vingador (id 20): contém "e"? Não, "Vingador" não tem a letra "e". → Não atende ao filtro.

  • Esqueleto (id 30): contém "e"? Sim, "Esqueleto" tem "e" em várias posições. → Participa dos inquéritos 1, 3 e 5.

Portanto, os envolvidos que passam no filtro são Gargamel (1 registro em EnvolvidoInquerito) e Esqueleto (3 registros em EnvolvidoInquerito). A junção produzirá 4 linhas (1 + 3).

A função COUNT(E.Alcunha) conta quantas linhas têm valor não nulo na coluna Alcunha. Como todas as 4 linhas têm alcunha não nula, o COUNT retorna 4. O DISTINCT aplicado sobre o resultado da agregação não altera o valor, pois o COUNT já retorna um único valor (4). Portanto, o resultado da consulta é 4, não 1.

A pegadinha da banca está em confundir o DISTINCT com a eliminação de duplicatas das linhas originais. O DISTINCT aplicado sobre uma função de agregação não tem efeito sobre as linhas individuais — ele apenas garante que o valor agregado apareça uma única vez no resultado. Como o COUNT já retorna um único valor, o DISTINCT é redundante.

  1. 1INNER JOIN Envolvido × EnvolvidoInquerito
  2. 2Filtro LIKE '%E%' (Gargamel, Esqueleto)
  3. 34 linhas resultantes (1 + 3)
  4. 4COUNT(Alcunha) = 4
  5. 5DISTINCT é redundante na agregação
LEVEL · soulevel.com.br

Alternativa E — ✅ Correta (gabarito)

A alternativa E afirma que o comando está Errado, e isso está correto. O resultado da consulta não é 1, mas sim 4. O COUNT(E.Alcunha) conta todas as linhas resultantes da junção que atendem ao filtro LIKE '%E%', que são 4 linhas (Gargamel no inquérito 1, Esqueleto nos inquéritos 1, 3 e 5). O DISTINCT não altera o resultado, pois o COUNT já retorna um único valor. Portanto, o item está Errado.

Alternativa C — ❌ Incorreta

A alternativa C afirma que o comando está Certo, o que é falso. O resultado apresentado (Quantidade = 1) está incorreto. O valor correto é 4, pois o COUNT conta todas as linhas da junção que atendem ao filtro, e o DISTINCT não elimina duplicatas das linhas originais. A banca tenta induzir o candidato a pensar que o DISTINCT eliminaria as linhas duplicadas da junção, mas isso não ocorre com funções de agregação.

NÃO CAIA NESSA!

A banca explora a confusão entre DISTINCT aplicado a colunas e DISTINCT aplicado a funções de agregação. O candidato pode pensar que o DISTINCT eliminaria as linhas duplicadas da junção, mas o COUNT já agrega todas as linhas, e o DISTINCT sobre o resultado da agregação é redundante. O resultado correto é 4, não 1.

PEGA ESSA DICA!

Para resolver questões com DISTINCT e COUNT, lembre-se: o DISTINCT aplicado a uma função de agregação não elimina duplicatas das linhas originais — ele apenas garante que o valor agregado apareça uma única vez. O COUNT conta todas as linhas que atendem à condição, independentemente de duplicatas. Sempre calcule o número de linhas resultantes da junção antes de aplicar a agregação.

Gabarito: letra E

Link permanente: /questoes/ce417327