SQL 格式化

粘贴压缩的 SQL 查询即可得到缩进清晰、易读的结果。可选择方言、缩进宽度与关键字大小写,全部在浏览器本地完成。

把一整墙 SQL 变回能读的样子。 粘贴查询——一行或一千行都行——输入即重新排版。先选对方言,避免方言特有语法被破坏,再挑选团队使用的缩进方式和关键字大小写。

为别人能读懂而格式化 SQL

方言选择器为什么重要

SQL 之所以称为标准,大致相当于英语拼写称为标准。每个引擎都实现公共核心,然后各自添加别家没有的语法;如果格式化器不知道你的目标引擎,它要么会误解这些语法,要么就静默地原样跳过不做处理。

这些差异并不冷僻。仅标识符引用方式就已经分家:MySQL 用反引号,PostgreSQL 和标准 SQL 用双引号,SQL Server 用方括号。假设了错误约定的格式化器,可能把带引号的标识符当成字符串字面量,并围绕一个根本不存在的边界重新折行。除引用方式外,还有 LIMITTOPFETCH FIRST 之别、PostgreSQL 的 :: 转换运算符、T-SQL 中以 @ 开头的变量、BigQuery 用反引号包裹的项目路径,以及 Snowflake 的 QUALIFY 子句。选对方言,才能让这些保持完整。

缩进其实是一个 diff 决策

缩进宽度和关键字大小写看似只是外观,实际上决定了你的版本历史长什么样。格式化只有在保持一致时才有价值——一旦两个人对同一个文件用了不同的格式,每次提交都会夹带一片无关的空白改动,代码评审就此失效。选定一套配置,写进仓库,然后机械地执行。

关键字全大写是最常见的约定,在阅读密集查询时很有帮助,因为结构性词汇能与表名列名在视觉上分开。近年在把 SQL 当作普通代码、不喜欢"喊话"风格的代码库里,全小写也逐渐流行。而当你要格式化别人的查询、希望只调整排版而不改动其一个字符时,"保持原样"是正确选择——这样产生的 diff 是纯结构性的。

制表符与空格之争照旧,但 SQL 场景有个特有的细节:查询经常被粘进终端、工单系统和聊天工具,而这些地方常把制表符渲染成八列宽。用制表符缩进的深层嵌套查询,恰恰会在你最可能分享它的场合折行成一团乱麻。

格式化不会做的事

格式化纯粹是呈现层面的。它不会让查询变快,也不会改变优化器生成的执行计划。一个缩进优美的关联子查询,仍然是每行执行一次。性能问题请用 EXPLAIN,格式化只负责可读性。

它同样不做校验。本工具的解析足以重排文本,但它不是数据库引擎的解析器,一条列名拼错或缺少连接条件的查询,它照样会格式化得漂漂亮亮。排版整洁不等于语法正确,唯一有权判定查询是否有效的,是你打算执行它的那个数据库。

有一个值得与格式化一起养成的习惯是参数化。把值直接拼进字符串的查询,格式化之后只是让注入风险变得更易读,风险本身分毫未减。如果你发现自己正在格式化一段把用户输入直接拼接进文本的 SQL,那么首先需要修的显然不是格式。

开源说明:格式化由 sql-formatter 提供,遵循 MIT 许可证。

常见问题

支持哪些 SQL 方言?
共 14 种:标准 SQL、MySQL、MariaDB、PostgreSQL、SQLite、SQL Server (T-SQL)、Oracle PL/SQL、IBM Db2、BigQuery、Snowflake、Redshift、Hive、Spark SQL 和 Trino。选对方言才能保住标识符引用、类型转换运算符等特有语法。
格式化会改变查询的行为吗?
不会。只有空白、换行和关键字大小写发生变化,语义完全相同。关键字大小写之所以安全,是因为 SQL 关键字本身大小写不敏感;你的标识符和字符串字面量绝不会被改写大小写。
格式化能让查询跑得更快吗?
不能。格式化只影响呈现,优化器看到的是同一条语句。要优化性能,请在真实数据库上执行 EXPLAIN 或 EXPLAIN ANALYZE 并查看执行计划。
我的 SQL 会被发送到服务器吗?
不会。sql-formatter 完全在浏览器中运行,不传输任何内容。这一点在这里尤其重要,因为真实查询常常包含表名、库表结构细节,有时还有来自生产环境的字面值。
为什么我的查询格式化失败?
通常是引号或括号不配对,或者用错方言解析了方言特有语法。请先把方言选择器切换到与你的数据库一致;如果仍然失败,检查是否有未闭合的字符串字面量。
该用制表符还是空格?
都行,只要全团队统一。空格在任何地方渲染都一致,把查询粘进终端、工单或聊天工具时更省心;制表符则让每位读者在编辑器里自选宽度。