开发编码 本地计算 开箱即用 内置示例 不留痕迹

SQL 格式化与压缩工具

格式化:`SELECT` / `FROM` / `WHERE` / `GROUP BY` / `JOIN` 等主要子句各自换行,SELECT 列表按列缩进,子查询括号内整体缩进一层,`AND` / `OR` 逐行列出,关键字大小写可选大写、小写或保持原样;压缩:去掉注释与多余空白,把整段 SQL 压成单行。

SQL 格式化把挤在一行的语句整理成可读结构:主要子句各自换行、SELECT 列表逐列缩进、子查询整体缩进一层、AND 与 OR 分行列出;反向的压缩则去掉多余空白与注释,便于放进配置文件或日志。团队协作与排查线上慢查询时,能快速读懂一条语句的价值很高。

两点预期需要提前说明:本工具按关键字表重排空白,不建语法树,因此不会校验括号是否配对、表名是否存在,也不会因方言差异报错 —— 好处是 MySQL、PostgreSQL、Oracle 的常见写法都能处理;其次,压缩会删除注释(行注释会把后续内容整段吞掉),需要保留注释时请改用格式化。

使用步骤

  1. 粘贴 SQL 语句,选择格式化或压缩。
  2. 关键字大小写可选大写、小写或保持原样;缩进宽度按团队规范选择。
  3. 格式化后核对:含 SELECT 的子查询是否换行缩进、注释是否仍在原处。
  4. 要放进配置或日志时用压缩;压缩前确认语句里没有需要保留的注释。

计算原理与示例

这是排版工具,不是 SQL 解析器

本工具按关键字表与 token 规则重排空白,不建语法树:它不会检查括号是否配对、表名是否存在,也不会因为写错关键字而报错。这样做的好处在稳定——不管你的 SQL 属于 MySQL、PostgreSQL 还是 Oracle 方言,排版结果都可预期,不会出现「解析器认不出方言就整段原样输出」的情况。

子查询与函数括号的区别

括号是否换行缩进,取决于括号内有没有 `SELECT`:`IN (SELECT ...)` 这种子查询会换行并缩进一层,方便看清嵌套层次;而 `COUNT(*)`、`IN (1, 2, 3)` 这类函数或列表括号保持在同一行,避免把一行短表达式拆成七零八落。

压缩为什么先删注释

行注释 `-- xxx` 会一直延伸到行尾,压缩成单行时必须先删掉它,否则它会把后面所有内容都注释掉;块注释 `/* */` 同理。因此压缩默认删除注释,需要保留时请用格式化而不是压缩,或选择保留注释的选项。

代码示例

SQL 格式化前后的对照

-- 格式化前
select u.id,u.name,count(o.id) as cnt from users u left join orders o on o.user_id=u.id where u.status=1 and o.created_at>='2026-01-01' group by u.id,u.name order by cnt desc limit 10;

-- 格式化后
SELECT
  u.id,
  u.name,
  COUNT(o.id) AS cnt
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE u.status = 1
  AND o.created_at >= '2026-01-01'
GROUP BY u.id, u.name
ORDER BY cnt DESC
LIMIT 10;

SQL 配套:确认索引有没有走上

-- MySQL:看执行计划,重点看 type 与 key
EXPLAIN SELECT * FROM orders WHERE user_id = 100 AND status = 1;

-- PostgreSQL
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 100;

-- 提示:把格式化后的 SQL 存进团队文档,比截图更便于检索与 review

常见问题

格式化会不会改变 SQL 的执行语义?

不会。工具只挪动空白和调整关键字大小写,字符串、数字、标识符的内容原样保留,也不会增删分号。唯一的实质变化是压缩模式下会删除注释——注释不影响执行,但会影响你后续阅读。

支持 MySQL / PostgreSQL / Oracle 各种方言吗?

排版层面通吃:工具不认识方言语义,只按通用关键字表排版,所以 `LIMIT`、`RETURNING`、`::` 类型转换、反引号与方括号标识符都能正常识别。如果某个少见关键字没被大写,说明它不在关键字表里,属于显示差异而非错误。

我想保持关键字原来的大小写,可以吗?

可以,把「关键字大小写」选成「保持原样」即可。这一项的取值分别为原样保留、统一大写、统一小写,只作用于关键字表里的词,不会动表名、字段名与字符串内容。

格式化后注释的位置还在原处吗?

行注释与块注释会被保留并各自独占一行(或保持原来的多行形态),但不会自动跟着它注释的那段代码缩进。如果注释在压缩模式下被删除了,请改用格式化模式。

压缩会把两条语句粘在一起吗?

不会。分号是语句边界,压缩后依然保留;像 `SELECT a FROM t` 这类相邻的词之间也会保证至少一个空格,不会出现 `SELECTa` 这种粘连。压缩只去掉多余的空白与注释。

为什么子查询被缩进了,函数括号却没有?

换行缩进的判据是「括号内是否出现 SELECT」——子查询换行是为了看清嵌套层级;函数调用和 IN 列表保持一行,是因为它们通常很短,拆开反而更难读。这个判断是逐括号做的,多层嵌套会逐层缩进。

字符串里出现 SELECT 会被改成大写吗?

不会。单引号字符串、双引号与反引号标识符都会作为一个整体 token 跳过关键字处理,所以 `SELECT 'select me'` 这种写法里,引号内的内容保持原样,只有真正的关键字会被转换大小写。

SQL 内容会上传到服务器吗?

不会。切词与排版全部在浏览器内完成,没有任何网络请求,服务端拿不到你的表结构或 SQL 语句;本工具不写计算历史,关闭页面即清除。

延伸阅读

来自本站原创文章,讲清这个工具背后的算法与口径。