Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2025

Banco de DadosConsultas e Comandos em SQL
Código
ce417320
Banca
CESPE / CEBRASPE
Órgão
BANRISUL
Ano
2025
Cargo
Tec TI ( )

Em um sistema de biblioteca, existem três tabelas com as seguintes colunas.

 

• livros: com um identificador único (id) para cada livro, o título do livro, um campo autor_id, que indica o autor que cadastrou o livro, um campo categoria_id, que i ndica a que categoria o livro pertence, e um campo booleano disponível para indicar se o livro está disponível para empréstimo (TRUE) ou não (FALSE).


• autores: com um identificador único (id) para cada autor, e o nome do autor.


• categorias: com um identificador único (id) para cada categoria, e o nome da categoria.

 

Há uma relação implícita entre livros.autor_id e autores.id e entre livros.categoria_id e categorias.id, de modo que, para um livro válido, deve existir um autor correspondente e uma categoria correspondente.

 

A partir das informações precedentes, assinale a opção em que é corretamente apresentada a consulta SQL que permite a obtenção apenas dos livros cujo campo disponivel seja TRUE, desde que já existam registros correspondentes em autores e categorias, e, além disso, filtre somente os livros cuja categoria tenha o nome Ficção Científica, e apresente como resultado exatamente três colunas: título do livro, nome do autor e nome da categoria.

  1. ASELECT titulo, nome, nome      FROM livros l      INNER JOIN autores a ON l.autor_id = a.id      INNER JOIN categorias c ON l.categoria_id =      c.id      WHERE disponivel = TRUE         AND c.nome = 'Ficção Científica';
  2. BSELECT l.titulo, a.nome, c.nome      FROM livros l      LEFT JOIN autores a         ON l.autor_id = a.id      LEFT JOIN categorias c           ON l.categoria_id = c.id      WHERE l.disponivel = TRUE            AND c.nome = 'Ficção Científica';
  3. CSELECT l.titulo, a.nome, c.nome     FROM livros l, autores a, categorias c     WHERE l.autor_id = a.id          AND l.categoria_id = c.id          AND l.disponivel = TRUE          AND c.nome LIKE '%Ficção Científica%';
  4. DSELECT l.titulo, a.nome, c.nome      FROM livros AS l      INNER JOIN autores AS a        ON l.autor_id = a.id      INNER JOIN categorias AS c          ON l.categoria_id = c.id       WHERE l.disponivel = 'S'            AND c.nome = 'Ficção Científica';
  5. ESELECT l.titulo, a.nome AS autor, c.nome AS categoria     FROM livros AS l      INNER JOIN autores AS a         ON l.autor_id = a.id     INNER JOIN categorias AS c        ON l.categoria_id = c.id     WHERE l.disponivel = TRUE           AND c.nome = 'Ficção Científica';
Revelar gabarito e comentário

GabaritoE — SELECT l.titulo, a.nome AS autor, c.nome AS categoria     FROM livros AS l      INNER JOIN autores AS a         ON l.autor_id = a.id     INNER JOIN categorias AS c        ON l.categoria_id = c.id     WHERE l.disponivel = TRUE           AND c.nome = 'Ficção Científica';

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

SQL – Consulta com JOIN e Filtros

Gabarito: letra E. A consulta correta usa INNER JOIN entre as três tabelas, filtra l.disponivel = TRUE e c.nome = 'Ficção Científica', e projeta exatamente três colunas com apelidos (l.titulo, a.nome AS autor, c.nome AS categoria). As demais alternativas falham por usar LEFT JOIN (que incluiria livros sem autor/categoria), por comparar booleano com string ('S'), por não usar apelidos nas colunas ou por usar LIKE sem necessidade.

O comando SELECT é a base da consulta em SQL, uma linguagem declarativa: você diz o que quer obter, não como obter. A estrutura fundamental é SELECT colunas FROM tabela [JOIN ...] [WHERE ...]. Para responder a esta questão, é preciso dominar três conceitos: (1) a diferença entre INNER JOIN e LEFT JOIN; (2) a comparação correta de um campo booleano; (3) a projeção de colunas com apelidos (AS).

O INNER JOIN retorna apenas as linhas que têm correspondência nas duas tabelas envolvidas. No contexto do enunciado, como todo livro válido deve ter autor e categoria correspondentes, o INNER JOIN é o tipo de junção adequado — ele garante que só apareçam livros com registros existentes em autores e categorias. Já o LEFT JOIN (ou LEFT OUTER JOIN) retorna todas as linhas da tabela à esquerda, mesmo que não haja correspondência na tabela à direita; nesse caso, as colunas da tabela à direita ficam com NULL. Usar LEFT JOIN aqui permitiria que livros sem autor ou sem categoria aparecessem no resultado, o que contraria a exigência de "já existirem registros correspondentes".

A comparação com campo booleano também é um ponto crítico. O enunciado define disponivel como um campo booleano (TRUE ou FALSE). Em SQL padrão, a comparação correta é WHERE disponivel = TRUE (ou simplesmente WHERE disponivel). Comparar com a string 'S' (como na alternativa D) está errado, pois 'S' é um texto, não um valor booleano — a comparação não retornaria os registros esperados (ou poderia gerar erro, dependendo do SGBD).

