Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
Banco de Dados›Consultas 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
Acadastrados na tabela “editora”.
Bligados a editoras sem ramal cadastrado.
Clocalizados ao lado esquerdo das editoras.
Dnão vinculados a uma editora.
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.