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
fg165232
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

);

 

A consulta

select titulo

from livro left join editora

on livro.cod_editora = editora.cod_editora

where editora.nome_editora is null

 

apresenta os títulos dos livros

  1. Acadastrados na tabela “editora”.
  2. Bligados a editoras sem ramal cadastrado.
  3. Clocalizados ao lado esquerdo das editoras.
  4. Dnão vinculados a uma editora.
  5. Erelacionados a editoras sem nome cadastrado (null).
Revelar gabarito e comentário

GabaritoD — não vinculados a uma editora.

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”.

Junções SQL: LEFT JOIN e a identificação de registros sem correspondência

Gabarito: letra D. A consulta select titulo from livro left join editora on livro.cod_editora = editora.cod_editora where editora.nome_editora is null retorna os títulos dos livros não vinculados a uma editora. O LEFT JOIN preserva todas as linhas da tabela à esquerda (livro), e, para os livros sem editora correspondente, as colunas da tabela à direita (editora) ficam com valor NULL; o filtro WHERE editora.nome_editora is null seleciona exatamente essas linhas.

O LEFT JOIN (ou LEFT OUTER JOIN) é uma das junções externas do SQL. Ele devolve todas as linhas da tabela à esquerda (a primeira citada no FROM), combinando-as com as linhas correspondentes da tabela à direita quando a condição do ON é satisfeita. Quando não há correspondência, as colunas da tabela da direita são preenchidas com NULL. Essa é a essência da junção externa: ela preserva as linhas sem par, ao contrário do INNER JOIN, que descarta qualquer linha que não encontre correspondência na outra tabela.

No esquema dado, a tabela livro tem uma chave estrangeira cod_editora que referencia a tabela editora. A restrição references editora garante a integridade referencial, mas não obriga que todo livro tenha uma editora — a coluna cod_editora pode ser NULL (a menos que haja NOT NULL, o que não é o caso). Portanto, é perfeitamente possível existirem livros sem editora associada.

A consulta funciona assim: o LEFT JOIN combina cada livro com sua editora. Para livros que possuem cod_editora válido, as colunas de editora (incluindo nome_editora) são preenchidas. Para livros cujo cod_editora é NULL (ou aponta para uma editora inexistente, o que a integridade referencial normalmente impede), as colunas de editora ficam NULL. O WHERE editora.nome_editora is null filtra justamente esses livros, retornando seus títulos.

A pegadinha da questão está em entender o que o NULL representa. NULL não é um valor, é a ausência de valor. A condição is null verifica exatamente essa ausência. A alternativa E tenta confundir ao dizer "editoras sem nome cadastrado (null)" — mas o filtro não procura editoras que existem mas têm nome nulo; ele procura livros cuja junção com a editora resultou em NULL, ou seja, livros sem editora vinculada. A alternativa B também erra ao mencionar "ramal", que nem existe no esquema. A alternativa A inverte a lógica: a consulta retorna livros que não estão cadastrados na tabela editora. A alternativa C é uma interpretação literal e incorreta de "left" como posição física.

Guarde a distinção central: LEFT JOIN + WHERE coluna_da_direita IS NULL é o padrão clássico para encontrar registros da tabela esquerda que não têm correspondência na tabela direita. É exatamente esse padrão que a alternativa D descreve.

Alternativa A — ❌ Incorreta

Afirma que a consulta retorna livros "cadastrados na tabela editora". Isso seria o resultado de um INNER JOIN (ou LEFT JOIN sem o filtro WHERE), que retornaria apenas os livros com editora correspondente. Aqui, o filtro WHERE editora.nome_editora is null faz exatamente o oposto: seleciona os livros sem editora correspondente.

Alternativa B — ❌ Incorreta

Menciona "editoras sem ramal cadastrado". O esquema da tabela editora tem as colunas cod_editora, nome_editora e telefone — não existe coluna "ramal". Além disso, a consulta não filtra por telefone ou ramal; ela filtra por nome_editora is null, que só ocorre quando a junção não encontra editora.

Alternativa C — ❌ Incorreta

Interpreta "left" literalmente como "lado esquerdo" físico. LEFT em LEFT JOIN refere-se à tabela à esquerda na sintaxe (a tabela livro, no caso), não a uma posição geográfica. A consulta não tem nada a ver com localização.

Alternativa D — ✅ Correta ⟵ GABARITO

Esta é a descrição exata do que a consulta faz. O LEFT JOIN preserva todos os livros; para os que não têm editora, as colunas de editora ficam NULL; o WHERE editora.nome_editora is null seleciona esses livros. Portanto, retorna os títulos dos livros não vinculados a uma editora.

Alternativa E — ❌ Incorreta

Diz "relacionados a editoras sem nome cadastrado (null)". Isso sugeriria que existe uma editora na tabela editora cujo nome_editora é NULL. Mas a coluna nome_editora é definida como not null, então isso é impossível. O NULL no resultado vem da ausência de correspondência na junção, não de um nome nulo em uma editora existente.

NÃO CAIA NESSA!

A banca explora a confusão entre "livro sem editora" e "editora sem nome". No LEFT JOIN, o NULL aparece nas colunas da tabela da direita quando não há correspondência — não porque existe um registro com valor nulo. A alternativa E tenta fazer você acreditar que há editoras com nome nulo, mas a restrição not null impede isso. Lembre-se: LEFT JOIN + IS NULL = registros sem par na tabela da direita.

PEGA ESSA DICA!

Para identificar o padrão, pergunte-se: "quem é a tabela à esquerda?" (a do FROM). O LEFT JOIN preserva todas as linhas dela. Se o WHERE filtra por coluna_da_direita IS NULL, você está buscando as linhas da esquerda que não têm correspondência na direita. Esse é o jeito canônico de encontrar "órfãos" em um banco relacional.

Gabarito: letra D

Link permanente: /questoes/fg165232