Consulta SQL com JOINs e filtros
Gabarito: letra E. A alternativa E utiliza INNER JOIN para garantir a existência de autor e categoria correspondentes, filtra corretamente l.disponivel = TRUE (campo booleano) e c.nome = 'Ficção Científica' (igualdade exata), e renomeia as colunas com AS para exibir três colunas distintas: título, autor e categoria.
A questão testa o domínio de sintaxe SQL, especialmente:
Tipos de JOIN (INNER vs LEFT) e seu efeito na obrigatoriedade de registros relacionados.
Comparação de campos booleanos (TRUE/FALSE) vs string ('S').
Uso de LIKE para correspondência parcial vs igualdade exata.
Renomeação de colunas com alias (AS) para evitar colunas com nomes duplicados.
Alternativa | JOIN utilizado | Filtro booleano | Filtro categoria | Renomeação de colunas | Correto? |
|---|
A | INNER JOIN | disponivel = TRUE
| c.nome = 'Ficção Científica'
| Não (colunas nome ambíguas) | ❌ |
B | LEFT JOIN | disponivel = TRUE
| c.nome = 'Ficção Científica'
| Sim (l.titulo, a.nome, c.nome) | ❌ |
C | Implícito (vírgulas) | disponivel = TRUE
| c.nome LIKE '%Ficção Científica%'
| Sim (l.titulo, a.nome, c.nome) | ❌ |
D | INNER JOIN | disponivel = 'S'
| c.nome = 'Ficção Científica'
| Não (colunas nome duplicadas) | ❌ |
E | INNER JOIN | disponivel = TRUE
| c.nome = 'Ficção Científica'
| Sim (AS autor, AS categoria) | ✅ |
Alternativa A — ❌ Incorreta
Seleciona titulo, nome, nome sem especificar a tabela de origem para a coluna nome, gerando ambiguidade (duas colunas chamadas nome). Além disso, falta alias nas colunas, resultando em nomes de coluna não descritivos. O JOIN está correto (INNER), mas a projeção está errada.
Alternativa B — ❌ Incorreta
Usa LEFT JOIN em ambas as junções, o que permite que livros sem autor ou categoria correspondente sejam incluídos (com NULL). O enunciado exige que existam registros correspondentes nas duas tabelas, o que exige INNER JOIN (ou equivalente). Além disso, a condição c.nome = 'Ficção Científica' no WHERE anula o LEFT JOIN para categorias (transforma em INNER), mas para autores ainda pode haver NULL, violando a exigência.
Alternativa C — ❌ Incorreta
A sintaxe implícita (FROM com vírgulas) funciona, mas a condição c.nome LIKE '%Ficção Científica%' permite correspondência parcial, enquanto o enunciado pede o nome exato "Ficção Científica". LIKE sem % garante igualdade, mas com % nas extremidades aceita nomes como "Ficção Científica e Fantasia", o que não é o solicitado. Deveria usar =.
Alternativa D — ❌ Incorreta
A condição l.disponivel = 'S' compara um campo booleano (TRUE/FALSE) com uma string 'S'. A forma correta é l.disponivel = TRUE. Além disso, não renomeia as colunas, então o resultado teria duas colunas chamadas "nome" (a.nome e c.nome), não atendendo à exigência de três colunas com nomes distintos.
Alternativa E — ✅ Correta ⟵ GABARITO
INNER JOIN garante que só livros com autor e categoria existentes sejam retornados.
l.disponivel = TRUE compara corretamente o campo booleano.
c.nome = 'Ficção Científica' faz correspondência exata.
l.titulo, a.nome AS autor, c.nome AS categoria projeta três colunas com nomes claros e distintos.
Sintaxe correta com AS e aliases.
Gabarito: letra E