Professor EBTT - Informática: Programação Básica e Programação Web
Dadas as tabelas Autores (id_autor, nome_autor) e Livros (id_livro, titulo, id_autor), qual consulta SQL retorna o titulo de todos os livros e o nome_autor correspondente, incluindo livros que não possuem um autor associado na tabela Autores (ou seja, id_autor nulo em Livros)?
ASELECT L.titulo, A.nome_autor FROM Livros L INNER JOIN Autores A ON L.id_autor = A.id_autor;
BSELECT L.titulo, A.nome_autor FROM Livros L RIGHT JOIN Autores A ON L.id_autor = A.id_autor;
CSELECT L.titulo, A.nome_autor FROM Livros L LEFT JOIN Autores A ON L.id_autor = A.id_autor;
DSELECT L.titulo, A.nome_autor FROM Livros L FULL OUTER JOIN Autores A ON L.id_autor = A.id_autor;
ESELECT L.titulo, A.nome_autor FROM Livros L, Autores A WHERE L.id_autor = A.id_autor ORL.id_autor ISNULL;
Revelar gabarito e comentário▾
GabaritoC — SELECT L.titulo, A.nome_autor FROM Livros L LEFT JOIN Autores A ON L.id_autor = A.id_autor;
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”.
Cláusula JOIN – LEFT JOIN
Gabarito: letra C. O LEFT JOIN retorna todos os registros da tabela da esquerda (Livros) e, quando há correspondência, os dados da tabela da direita (Autores). Caso não haja autor associado (id_autor nulo), os campos da tabela Autores vêm como NULL – exatamente o que o enunciado pede: todos os títulos com o nome do autor, inclusive livros sem autor.
A questão testa o conhecimento dos tipos de JOIN e o tratamento de valores nulos. Vamos analisar cada alternativa:
JOINs em SQL: LEFT JOIN (tabela da esquerda) (Todos os registros da esquerda, Correspondência da direita (ou NULL), Caso: livros com ou sem autor); INNER JOIN (Só registros com correspondência, Caso: livros com autor apenas); RIGHT JOIN (tabela da direita) (Todos os registros da direita, Não garante todos da esquerda); FULL OUTER JOIN (Todos de ambas as tabelas, Inclui autores sem livros); Produto cartesiano (vírgula + WHERE) (OR com NULL gera repetição)
Alternativa A – ❌ Incorreta
INNER JOIN retorna apenas as linhas com correspondência em ambas as tabelas. Livros com id_autor nulo são excluídos do resultado, pois não há correspondência na tabela Autores.
Alternativa B – ❌ Incorreta
RIGHT JOIN retorna todos os registros da tabela da direita (Autores) e os correspondentes da esquerda. Isso traria todos os autores, inclusive aqueles sem livros, mas não garante que todos os livros apareçam – especialmente os sem autor, pois a tabela da esquerda (Livros) é a que tem o dado que queremos preservar.
Alternativa C – ✅ Correta ⟵ GABARITO
LEFT JOIN é a escolha certa. A tabela da esquerda é Livros L. O comando lista todos os títulos e, quando existe autor, o nome; quando L.id_autor é nulo, o campo A.nome_autor vem como NULL, atendendo ao requisito de incluir livros sem autor.
Alternativa D – ❌ Incorreta
FULL OUTER JOIN retorna todos os registros de ambas as tabelas. Além dos livros, traria também autores sem livros (com título NULL), o que foge do solicitado. O enunciado pede todos os livros, não todos os autores.
Alternativa E – ❌ Incorreta
A sintaxe com vírgula (produto cartesiano) e a condição WHERE L.id_autor = A.id_autor OR L.id_autor IS NULLparece funcionar, mas produz um resultado errado. Para cada livro com id_autor nulo, a condição L.id_autor IS NULL é verdadeira para todas as linhas da tabela Autores, gerando um produto cartesiano: o título do livro repete-se para cada autor cadastrado. Não é o que se deseja.
NÃO CAIA NESSA!
A alternativa E é tentadora porque parece uma solução lógica, mas o OR L.id_autor IS NULL faz com que, para livros sem autor, a condição seja verdadeira para todo autor, resultando em múltiplas linhas indesejadas. O LEFT JOIN é a forma correta e mais limpa de resolver.