As 6 cláusulas que resolvem quase toda query
SQL tem dezenas de comandos. Mas se você olhar as queries que roda numa semana normal, quase todas são feitas das mesmas seis peças.
E elas sempre aparecem na mesma ordem. Isso é a melhor notícia do SQL: a estrutura é fixa.
O esqueleto
SELECT cliente, SUM(valor) AS total
FROM pedidos
WHERE estado = 'SP'
GROUP BY cliente
HAVING SUM(valor) > 1000
ORDER BY total DESC
Cada linha responde uma pergunta:
SELECT— o que eu quero ver?FROM— de onde isso vem?WHERE— quais linhas entram?GROUP BY— junta por quê?HAVING— quais grupos ficam?ORDER BY— em que ordem eu leio?
Nenhuma delas pode trocar de lugar. Se você tentar pôr o WHERE depois do GROUP BY, o banco recusa a query antes mesmo de olhar os dados.
Nem toda query usa as seis
SELECT e FROM são obrigatórios. Os outros quatro são opcionais e entram conforme a pergunta pede:
- Sem agrupamento? Some
GROUP BYeHAVING. - Não precisa filtrar? Some
WHERE. - Tanto faz a ordem? Some
ORDER BY.
O que não acontece é aparecer fora de ordem. A estrutura é sempre esse esqueleto, com peças faltando.
O par que mais confunde
WHERE e HAVING fazem a mesma coisa — filtrar — em momentos diferentes:
WHEREfiltra linhas, antes de agrupar.HAVINGfiltra grupos, depois de agrupar.
Por isso SUM(valor) > 1000 só funciona no HAVING: antes do GROUP BY essa soma ainda não existe.
Pra lembrar
Quando travar numa query, volte para o esqueleto e preencha linha por linha, na ordem. Escreva primeiro de onde vem e o que fica, e só depois o que mostrar.
Seis cláusulas, sempre na mesma sequência. O resto do SQL é vocabulário — isso aqui é a gramática.