Formatador SQL

Cole uma instrução SQL de uma linha copiada de um log ou de um ORM, e o formatador a divide em cláusulas indentadas com capitalização consistente de palavras-chave, novas linhas antes de SELECT, FROM, WHERE, GROUP BY e colunas alinhadas na projeção. Suporta dialetos MySQL, PostgreSQL, SQL Server, Oracle, SQLite e BigQuery, cada um tem palavras-chave e palavras reservadas ligeiramente diferentes.

Como a formatação funciona

  1. 1

    Cole seu SQL

    Blob de uma linha, saída minificada do Hibernate, o que for. Múltiplas instruções separadas por `;` são todas formatadas.

  2. 2

    Escolha o dialeto e o estilo

    O dialeto controla a lista de palavras-chave; o estilo controla a colocação da vírgula (inicial vs final), largura da indentação e palavras-chave em maiúsculas/minúsculas.

  3. 3

    Tokens são analisados, não substituídos por regex

    Um tokenizador lida corretamente com strings, comentários, parênteses e subconsultas. Literais de string são preservados verbatim.

  4. 4

    Copie a saída formatada

    SQL validado, mesma semântica, layout mais limpo.

Antes e depois

Antes:

SELECT u.id,u.name,COUNT(o.id) AS orders FROM users u LEFT JOIN orders o ON o.user_id=u.id WHERE u.created_at>='2024-01-01' GROUP BY u.id,u.name HAVING COUNT(o.id)>5 ORDER BY orders DESC LIMIT 50;

Depois (vírgula inicial, palavras-chave em maiúsculas, indentação de 2 espaços):

SELECT
    u.id
  , u.name
  , COUNT(o.id) AS orders
FROM users u
LEFT JOIN orders o
  ON o.user_id = u.id
WHERE u.created_at >= '2024-01-01'
GROUP BY u.id, u.name
HAVING COUNT(o.id) > 5
ORDER BY orders DESC
LIMIT 50;

Escolhas de estilo que importam

  • Palavras-chave em maiúsculas vs minúsculas. MAIÚSCULAS é tradicional e escaneável. Minúsculas são mais limpas em editores de código modernos com destaque de sintaxe.
  • Vírgulas iniciais vs finais. Inicial ( , col) facilita comentar uma única coluna. Final (col,) é mais natural na leitura do texto.
  • Colocação de vírgula em GROUP BY. Frequentemente uma por linha para cláusulas longas, inline para curtas.
  • Indentação de JOIN. ON na próxima linha (indentação suspensa) vs na mesma linha. Condições longas se beneficiam da indentação suspensa.
  • Subconsultas. Indente toda a subconsulta, não apenas o parêntese de abertura.

Armadilhas específicas do dialeto

  • Backticks do MySQL vs aspas duplas do PostgreSQL para identificadores.
  • CTEs WITH, MS SQL tem um requisito de ; antes de WITH; o formatador lida com isso.
  • Funções de janela, cláusulas longas OVER (...) se beneficiam de PARTITION BY e ORDER BY quebrados em linha.
  • BigQuery tem ARRAY_AGG, STRUCT e sufixos de tabela (*_yyyymmdd) que o tokenizador não deve quebrar.
  • Oracle tem a sintaxe de junção externa (+), o formatador a preserva, mas a sinaliza como legado.

O que o formatador não faz

  • Corrigir bugs, um JOIN inválido permanece inválido.
  • Expandir SELECT *, listas de colunas não são inferidas a partir do esquema.
  • Otimizar consultas, apenas layout, não planos de execução.
  • Reescrever subconsultas como CTEs, uma preocupação diferente.

Perguntas frequentes

Não, é puramente cosmético. Espaços em branco, quebras de linha e colocação de vírgula mudam, mas palavras-chave, operadores, literais e identificadores são preservados exatamente.

Suportado, CREATE TABLE, ALTER, CREATE PROCEDURE, gatilhos. O formatador lida com construções de bloco (BEGIN ... END) e continuações de linha dentro de procedimentos.

Não deveria, se isso acontecer, é provavelmente uma incompatibilidade de dialeto. Tente mudar o dialeto. Por favor, relate falhas persistentes; tratamos como bugs.

Flink SQL e Cassandra CQL parecem semelhantes, mas têm palavras-chave específicas de dialeto que formatadores convencionais distorcem. Use com cautela e verifique se a saída funciona.

Ferramentas relacionadas

Ferramenta disponível em outros idiomas