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
fg165279
Banca
FGV
Órgão
Pref Nova Iguaçu
Ano
2024
Cargo
AFTM (Pref N Iguaçu)

Seja um banco de dados relacional especificado em SQL de uma empresa de correspondência entre clientes, instituições financeiras e empréstimos contratados por esses clientes nessas instituições, previamente implementado em um banco de dados como a seguir:

 

create table tb_cliente
(
    id_cliente     integer       primary key,
    num_cpf        char(11)      unique,
    nome           varchar(50)   not null,
    email          varchar(20),
    telefone       varchar(20),
    endereco       varchar(100),
    cidade         varchar(20),
    estado         char(2)
);

create table tb_financeira
(
    id_financeira  integer       primary key,
    razao_social   varchar(30)   not null,
    cidade         varchar(30)   not null,
    estado         char(2)       not null
);

create table tb_emprestimo
(
    id_financeira  integer       references tb_financeira,
    id_cliente     integer       references tb_cliente,
    valor          real          not null check(valor > 0),
    dia            integer       not null check(dia >= 1 and dia <= 31),
    mes            integer       not null check(mes >= 1 and mes <= 12),
    ano            integer       not null check(ano >= 1980 and ano <= 2100),
    primary key(id_financeira, id_cliente, dia, mes, ano)
);

 

OBS: Neste banco de dados, cadeias de caracteres (strings) são representadas envoltas em aspas simples.

 

Para a conferência de empréstimos realizada pelos clientes, os auditores dispõem da seguinte visão:

 

create view v_max_emp_cli(cli,ano,val) as

select c.nome, e.ano, count(e.valor)

from tb_cliente c, tb_emprestimo e

group by c.nome, e.ano

 

Um auditor deseja saber quais os clientes cujo nome termina em ‘MORAES’ no ano de 2024, utilizando essa estrutura de visão anteriormente apresentada.

 

Assinale a opção que apresenta a consulta que atende ao objetivo em tela, sabendo-se que os nomes dos clientes foram todos cadastrados utilizando-se exclusivamente caracteres alfabéticos maiúsculos.

  1. Aselect c.nome from v_max_emp_cli where cli = '%MORAES' and ano = 2024
  2. Bselect c.nome from v_max_emp_cli where cli LIKE '%MORAES%' and ano = 2024
  3. Cselect cli from v_max_emp_cli where cli = '%MORAES' and ano = 2024
  4. Dselect cli from v_max_emp_cli where cli like '%MORAES' and ano = 2024
  5. Eselect cli from v_max_emp_cli where cli like '%MORAES%' and ano = 2024
Revelar gabarito e comentário

GabaritoD — select cli from v_max_emp_cli where cli like '%MORAES' and ano = 2024

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

Consultas SQL: operador LIKE e visões

Gabarito: letra D. A consulta correta é select cli from v_max_emp_cli where cli like '%MORAES' and ano = 2024, pois a visão v_max_emp_cli tem colunas cli, ano e val, e o operador LIKE com o padrão '%MORAES' (sem o % no final) seleciona exatamente os nomes que terminam em 'MORAES'. As alternativas A e B erram ao usar c.nome (coluna inexistente na visão) e as alternativas B e E erram ao usar '%MORAES%', que também casa nomes que contêm 'MORAES' em qualquer posição, não apenas os que terminam.

A questão envolve dois conceitos centrais de SQL: a visão (view) e o operador de correspondência de padrões LIKE. Uma visão é uma consulta nomeada e armazenada no banco de dados, que se comporta como uma tabela virtual para o usuário. No comando create view v_max_emp_cli(cli,ano,val) as select c.nome, e.ano, count(e.valor) ..., a visão expõe três colunas: cli (que recebe o valor de c.nome), ano (de e.ano) e val (a contagem). Ao consultar a visão, você deve referenciar essas colunas pelos nomes definidos na visão, não pelos nomes das colunas das tabelas originais. Por isso, select cli é correto, enquanto select c.nome é inválido, pois c é um alias da tabela tb_cliente, que não está acessível na visão.

