As tabelas, a seguir, foram criadas no banco de dados relaci...
CREATE TABLE Clientes ( Cliente_ID INT PRIMARY KEY, Nome VARCHAR(100), Cidade VARCHAR(100), Estado CHAR(2) );
CREATE TABLE Pedidos ( Pedido_ID INT PRIMARY KEY, Cliente_ID INT, Data_Pedido DATE, Valor_Total DECIMAL(10,2), FOREIGN KEY (Cliente_ID) REFERENCES Clientes(Cliente_ID) );
A consulta SQL, a seguir, retorna quais resultados?
SELECT c.Nome, COUNT(p.Pedido_ID) AS Num_Pedidos, COALESCE(SUM(p.Valor_Total), 0) AS Total_Gasto FROM Clientes c LEFT JOIN Pedidos p ON c.Cliente_ID = p.Cliente_ID WHERE p.Data_Pedido >= '2025-02-01' GROUP BY c.Nome HAVING COUNT(p.Pedido_ID) >= 1;
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa Correta: C
1. Tema central da questão
A questão trata de consulta SQL com JOIN, cláusulas WHERE, GROUP BY e HAVING em bancos de dados relacionais. Esses são conhecimentos essenciais em provas de concursos para compreender como recuperar, filtrar e agrupar dados de tabelas relacionadas.
2. Resumo Teórico
Um LEFT JOIN seleciona todos os registros da tabela à esquerda ("Clientes") e os relacionados da tabela à direita ("Pedidos"), preenchendo com NULL se não houver correspondência. A cláusula WHERE filtra linhas baseadas numa condição – aqui, pedidos a partir de '2025-02-01'. O GROUP BY agrupa por cliente e o HAVING filtra grupos segundo uma condição agregada (neste caso, clientes que fizeram pelo menos um pedido no período).
Fontes: Elmasri & Navathe, Sistemas de Banco de Dados, Cap. 6; Documentação oficial do SQL Server e PostgreSQL.
3. Justificativa da Resposta Correta (C)
A consulta retorna apenas os clientes que fizeram ao menos um pedido a partir de 01/02/2025, mostrando o nome, número de pedidos e total gasto. Isso ocorre porque:
- O LEFT JOIN poderia trazer todos os clientes, mas o WHERE p.Data_Pedido >= '2025-02-01' filtra apenas linhas com pedido a partir dessa data.
- O HAVING COUNT(p.Pedido_ID) >= 1 elimina grupos de clientes sem pedidos nesse período.
4. Análise das Alternativas Incorretas
- A – Incorreta. O WHERE elimina clientes sem pedidos na data, então não retorna todos os clientes e nem exibe NULL para quem não comprou.
- B – Incorreta. A condição do WHERE exige pedidos a partir de 01/02/2025, e não antes.
- D – Incorreta. Apesar do LEFT JOIN, só aparecem os clientes que fizeram pedidos no período, pois o WHERE filtra os demais.
- E – Incorreta. Não há erro no uso do HAVING COUNT(); seu uso está correto para filtrar grupos.
Estratégia de interpretação: preste atenção no efeito do LEFT JOIN combinado com o WHERE: muitas vezes, o filtro do WHERE “anula” a vantagem do LEFT JOIN e só retorna registros da tabela da direita.
Gostou do comentário? Deixe sua avaliação aqui embaixo!
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
Errei a questão pois a clausula WHERE após o JOIN elimina as linhas com os clientes que não fizeram pedidos ou fizeram anterior a data Errei a questão porque a cláusula WHERE, após o JOIN, remove os clientes que não fizeram pedidos ou que os fizeram antes da data especificada.
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo