alltools.one
SQL
2026-02-25
10 min
alltools.one Team
sqlformattingdatabasebest-practicesdeveloper-tools

Boas Práticas de Formatação SQL para Consultas Limpas

Todo profissional de banco de dados já herdou uma consulta que parecia que alguém jogou palavras-chave na parede. Uma formatação SQL adequada transforma blocos de texto ilegíveis em código estruturado e fácil de escanear, que qualquer pessoa da sua equipe consegue entender em segundos. Seja ao escrever uma consulta rápida ad-hoc ou construir uma stored procedure que vai rodar em produção por anos, a forma como você formata seu SQL importa enormemente.

Você pode colar qualquer consulta bagunçada no nosso Formatador SQL e obter uma saída limpa e devidamente indentada instantaneamente — mas entender por que certas escolhas de formatação funcionam melhor vai te tornar um desenvolvedor SQL mais completo.

Por Que a Formatação SQL Importa

Uma formatação SQL ruim cria problemas em cascata por todo o seu fluxo de trabalho:

  • A depuração leva três vezes mais tempo — Quando uma consulta retorna resultados errados, você precisa rastrear a lógica visualmente. Uma formatação bagunçada esconde erros lógicos.
  • As revisões de código travam — Os revisores gastam tempo decifrando a estrutura em vez de avaliar a lógica.
  • Os conflitos de merge se multiplicam — Formatação inconsistente significa que cada membro da equipe reformata de um jeito diferente, criando diffs desnecessários no git.
  • A integração de novos membros sofre — Novos integrantes da equipe têm dificuldade para entender a lógica de negócio enterrada em consultas emaranhadas.
  • Incidentes em produção escalam — Sob pressão, ninguém quer desemaranhar uma consulta de 200 linhas sem quebras de linha.

O ponto é o seguinte: formatação SQL não é sobre estética. É sobre reduzir a carga cognitiva. Uma consulta bem formatada comunica sua intenção antes mesmo de você ter lido os nomes das colunas.

Capitalização de Palavras-Chave: Escolha uma Convenção e Mantenha

O tópico mais debatido sobre formatação SQL é a capitalização de palavras-chave. Existem três abordagens comuns:

Palavras-chave em MAIÚSCULAS (mais comum):

SELECT
    u.first_name,
    u.last_name,
    o.order_total
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE o.order_date >= '2025-01-01'
ORDER BY o.order_total DESC;

Palavras-chave em minúsculas:

select
    u.first_name,
    u.last_name,
    o.order_total
from users u
inner join orders o on u.id = o.user_id
where o.order_date >= '2025-01-01'
order by o.order_total desc;

Palavras-chave em Title Case:

Select
    u.first_name,
    u.last_name,
    o.order_total
From users u
Inner Join orders o On u.id = o.user_id
Where o.order_date >= '2025-01-01'
Order By o.order_total Desc;

Palavras-chave em MAIÚSCULAS continuam sendo o padrão da indústria, e por um bom motivo. Elas criam uma separação visual imediata entre as palavras-chave SQL e os nomes das suas tabelas/colunas. Seus olhos podem escanear a margem esquerda e entender instantaneamente a estrutura da consulta: SELECT, FROM, WHERE, ORDER BY.

Vale notar: qualquer que seja a convenção que você escolher, aplique-a com uma ferramenta automatizada. Nosso Formatador SQL lida com a capitalização de palavras-chave automaticamente, para que toda a sua equipe mantenha a consistência sem precisar pensar nisso.

Estratégias de Indentação para Cláusulas Principais

Uma boa indentação é a espinha dorsal de um SQL legível. Cada cláusula principal deve começar na margem esquerda, e seu conteúdo deve ser indentado um nível.

Cláusula SELECT

Coloque cada coluna em sua própria linha. Isso torna trivial adicionar, remover ou comentar colunas:

SELECT
    e.employee_id,
    e.first_name,
    e.last_name,
    e.department_id,
    d.department_name,
    e.hire_date,
    e.salary
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;

