Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2024
Banco de Dados›Consultas e Comandos em SQL
Código
ce403660
Banca
CESPE / CEBRASPE
Órgão
SEBRAE
Ano
2024
Cargo
Ana Tec II ( )
Texto 14A3
Em certa base de dados de e-commerce, as tabelas pedidos e clientes possuem as seguintes estruturas:
pedidos(pedido_id, cliente_id, data_pedido, e
valor_pedido)
clientes(cliente_id, nome_cliente, email, cidade)
Assinale a opção em que é indicada a consulta SQL que, na base de dados descrita no texto 14A3, retorna o nome dos clientes e o valor total de seus pedidos, apenas para aqueles que tenham realizado mais de 5 pedidos no ano de 2023.
ASELECT c.nome_cliente, SUM(v.valor_pedido) AS total_pedidos FROM vendas v RIGHT JOIN clientes c ON v.id_cliente = c.id_cliente WHERE v.data_ pedido BETWEEN '2023-01-01' AND '2023-12-31' GROUP BY c.nome_cliente HAVING COUNT(v.id_pedido) >= 5;
BSELECT c.nome_cliente, SUM(v.valor_pedido) AS total_pedidos FROM vendas v INNER JOIN pedidos c ON v.id_cliente = c.id_cliente WHERE YEAR(v.data_pedido) = 2023 GROUP BY c.nome_cliente HAVING SUM(v.id_pedido) > 5;
CSELECT c.nome_cliente, SUM(v.valor_pedido) AS total_ pedidos FROM vendas v LEFT JOIN clientes c ON v.id_cliente = c.id_cliente WHERE YEAR(v.data_pedido) = 2023 GROUP BY c.nome_cliente HAVING SUM(v.valor_pedido) > 5;
DSELECT c.nome_cliente, SUM(v.valor_pedido) AS total_ pedidos FROM vendas v INNER JOIN clientes c ON v.id_cliente = c.id_cliente WHERE v.data_ pedido BETWEEN '2023-01-01' AND '2023-12-31' GROUP BY c.nome_cliente HAVING COUNT(v.id_pedido) > 5;
Revelar gabarito e comentário▾
GabaritoD — SELECT c.nome_cliente,
SUM(v.valor_pedido) AS total_ pedidos
FROM vendas v
INNER JOIN clientes c ON v.id_cliente = c.id_cliente
WHERE v.data_ pedido BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY c.nome_cliente
HAVING COUNT(v.id_pedido) > 5;
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 – Consultas com JOIN, GROUP BY e HAVING
Gabarito: letra D. A consulta correta deve unir as tabelas pedidos e clientes pela chave cliente_id, filtrar os pedidos de 2023, agrupar por cliente e aplicar a condição de ter mais de 5 pedidos usando HAVING COUNT(...) > 5. A alternativa D é a única que combina corretamente o INNER JOIN com a condição de data, o GROUP BY e o HAVING com COUNT.
A questão exige a construção de uma consulta SQL que retorne o nome dos clientes e o valor total de seus pedidos, mas apenas para aqueles que realizaram mais de 5 pedidos no ano de 2023. Para isso, precisamos entender o papel de cada cláusula SQL envolvida.
Primeiro, o JOIN é usado para combinar registros de duas ou mais tabelas com base em uma condição de correspondência. No caso, as tabelas pedidos e clientes estão relacionadas pela coluna cliente_id. O INNER JOIN retorna apenas os registros que têm correspondência em ambas as tabelas, ou seja, apenas pedidos que possuem um cliente válido. Já o LEFT JOIN retorna todos os registros da tabela à esquerda (no caso, pedidos), mesmo que não haja correspondência na tabela à direita (clientes), preenchendo com NULL os campos da tabela sem correspondência. O RIGHT JOIN é o oposto do LEFT JOIN, retornando todos os registros da tabela à direita.
Em seguida, a cláusula WHERE filtra as linhas antes do agrupamento. Aqui, precisamos filtrar os pedidos do ano de 2023. Isso pode ser feito de duas formas: usando BETWEEN com as datas de início e fim do ano, ou usando a função YEAR() para extrair o ano da data. Ambas são válidas, mas é importante notar que BETWEEN é inclusivo, ou seja, inclui os extremos.
Depois, a cláusula GROUP BY agrupa as linhas resultantes por uma ou mais colunas. No caso, queremos agrupar por nome_cliente para que as funções de agregação, como SUM e COUNT, sejam aplicadas a cada grupo de pedidos de um mesmo cliente.
Por fim, a cláusula HAVING filtra os grupos após o agrupamento. É aqui que aplicamos a condição de ter mais de 5 pedidos. A função COUNT conta o número de linhas em cada grupo, e a condição COUNT(...) > 5 garante que apenas clientes com mais de 5 pedidos sejam retornados. É crucial usar COUNT para contar pedidos, não SUM, que somaria valores.
A pegadinha da banca está em usar SUM no HAVING para contar pedidos, o que está errado, e em usar >= em vez de >, o que mudaria o critério para "5 ou mais" em vez de "mais de 5". Além disso, algumas alternativas usam LEFT JOIN ou RIGHT JOIN, que podem incluir clientes sem pedidos ou pedidos sem clientes, o que não é desejado.
Guarde a distinção entre WHERE e HAVING: o WHERE filtra linhas antes do agrupamento, e o HAVING filtra grupos depois. E lembre-se de que COUNT conta linhas, enquanto SUM soma valores. É exatamente nesses pontos que as alternativas se dividem.
1INNER JOIN pedidos × clientes
2WHERE filtra ano de 2023
3GROUP BY nome_cliente
4HAVING COUNT > 5
5SELECT nome + SUM(valor)
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Esta alternativa usa RIGHT JOIN, que retornaria todos os clientes, mesmo aqueles sem pedidos, o que não atende ao requisito de "clientes que realizaram pedidos". Além disso, usa HAVING COUNT(...) >= 5, que incluiria clientes com exatamente 5 pedidos, mas o enunciado pede "mais de 5". O RIGHT JOIN também está incorreto porque a tabela clientes está à direita, e o RIGHT JOIN preservaria todos os clientes, mesmo sem pedidos, o que não é o desejado.
Alternativa B — ❌ Incorreta
Esta alternativa usa INNER JOIN, o que é correto, mas o HAVING usa SUM(v.id_pedido) > 5, que soma os valores dos IDs dos pedidos, não conta o número de pedidos. Isso está errado, pois a condição deve ser sobre a contagem de pedidos, não a soma de seus IDs. Além disso, a consulta referencia v.id_pedido, mas a tabela vendas não foi definida no enunciado, e a tabela correta é pedidos.
Alternativa C — ❌ Incorreta
Esta alternativa usa LEFT JOIN, que retornaria todos os pedidos, mesmo aqueles sem cliente correspondente, o que não é o desejado. Além disso, o HAVING usa SUM(v.valor_pedido) > 5, que soma os valores dos pedidos, não conta o número de pedidos. A condição deveria ser COUNT(v.id_pedido) > 5 para contar os pedidos.
Alternativa D — ✅ Correta ⟵ GABARITO
Esta alternativa usa INNER JOIN, que retorna apenas pedidos com clientes correspondentes, o que é correto. A condição WHERE v.data_pedido BETWEEN '2023-01-01' AND '2023-12-31' filtra os pedidos de 2023. O GROUP BY c.nome_cliente agrupa os pedidos por cliente, e o HAVING COUNT(v.id_pedido) > 5 garante que apenas clientes com mais de 5 pedidos sejam retornados. A consulta também seleciona c.nome_cliente e SUM(v.valor_pedido), que são exatamente os dados pedidos.