SQL 格式化器

粘贴从日志或 ORM 中复制的一行SQL语句后,格式化工具会将其拆分为带有统一关键词大小写、在SELECT、FROM、WHERE、GROUP BY前添加换行符以及投影中对齐列的缩进子句。支持MySQL、PostgreSQL、SQLServer、Oracle、SQLite和BigQuery等数据库方言,各方言的关键词及保留字略有差异。

格式设置的工作原理

  1. 1

    粘贴您的 SQL 语句

    单行数据块、Hibernate生成的精简输出结果等。所有由 `;` 分隔的多条语句均已完成格式化。

  2. 2

    选择方言和风格

    方言控制关键词列表;样式控制逗号位置(前置或后置)、缩进宽度以及大写/小写字母关键词的使用。

  3. 3

    令牌被解析,而非用正则表达式替换

    分词器能正确处理字符串、注释、括号及子查询。字符串字面值均保持原样。

  4. 4

    复制格式化的输出

    经过验证的SQL语句,具有相同的语义,且格式更整洁。

之前与之后

之前:

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;

(使用前逗号、大写关键词及两倍缩进):

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;

关键样式选择

  • 大写与小写字母的关键词。 大写字母更传统且易于扫描;小写字母在具备语法高亮功能的现代代码编辑器中更为美观。
  • 前导逗号与后置逗号的区别。 前导逗号( , col)便于对单列进行注释;后置逗号(col,)在文本中读起来更为自然。
  • GROUP BY中的逗号使用规范:长语句通常每行一个逗号,短语则采用内联格式。
  • JOIN 缩进。 将 ON 置于下一行(悬挂缩进)还是同一行:较长的条件更适合采用悬挂缩进。
  • 子查询。 需缩进整个子查询,而不仅仅是开头的括号部分。

不同方言特有的陷阱

  • MySQL 使用反引号,而 PostgreSQL 使用双引号来标识标识符。
  • WITH CTEs,MS SQL 在要求 WITH 之前还需满足 ;;格式化器可处理该要求。
  • 窗口函数,较长的OVER (...)子句可从采用换行格式的PARTITION BY和ORDER BY中获益。
  • BigQuery 中包含 ARRAY_AGG、STRUCT 以及表格后缀(*_yyyymmdd),分词器不得破坏这些格式。
  • Oracle 支持 (+) 外连接语法,格式化工具会保留该语法,但将其标记为旧版语法。

格式化器未执行的操作

  • 修复漏洞:无效的 JOIN 操作将始终保持无效状态。
  • 展开 SELECT *,列列表并非根据数据模式推导得出。
  • 优化查询,仅优化查询结构,不涉及执行计划。
  • 将子查询重写为CTE,这属于另一个问题。

常见问题

不,这纯粹是外观上的调整。空白、换行符和逗号的位置可能会有所变动,但关键词、运算符、字面量及标识符均保持完全一致。

支持的触发器包括:CREATE TABLE、ALTER、CREATE PROCEDURE。格式化器可处理过程内的块结构(BEGIN ... END)及行延续内容。

不应出现此问题,若确实发生,则很可能是方言不匹配所致。请尝试更换方言。如遇到持续故障,请报告;我们将将其视为错误。

Flink SQL与Cassandra CQL 界面相似,但存在特定方言专用的关键词,主流格式化工具常会将其扭曲。使用时需谨慎,并验证输出结果是否正确运行。

相关工具

此工具还提供其他语言版本