Evite este antipadrão comum:

-- Difícil de escanear, difícil de modificar
SELECT e.employee_id, e.first_name, e.last_name, e.department_id, d.department_name, e.hire_date, e.salary
FROM employees e INNER JOIN departments d ON e.department_id = d.id;

Cláusulas FROM e JOIN

Cada JOIN ganha sua própria linha. A condição ON fica junto com seu JOIN, indentada ainda mais se abranger múltiplas condições:

SELECT
    o.order_id,
    c.customer_name,
    p.product_name,
    oi.quantity,
    oi.unit_price
FROM orders o
INNER JOIN customers c
    ON o.customer_id = c.id
INNER JOIN order_items oi
    ON o.id = oi.order_id
LEFT JOIN products p
    ON oi.product_id = p.id
WHERE o.status = 'completed'
    AND o.order_date >= '2025-01-01';

Cláusula WHERE

Cada condição ganha sua própria linha. Coloque o operador booleano (AND/OR) no início de cada nova linha — isso torna extremamente simples comentar condições individuais durante a depuração:

WHERE o.status = 'completed'
    AND o.order_date >= '2025-01-01'
    AND o.order_date < '2026-01-01'
    AND c.region IN ('US', 'CA', 'UK')
    -- AND o.total > 100  (temporariamente desabilitado)

A boa notícia: uma vez que você internalize esse padrão, vai identificar erros lógicos muito mais rápido. Cada condição está visualmente isolada, então filtros ausentes ou incorretos saltam aos olhos imediatamente.

Formatando JOINs Complexos

Consultas do mundo real raramente têm JOINs simples de uma única coluna. Veja como lidar com JOINs de múltiplas condições de forma limpa:

SELECT
    s.sale_id,
    s.sale_date,
    p.product_name,
    w.warehouse_name,
    i.quantity_on_hand
FROM sales s
INNER JOIN products p
    ON s.product_id = p.id
LEFT JOIN inventory i
    ON p.id = i.product_id
    AND i.warehouse_id = s.warehouse_id
    AND i.snapshot_date = s.sale_date
LEFT JOIN warehouses w
    ON i.warehouse_id = w.id
WHERE s.sale_date >= '2025-06-01';

Repare como as condições adicionais do JOIN são indentadas no mesmo nível da primeira condição ON. Isso deixa claro que todas as três condições pertencem ao mesmo JOIN — e não a uma cláusula WHERE que foi acidentalmente colocada no lugar errado.

Para self-joins, use aliases significativos em vez de letras isoladas crípticas:

SELECT
    mgr.first_name AS manager_name,
    emp.first_name AS employee_name,
    emp.hire_date
FROM employees emp
INNER JOIN employees mgr
    ON emp.manager_id = mgr.employee_id
WHERE mgr.department_id = 10;

Formatação de CTEs (Cláusulas WITH)

As Common Table Expressions merecem atenção especial na formatação porque podem fazer ou destruir a legibilidade de consultas complexas. Cada CTE deve ser tratada como seu próprio bloco formatado:

WITH monthly_revenue AS (
    SELECT
        DATE_TRUNC('month', order_date) AS revenue_month,
        SUM(order_total) AS total_revenue,
        COUNT(DISTINCT customer_id) AS unique_customers
    FROM orders
    WHERE order_date >= '2025-01-01'
    GROUP BY DATE_TRUNC('month', order_date)
),

customer_segments AS (
    SELECT
        customer_id,
        SUM(order_total) AS lifetime_value,
        CASE
            WHEN SUM(order_total) >= 10000 THEN 'platinum'
            WHEN SUM(order_total) >= 5000 THEN 'gold'
            WHEN SUM(order_total) >= 1000 THEN 'silver'
            ELSE 'bronze'
        END AS segment
    FROM orders
    GROUP BY customer_id
)

SELECT
    mr.revenue_month,
    mr.total_revenue,
    mr.unique_customers,
    COUNT(CASE WHEN cs.segment = 'platinum' THEN 1 END) AS platinum_count,
    COUNT(CASE WHEN cs.segment = 'gold' THEN 1 END) AS gold_count
