Questão de Banco de Dados — Consultas e Comandos em SQL — INSTITUTO AOCP 2024
Banco de Dados›Consultas e Comandos em SQL
Código
qa630633
Banca
INSTITUTO AOCP
Órgão
MGI
Ano
2024
Cargo
Esp ( )
A partir do comando a seguir, analise as assertivas e assinale a alternativa que aponta a(s) correta(s).
CREATE TABLE Lista_Primaria (
a INT
);
CREATE TABLE Lista_Secundaria (
c INT
);
INSERT INTO Lista_Primaria (a) VALUES (1), (2), (3), (4);
INSERT INTO Lista_Secundaria (c) VALUES (2), (4), (5), (4);
SELECT Lista_Primaria.a
FROM Lista_Primaria
WHERE NOT EXISTS
(SELECT * FROM Lista_Secundaria WHERE Lista_Secundaria.c = Lista_Primaria.a+1);
I. O comando apresenta erro de SINTAXE na entrada de dados. Não se deve utilizar INSERT INTO.
II. A consulta verifica se existe algum valor na tabela Lista_Secundaria que seja igual a a+1, em que a é o valor da coluna “a” na tabela Lista_Primaria. O resultado dessa consulta será sempre a+1.
III. O resultado final da consulta realizada pelo comando será “EXISTS”.
IV. A consulta retornará NULL.
V. A consulta retornará o valor 2.
AApenas I e IV.
BApenas I.
CApenas II e III.
DApenas V.
EApenas IV.
Revelar gabarito e comentário▾
GabaritoD — Apenas V.
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”.
Subconsultas correlacionadas e o operador NOT EXISTS em SQL
Gabarito: letra D. A única assertiva correta é a V: a consulta retorna o valor 2. O comando usa uma subconsulta correlacionada com NOT EXISTS, que seleciona os valores de a da tabela Lista_Primaria para os quais não existe nenhum valor c em Lista_Secundaria igual a a + 1. Percorrendo os dados: para a = 1, existe c = 2; para a = 2, existe c = 3? Não — logo 2 é retornado; para a = 3, existe c = 4; para a = 4, existe c = 5. Portanto, apenas o valor 2 satisfaz a condição.
A questão mistura dois temas que costumam confundir: a sintaxe de inserção de dados e a semântica de consultas com subconsultas correlacionadas. Vamos separar cada um.
1. O comando INSERT está correto? Sim. A sintaxe INSERT INTO tabela (coluna) VALUES (v1), (v2), ... é válida no SQL padrão e permite inserir múltiplas linhas em uma única instrução. A assertiva I afirma que há erro de sintaxe e que "não se deve utilizar INSERT INTO" — isso é falso. O comando INSERT INTO é exatamente o comando correto para inserir dados em uma tabela (é um comando da DML — Data Manipulation Language). O CREATE TABLE (DDL) cria a estrutura; o INSERT popula a estrutura com dados. Não há nenhum erro de sintaxe nos comandos apresentados.
2. O que faz a consulta com NOT EXISTS? A consulta é:
SELECT Lista_Primaria.a
FROM Lista_Primaria
WHERE NOT EXISTS
(SELECT * FROM Lista_Secundaria WHERE Lista_Secundaria.c = Lista_Primaria.a+1);
Esta é uma subconsulta correlacionada: a subconsulta interna referencia a tabela externa (Lista_Primaria.a). Para cada linha da tabela externa, a subconsulta é avaliada. O operador EXISTS retorna verdadeiro se a subconsulta retornar pelo menos uma linha; NOT EXISTS retorna verdadeiro se a subconsulta não retornar nenhuma linha. Portanto, a consulta externa retorna os valores de a para os quais não existe nenhum c em Lista_Secundaria que seja igual a a + 1.
Vamos simular a execução passo a passo:
Valor de a (Lista_Primaria)
a + 1
Existe c = a+1 em Lista_Secundaria?
NOT EXISTS é verdadeiro?
Linha retornada?
1
2
Sim (c = 2)
Não
Não
2
3
Não (não há c = 3)
Sim
Sim (retorna 2)
3
4
Sim (c = 4)
Não
Não
4
5
Sim (c = 5)
Não
Não
O resultado final é uma única linha com o valor 2.
3. Por que as outras assertivas estão erradas? A assertiva II diz que "o resultado dessa consulta será sempre a+1" — isso é um erro de interpretação: a consulta não retorna a+1, ela retorna o valor de a (a coluna da tabela externa) quando a condição NOT EXISTS é satisfeita. A assertiva III afirma que o resultado será "EXISTS" — o EXISTS é um operador lógico usado na condição, não um valor retornado pela consulta. A assertiva IV diz que a consulta retornará NULL — não há nenhum valor NULL envolvido; a consulta retorna o valor inteiro 2.
A pegadinha central desta questão é a inversão de papéis: o candidato pode confundir o que a subconsulta verifica (se existe c = a+1) com o que a consulta externa retorna (o valor de a). Além disso, a assertiva I tenta induzir o erro de achar que INSERT INTO é inválido, quando na verdade é o comando padrão para inserção.
NÃO CAIA NESSA!
A banca explora duas confusões clássicas. Primeiro, na assertiva I, tenta fazer você acreditar que INSERT INTO é um erro de sintaxe — mas é exatamente o comando correto para inserir dados (DML). Segundo, nas assertivas II, III e IV, inverte o papel da subconsulta: o NOT EXISTS não retorna "EXISTS" nem "NULL" nem "a+1" — ele apenas filtra as linhas da tabela externa. O resultado é o valor de a que não tem correspondência c = a+1. Com treino, você enxerga essas trocas de longe 💪.
1Para cada a
2Existe c = a+1?
3NOT EXISTS filtra
4Retorna a
LEVEL · soulevel.com.br
Item I — ❌ Incorreto
A assertiva afirma que o comando apresenta erro de sintaxe e que não se deve utilizar INSERT INTO. Isso é falso. A sintaxe INSERT INTO tabela (coluna) VALUES (v1), (v2), ... é perfeitamente válida no SQL padrão e é o comando correto para inserir dados em uma tabela. O INSERT INTO é um comando da DML (Data Manipulation Language), responsável por manipular os dados dentro das tabelas, enquanto o CREATE TABLE é da DDL (Data Definition Language), responsável por criar a estrutura. Não há erro algum nos comandos de inserção apresentados.
Item II — ❌ Incorreto
A assertiva diz que "a consulta verifica se existe algum valor na tabela Lista_Secundaria que seja igual a a+1, em que a é o valor da coluna 'a' na tabela Lista_Primaria. O resultado dessa consulta será sempre a+1." A primeira parte está correta: a subconsulta verifica exatamente isso. Porém, a conclusão está errada: o resultado da consulta não é a+1. A consulta externa retorna o valor da coluna a (não a+1) para as linhas onde a condição NOT EXISTS é verdadeira. No caso, retorna apenas o valor 2.
Item III — ❌ Incorreto
A assertiva afirma que "o resultado final da consulta realizada pelo comando será 'EXISTS'". Isso é um equívoco conceitual. EXISTS é um operador lógico usado na cláusula WHERE para testar a existência de linhas na subconsulta. Ele não é um valor retornado pela consulta. O resultado da consulta é um conjunto de linhas (no caso, uma linha com o valor 2), não a string "EXISTS".
Item IV — ❌ Incorreto
A assertiva afirma que "a consulta retornará NULL". Não há nenhum valor NULL envolvido na consulta. A tabela Lista_Primaria contém os valores 1, 2, 3 e 4, e a tabela Lista_Secundaria contém 2, 4, 5 e 4. A consulta retorna o valor inteiro 2, não NULL. NULL seria retornado apenas se houvesse valores nulos nas colunas ou se a consulta fosse projetada para retornar NULL, o que não é o caso.
Item V — ✅ Correto ⟵ GABARITO
A assertiva afirma que "a consulta retornará o valor 2". Isso está correto. Conforme a simulação:
Para a = 1, a+1 = 2, e existe c = 2 em Lista_Secundaria, então NOT EXISTS é falso e a linha não é retornada.
Para a = 2, a+1 = 3, e não existe c = 3 em Lista_Secundaria, então NOT EXISTS é verdadeiro e a linha é retornada.
Para a = 3, a+1 = 4, e existe c = 4, então não é retornada.
Para a = 4, a+1 = 5, e existe c = 5, então não é retornada.
Portanto, o único valor retornado é 2.
Conclusão: Apenas a assertiva V está correta. Como a banca pediu a alternativa que aponta a(s) correta(s), o gabarito é a letra D.