Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
Banco de Dados›Consultas e Comandos em SQL
Código
fg165231
Banca
FGV
Órgão
ALETO
Ano
2024
Cargo
Ana Leg ( )
Considere o seguinte esquema de um banco de dados relacional, expresso em linguagem SQL:
create table editora
(
cod_editora integerprimary key,
nome_editora varchar(30) not null,
telefone char(11)
);
create table livro
(
cod_livro integerprimary key,
num_isbn char(10) unique not null,
titulo varchar(20) not null,
edicao integerdefault 1 not null,
cod_editora integerreferences editora
);
Após criadas, os comandos de inserção a seguir foram executados:
insert into editora values (1,'Ed1','2222-3333'), (2,'Ed2',NULL);
insert into livro values (1,'111','Livro1',2,NULL), (2,'222','Livro2',2,1), (5,'555','Livro5',1,1);
insert into livro(cod_livro,num_isbn,titulo,cod_editora) values (3,'333','Livro3',2),
(4,'444','Livro4',2);
A consulta select * from livro where exists (select distinct * from editora) and edicao%2 <> 0 produz como resultado a seguinte quantidade de linhas:
A0.
B1.
C2.
D3.
E4.
Revelar gabarito e comentário▾
GabaritoD — 3.
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”.
Resolução
Gabarito: letra D — a conta chega a 3 linhas — alternativa D.
A ideia por trás
Em SQL, a cláusula WHERE filtra as linhas de uma tabela de acordo com condições. O operador EXISTS é usado com uma subconsulta: ele retorna verdadeiro se a subconsulta retornar pelo menos uma linha, e falso caso contrário. O operador % (módulo) calcula o resto da divisão inteira: por exemplo, 5 % 2 = 1, pois 5 dividido por 2 dá 2 com resto 1.
A condição WHERE pode combinar várias condições com AND, que exige que todas sejam verdadeiras para a linha ser incluída. Quando a subconsulta do EXISTS não referencia colunas da consulta externa (não é correlacionada), ela é avaliada uma única vez e o resultado é constante para todas as linhas. O operador % é útil para testar paridade: edicao % 2 = 0 indica par, e edicao % 2 <> 0 indica ímpar.
Esta questão testa dois pontos: entender que o EXISTS com subconsulta não correlacionada é sempre verdadeiro (pois a tabela editora tem linhas), e aplicar o filtro de edição ímpar. Além disso, é preciso lembrar que o INSERT com lista de colunas aplica o valor DEFAULT para colunas omitidas.
O que a questão dá
tabela editora: 2 linhas (Ed1 e Ed2)
tabela livro: 5 linhas (códigos 1, 2, 5, 3, 4)
coluna edicao: livro 1 = 2, livro 2 = 2, livro 5 = 1, livro 3 = 1, livro 4 = 1
condição: exists (select distinct * from editora) and edicao%2 <> 0
O que queremos: quantas linhas a consulta retorna
Passo 1 — Avaliar a condição EXISTS
A primeira condição do WHERE é um EXISTS com uma subconsulta que não depende da linha atual da tabela livro. Como a tabela editora tem 2 linhas, a subconsulta retorna linhas, então EXISTS é verdadeiro para todas as linhas de livro. Isso significa que essa condição não elimina nenhuma linha.
Por que esta fórmula: Não há fórmula; é a semântica do EXISTS: verdadeiro se a subconsulta retornar pelo menos uma linha.
verdadeiro para todas as linhas
NÃO CAIA NESSA!
Pensar que o EXISTS depende da linha atual, mas como a subconsulta não referencia colunas de livro, ela é constante.
Passo 2 — Listar as edições de cada livro
Precisamos saber o valor da coluna edicao para cada livro para aplicar o filtro de ímpar. O terceiro INSERT não informa edicao, então o valor padrão 1 é usado.
Por que esta fórmula: Não há fórmula; é leitura dos dados inseridos.
livro 1: 2, livro 2: 2, livro 5: 1, livro 3: 1, livro 4: 1
NÃO CAIA NESSA!
Esquecer que o INSERT com colunas explícitas aplica o DEFAULT para colunas omitidas, achando que livro 3 e 4 têm edição 2.
Passo 3 — Filtrar as edições ímpares
A segunda condição é edicao % 2 <> 0, que seleciona apenas edições ímpares. Vamos aplicar a cada livro.
Por que esta fórmula: O operador % dá o resto da divisão; se o resto for diferente de zero, o número é ímpar.
De onde vem cada valor: = passo 2: valores de edição · = constante do operador módulo
NÃO CAIA NESSA!
Inverter a condição e selecionar edições pares, ou usar divisão inteira em vez de módulo.