FROM monthly_revenue mr
CROSS JOIN customer_segments cs
GROUP BY mr.revenue_month, mr.total_revenue, mr.unique_customers
ORDER BY mr.revenue_month;

Regras principais de formatação de CTEs:

  • Separe as CTEs com uma linha em branco após cada parêntese de fechamento e vírgula
  • Indente o corpo de cada CTE como faria com qualquer consulta regular
  • Use nomes descritivos para as CTEsmonthly_revenue é sempre melhor que cte1
  • Mantenha o SELECT final no mesmo nível de indentação que a palavra-chave WITH

Formatação de Subconsultas

As subconsultas devem ser indentadas um nível mais profundo que a consulta ao redor. Use parênteses como delimitadores visuais:

SELECT
    d.department_name,
    d.budget,
    dept_stats.avg_salary,
    dept_stats.employee_count
FROM departments d
INNER JOIN (
    SELECT
        department_id,
        AVG(salary) AS avg_salary,
        COUNT(*) AS employee_count
    FROM employees
    WHERE status = 'active'
    GROUP BY department_id
    HAVING COUNT(*) >= 5
) dept_stats
    ON d.id = dept_stats.department_id
WHERE d.budget > 100000
ORDER BY dept_stats.avg_salary DESC;

Quando você tem subconsultas aninhadas em três ou quatro níveis de profundidade, isso geralmente é um sinal para refatorar usando CTEs. As CTEs achatam o aninhamento e dão a cada etapa lógica um nome legível. Nosso Formatador SQL pode te ajudar a identificar estruturas profundamente aninhadas que podem se beneficiar de refatoração.

Formatação de Instruções CASE

Instruções CASE aparecem em todo lugar — em listas SELECT, cláusulas WHERE, ORDER BY, e até em condições de JOIN. Mantenha-as legíveis com indentação consistente:

SELECT
    order_id,
    order_total,
    CASE
        WHEN order_total >= 1000 THEN 'high-value'
        WHEN order_total >= 100 THEN 'medium-value'
        ELSE 'low-value'
    END AS order_tier,
    CASE status
        WHEN 'shipped' THEN 'In Transit'
        WHEN 'delivered' THEN 'Complete'
        WHEN 'returned' THEN 'Refund Pending'
        ELSE 'Processing'
    END AS display_status
FROM orders;

As palavras-chave WHEN e ELSE se alinham entre si, e a palavra-chave END se alinha com CASE. Isso cria um bloco visual limpo que é fácil de escanear e modificar.

Boas Práticas para Comentários em SQL

Comentários em SQL são os melhores amigos do seu eu do futuro. Use-os estrategicamente:

Comentários em bloco para o propósito da consulta:

/*
 * Relatório de Receita Mensal
 * Gera a divisão de receita por categoria de produto
 * Usado por: Dashboard financeiro (Tableau)
 * Última modificação: 2025-06-15
 */
SELECT
    pc.category_name,
    SUM(oi.quantity * oi.unit_price) AS revenue
FROM order_items oi
INNER JOIN products p ON oi.product_id = p.id
INNER JOIN product_categories pc ON p.category_id = pc.id
GROUP BY pc.category_name;

Comentários inline para lógica não óbvia:

WHERE o.order_date >= '2025-01-01'
    AND o.status != 'cancelled'
    AND o.payment_verified = TRUE    -- exclui revisões de pagamento pendentes
    AND c.account_type != 'internal' -- pedidos de teste da equipe usam contas internas

Comentários de seção para consultas longas:

-- === Cálculo de Receita ===
...
-- === Filtragem de Clientes ===
...
-- === Agregação Final ===

Evite comentar excessivamente coisas óbvias. -- selecionar todas as colunas acima de uma instrução SELECT adiciona ruído, não clareza.

Formatação para Diferentes Dialetos SQL

