Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024

Banco de DadosConsultas 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:

  1. A0.
  2. B1.
  3. C2.
  4. D3.
  5. 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.

edicao%20edicao \% 2 \neq 0

De onde vem cada valor: edicaoedicao = passo 2: valores de edição · 22 = constante do operador módulo

2%2=0,2%2=0,1%2=1,1%2=1,1%2=1=livros5,3e4(3linhas)2\%2=0, 2\%2=0, 1\%2=1, 1\%2=1, 1\%2=1 = \boxed{\text{livros} 5, 3 \text{e} 4 (3 \text{linhas})}
NÃO CAIA NESSA!

Inverter a condição e selecionar edições pares, ou usar divisão inteira em vez de módulo.

Resposta: 3 linhas — alternativa D

Link permanente: /questoes/fg165231