Por fim, a projeção das colunas: o enunciado pede exatamente três colunas: título do livro, nome do autor e nome da categoria. Para evitar ambiguidade (já que nome existe tanto em autores quanto em categorias), é necessário qualificar as colunas com o alias da tabela (l.titulo, a.nome, c.nome). O uso de AS para criar apelidos (a.nome AS autor, c.nome AS categoria) é opcional, mas torna o resultado mais claro e é uma boa prática. A alternativa A, por exemplo, usa SELECT titulo, nome, nome sem qualificação — isso geraria erro de ambiguidade, pois o banco não saberia de qual tabela viria cada nome.

A pegadinha central desta questão é a combinação de três requisitos: junção correta, filtro booleano correto e projeção correta. A banca mistura alternativas que acertam um ou dois desses pontos, mas erram em pelo menos um. A alternativa E é a única que acerta todos.

1JOINs
INNER JOIN (exige correspondência)
LEFT JOIN (inclui sem correspondência) → ❌
2Filtro booleano
= TRUE (correto)
= 'S' (string) → ❌
3Projeção
Qualificada (l.titulo, a.nome, c.nome)
Sem qualificação (nome ambíguo) → ❌
4Filtro de texto
= 'Ficção Científica' (exato)
LIKE '%...%' (parcial) → ❌
Consulta SQL correta
LEVELsoulevel.com.br
Consulta SQL correta: JOINs (INNER JOIN (exige correspondência), LEFT JOIN (inclui sem correspondência) → ❌); Filtro booleano (= TRUE (correto), = 'S' (string) → ❌); Projeção (Qualificada (l.titulo, a.nome, c.nome), Sem qualificação (nome ambíguo) → ❌); Filtro de texto (= 'Ficção Científica' (exato), LIKE '%...%' (parcial) → ❌)

Alternativa A — ❌ Incorreta

O erro está na projeção: SELECT titulo, nome, nome não qualifica as colunas com os aliases das tabelas. Como nome existe tanto em autores quanto em categorias, o banco não consegue resolver a ambiguidade e a consulta falharia (erro de coluna ambígua). Além disso, titulo também deveria ser qualificado como l.titulo para consistência. Os JOINs e o WHERE estão corretos, mas a projeção inválida torna a alternativa incorreta.

Alternativa B — ❌ Incorreta

Usa LEFT JOIN para ambas as junções. Isso permite que livros sem autor ou sem categoria correspondente apareçam no resultado (com NULL nas colunas de autores e categorias). O enunciado exige que "já existam registros correspondentes em autores e categorias", o que é garantido pelo INNER JOIN, não pelo LEFT JOIN. Além disso, o filtro c.nome = 'Ficção Científica' combinado com LEFT JOIN eliminaria os livros sem categoria, mas ainda permitiria livros sem autor — o que contraria o requisito.

Alternativa C — ❌ Incorreta

A sintaxe com vírgulas (FROM livros l, autores a, categorias c) seguida de condições no WHERE é uma forma de junção implícita (produto cartesiano filtrado). Embora funcione, o uso de LIKE '%Ficção Científica%' é desnecessário e menos preciso que = 'Ficção Científica'. O LIKE com curingas % é usado para correspondência parcial de padrões; aqui, o enunciado pede exatamente o nome "Ficção Científica", então a igualdade é a forma correta. A consulta funcionaria, mas não é a melhor prática e o LIKE pode retornar resultados inesperados (por exemplo, se houver uma categoria "Ficção Científica e Fantasia", ela também seria retornada).

Alternativa D — ❌ Incorreta

O erro está na comparação do campo booleano: WHERE l.disponivel = 'S'. O campo disponivel é booleano (TRUE/FALSE), não uma string. Comparar com 'S' está incorreto — a consulta não retornaria os livros disponíveis. A forma correta é l.disponivel = TRUE (ou simplesmente l.disponivel). Todo o restante da consulta (JOINs, projeção, filtro de categoria) está correto, mas esse erro de tipo invalida a alternativa.

Alternativa E — ✅ Correta ⟵ GABARITO

Esta alternativa atende a todos os requisitos do enunciado:

  • INNER JOIN com autores e categorias garante que só apareçam livros com registros correspondentes nessas tabelas.

  • WHERE l.disponivel = TRUE filtra corretamente os livros disponíveis (comparação booleana correta).

  • AND c.nome = 'Ficção Científica' filtra pela categoria exata.

  • SELECT l.titulo, a.nome AS autor, c.nome AS categoria projeta exatamente três colunas, com qualificação e apelidos para evitar ambiguidade e tornar o resultado claro.

A consulta está sintaticamente correta e semanticamente alinhada com o que se pede.

NÃO CAIA NESSA!

A banca explora três armadilhas em uma única questão: (1) troca INNER JOIN por LEFT JOIN (alternativa B), fazendo o candidato esquecer que o LEFT JOIN incluiria livros sem autor/categoria; (2) compara booleano com string 'S' (alternativa D), um erro clássico de tipo; (3) deixa colunas sem qualificação (alternativa A), gerando ambiguidade. A alternativa C usa LIKE onde a igualdade é suficiente. Com treino, você identifica essas trocas de longe 💪.

PEGA ESSA DICA!

Para questões de SQL com múltiplos requisitos, verifique cada parte da consulta separadamente: (1) os JOINs estão corretos para o relacionamento? (2) os filtros no WHERE usam os tipos corretos (booleano, número, string)? (3) as colunas projetadas estão qualificadas e são exatamente as pedidas? Essa checagem sistemática evita erros por descuido.

Gabarito: letra E

Link permanente: /questoes/ce417320