Os dialetos SQL têm suas próprias peculiaridades de sintaxe, mas os princípios de formatação permanecem consistentes. Aqui estão considerações específicas por dialeto:

MySQL

SELECT
    product_name,
    price,
    IFNULL(discount, 0) AS discount,
    price - IFNULL(discount, 0) AS final_price
FROM products
WHERE category_id IN (1, 3, 5)
LIMIT 50 OFFSET 100;

PostgreSQL

SELECT
    product_name,
    price,
    COALESCE(discount, 0) AS discount,
    price - COALESCE(discount, 0) AS final_price
FROM products
WHERE category_id = ANY(ARRAY[1, 3, 5])
LIMIT 50 OFFSET 100;

SQL Server

SELECT TOP 50
    product_name,
    price,
    ISNULL(discount, 0) AS discount,
    price - ISNULL(discount, 0) AS final_price
FROM products
WHERE category_id IN (1, 3, 5)
ORDER BY price DESC
OFFSET 100 ROWS FETCH NEXT 50 ROWS ONLY;

Independentemente do dialeto, a formatação estrutural permanece a mesma: palavras-chave em suas próprias linhas, indentação consistente, uma coluna por linha. O Formatador SQL no alltools.one suporta todos os principais dialetos, então você obtém resultados consistentes não importa com qual banco de dados esteja trabalhando.

Formatação Automatizada vs. Formatação Manual

A formatação manual funciona bem para consultas curtas. Mas quando sua equipe cresce além de duas pessoas, você precisa de aplicação automatizada. Veja por quê:

Benefícios da formatação automatizada:

  • Zero debates — O formatador decide, todo mundo segue
  • Diffs consistentes no git — Sem mais alterações apenas de espaçamento poluindo pull requests
  • Velocidade — Reformatar uma stored procedure de 500 linhas manualmente leva minutos. Uma ferramenta faz isso em milissegundos.
  • Integração — Novos membros da equipe não precisam memorizar guias de estilo

Quando a formatação manual ainda ganha:

  • Alinhamento de colunas específicas em instruções INSERT ou blocos CASE complexos
  • Preservação de formatação intencional em consultas de documentação
  • Casos extremos onde ferramentas automatizadas comprometem a legibilidade (raro, mas acontece)

A abordagem pragmática: use formatação automatizada como sua linha de base, depois ajuste manualmente as poucas consultas onde isso importa. Passe seu SQL pelo nosso Formatador SQL primeiro, depois ajuste seções específicas se necessário.

Referência Rápida: Checklist de Formatação SQL

Antes de fazer commit de qualquer SQL no seu código, passe por este checklist:

  • As palavras-chave estão consistentemente capitalizadas (preferencialmente em MAIÚSCULAS)
  • Cada cláusula principal (SELECT, FROM, WHERE, GROUP BY, ORDER BY) começa em uma nova linha
  • As colunas no SELECT estão uma por linha
  • Os JOINs estão cada um em sua própria linha com condições ON indentadas
  • As condições WHERE estão uma por linha com AND/OR no início
  • As CTEs têm nomes descritivos e indentação consistente
  • As instruções CASE têm WHEN/ELSE alinhados
  • Os comentários explicam o porquê, não o quê
  • Os aliases de tabela são significativos (não apenas letras isoladas para consultas complexas)
  • Subconsultas com mais de dois níveis de profundidade foram refatoradas em CTEs

Recursos Relacionados

Se você está trabalhando em qualidade de código de forma mais ampla, estes guias complementam bem a formatação SQL:

Formatação SQL limpa é uma daquelas práticas que custa quase nada para adotar, mas rende dividendos todos os dias. Seu eu do futuro — e cada colega de equipe que tocar nas suas consultas — vai te agradecer.


🛠️ Experimente agora: Formatador SQL — Formate e embeleze consultas SQL instantaneamente. 100% gratuito, processa tudo no seu navegador. Nenhum dado é enviado.


Published on 2026-02-25
SQL Formatting Best Practices for Clean Queries | alltools.one