O operador LIKE é usado para comparar uma string com um padrão, onde % representa qualquer sequência de caracteres (inclusive vazia) e _ representa um único caractere. Para encontrar nomes que terminam com 'MORAES', o padrão deve ser '%MORAES' — o % no início permite qualquer prefixo, e a ausência de % no final exige que a string termine exatamente com 'MORAES'. Já o padrão '%MORAES%' casa qualquer string que contenha 'MORAES' em qualquer posição, o que incluiria, por exemplo, 'MORAES SILVA' (que começa com MORAES) ou 'JOAO MORAES FILHO' (que tem MORAES no meio), além dos que terminam. Como o enunciado pede explicitamente "cujo nome termina em 'MORAES'", o padrão correto é '%MORAES'.

Um ponto importante: o operador = faz comparação exata, então cli = '%MORAES' procuraria um nome literalmente igual a '%MORAES', o que não atende ao requisito. Além disso, como os nomes foram cadastrados em maiúsculas, não há preocupação com case sensitivity — o padrão '%MORAES' já está em maiúsculas, então funciona.

A pegadinha da banca está em dois níveis: primeiro, a troca da coluna cli por c.nome (que não existe na visão), e segundo, o uso do padrão '%MORAES%' em vez de '%MORAES'. O candidato que não percebe que a visão tem colunas próprias pode cair na alternativa A ou B, e o que não domina a semântica do % pode escolher B ou E. A alternativa D é a única que acerta ambos os pontos.

1Colunas da visão
cli
ano
val
2Erro comum: usar c.nome
Alias da tabela original
Não existe na visão
3Operador LIKE
'%MORAES' → termina com
'%MORAES%' → contém em qualquer posição
'=' → comparação exata (não serve)
Consulta à visão v_max_emp_cli
LEVELsoulevel.com.br
Consulta à visão v_max_emp_cli: Colunas da visão (cli, ano, val); Erro comum: usar c.nome (Alias da tabela original, Não existe na visão); Operador LIKE ('%MORAES' → termina com, '%MORAES%' → contém em qualquer posição, '=' → comparação exata (não serve))

Alternativa A — ❌ Incorreta

Erra ao usar select c.nome: a visão v_max_emp_cli não possui coluna c.nome; suas colunas são cli, ano e val. O alias c refere-se à tabela tb_cliente, que não está no escopo da consulta à visão. Além disso, usa = em vez de LIKE, o que faria uma comparação exata com a string literal '%MORAES', não uma busca por padrão.

Alternativa B — ❌ Incorreta

Erra ao usar select c.nome (mesmo problema da A) e também ao usar o padrão '%MORAES%', que casa nomes que contêm 'MORAES' em qualquer posição, não apenas os que terminam. O enunciado pede nomes que terminam em 'MORAES', então o padrão deveria ser '%MORAES'.

Alternativa C — ❌ Incorreta

Usa corretamente select cli e o padrão '%MORAES', mas erra ao usar = em vez de LIKE. A comparação cli = '%MORAES' procura um nome exatamente igual à string '%MORAES', o que não retornaria nenhum resultado, pois os nomes reais não contêm o caractere %.

Alternativa D — ✅ Correta ⟵ GABARITO

Esta é a consulta correta: select cli from v_max_emp_cli where cli like '%MORAES' and ano = 2024. Ela seleciona a coluna cli da visão, filtra com LIKE '%MORAES' (nomes que terminam em 'MORAES') e restringe ao ano de 2024. Atende exatamente ao objetivo do auditor.

Alternativa E — ❌ Incorreta

Usa corretamente select cli e LIKE, mas o padrão '%MORAES%' é amplo demais: casa qualquer nome que contenha 'MORAES' em qualquer posição, incluindo nomes que não terminam com 'MORAES'. O enunciado pede especificamente nomes que terminam em 'MORAES', então o padrão correto é '%MORAES'.

Gabarito: letra D

Link permanente: /questoes/fg165279