Ordem lógica de execução de consultas
Entenda por que FROM é executado antes de SELECT e como a ordem real de execução responde a uma dúzia de perguntas capciosas.
Ordem lógica de execução de consultas é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.
A pergunta que abre caminho para uma dúzia de outras
Os entrevistadores perguntam "Em que ordem uma consulta realmente é executada?" porque isso explica muitas coisas: por que um apelido de SELECT falha em WHERE, por que WHERE não pode filtrar uma agregação e muito mais.
Ordem escrita versus ordem lógica
Você escreve uma consulta começando com SELECT, mas o mecanismo a executa começando com FROM. Essa diferença, com SELECT sendo avaliado quase por último, causa a maior parte da confusão.
A ordem lógica completa
A ordem lógica completa é: FROM, depois WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY e, por fim, LIMIT. Todas as armadilhas abaixo resultam diretamente dessa lista.
Por que FROM é executado primeiro
FROM é executado primeiro porque o mecanismo precisa de linhas para trabalhar antes de qualquer outra coisa. Ele monta as linhas de origem e só então WHERE pode decidir quais manter.
SELECT e.name, d.name AS dept
FROM employees e
JOIN departments d ON d.id = e.department_id
WHERE e.salary > 50000;Armadilha: o apelido não pode ser usado em WHERE
A consequência mais perguntada: um apelido de SELECT não pode ser usado em WHERE, porque WHERE é executado antes de SELECT. O código abaixo mostra o erro e a correção: repetir a expressão.
-- FAILS: alias 'annual' unknown in WHERE
SELECT salary * 12 AS annual
FROM employees
WHERE annual > 600000;
-- FIX: repeat the expression
SELECT salary * 12 AS annual
FROM employees
WHERE salary * 12 > 600000;Armadilha: WHERE não pode acessar agregações
WHERE é executado antes do agrupamento, portanto não pode acessar agregações como COUNT(). É para isso que HAVING serve: WHERE filtra linhas, e HAVING filtra grupos depois da agregação.
-- WHERE cannot use COUNT(*)
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;Por que ORDER BY pode usar apelidos
O caso oposto: ORDER BY é executado depois de SELECT, portanto pode usar apelidos de SELECT. O mesmo apelido, em momentos diferentes, explica por que ele funciona aqui, mas não em WHERE.
SELECT name, salary * 12 AS annual
FROM employees
ORDER BY annual DESC;Onde DISTINCT se encaixa
DISTINCT é executado depois de SELECT, mas antes de ORDER BY. Como ele remove duplicidades com base nas colunas de saída, você só pode ordenar por algo que tenha permanecido na lista de seleção.
-- ERROR in many engines:
-- ORDER BY column not in the DISTINCT select list
SELECT DISTINCT department
FROM employees
ORDER BY hire_date;Rastreamento prático de uma consulta completa
Vamos acompanhar uma consulta real por cada etapa: FROM lê as linhas, WHERE filtra, GROUP BY agrupa, HAVING mantém os grupos, SELECT calcula, ORDER BY ordena e LIMIT recorta.
SELECT customer_id, SUM(amount) AS total
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
HAVING SUM(amount) > 1000
ORDER BY total DESC
LIMIT 10;Execução lógica versus física
Uma nuance que impressiona: esta é a ordem lógica que define a correção. O plano físico do otimizador pode ser diferente, desde que produza as mesmas linhas.
Uma associação para memorizar a ordem
Para memorizar, imagine linhas descendo por um fluxo, com cada etapa entregando um conjunto menor à seguinte. Quando algo falhar, verifique se uma etapa anterior produziu o que é necessário.
Verificação rápida
Aplique a ordem de execução para identificar o erro.
Recapitulação
Recapitulação: a ordem lógica é FROM, WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY, LIMIT. WHERE é executado antes de SELECT (sem apelidos); ORDER BY é executado depois (os apelidos funcionam).
Perguntas Frequentes
A aula “Ordem lógica de execução de consultas” é grátis?
Sim — o texto completo de “Ordem lógica de execução de consultas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.
O que vou aprender em “Ordem lógica de execução de consultas”?
Entenda por que FROM é executado antes de SELECT e como a ordem real de execução responde a uma dúzia de perguntas capciosas. Você pratica Coding Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Coding Interview Prep?
Nenhuma experiência prévia é necessária. Coding Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Ordem lógica de execução de consultas”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Coding Interview Prep?
Sim. Cada aula de Coding Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- O que é SQL e por que entrevistadores perguntam sobre isso
- Ordem lógica de execução de consultas
- Chaves primárias, estrangeiras e restrições
- Lendo um esquema sob pressão