O WHERE filtra linhas individuais antes da agregação; o HAVING filtra grupos depois da agregação. Então você filtra por colunas cruas no WHERE e por resultados agregados como COUNT ou SUM no HAVING. Filtre o máximo que puder no WHERE, já que reduzir linhas antes do agrupamento sai mais barato. Um bug comum é colocar um filtro de data no HAVING, o que ainda agrega tudo primeiro e pode mudar os resultados.
Por que os entrevistadores perguntam isso
Isso revela se você entende a ordem lógica de operações do SQL em vez de apenas reconhecer sintaxe por padrão. Os entrevistadores costumam emendar em perguntas relacionadas sobre por que você não pode referenciar um alias de coluna no WHERE, ou por que um filtro colocado na cláusula errada mudou os números, e as duas coisas vêm da mesma ordem de execução.
Como estruturar sua resposta
- Ancore a resposta na ordem lógica de execução.
- Dê a regra: colunas cruas no WHERE, agregados no HAVING.
- Explique o motivo de performance para filtrar cedo.
- Cite a visibilidade de alias como consequência da mesma ordem.
Exemplo de resposta
Tudo se resume a quando cada cláusula roda. O WHERE acontece antes do agrupamento, então filtra linhas individuais. O HAVING acontece depois, então filtra os grupos já agregados. Se eu quero pedidos deste ano, isso é WHERE. Se eu quero apenas clientes com mais de cinco pedidos, isso tem que ser HAVING, porque a contagem ainda não existe na hora do WHERE. Eu sempre empurro os filtros o máximo possível para o WHERE, já que agrupar dez mil linhas em vez de dez milhões faz uma diferença relevante em uma tabela grande. A mesma ordem de execução explica uma coisa que confunde muita gente: você não pode referenciar um alias do SELECT no WHERE, porque a lista do SELECT é avaliada depois do filtro, embora a maioria dos motores deixe você usar o alias no GROUP BY e no ORDER BY, o que parece inconsistente até você entender a ordem. E o bug que eu de fato tive que consertar foi um filtro de data no HAVING que produzia totais de aparência correta sobre a janela errada.
Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.
Veja como funcionaPerguntas de acompanhamento que você pode esperar
- Por que não dá para usar um alias do SELECT na cláusula WHERE?
- Como você filtraria por um agregado sem usar HAVING?
- Qual é a ordem lógica de execução em um comando SELECT?
Mais perguntas para Analista de Dados
Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.
Prever minhas perguntas