怎么用
- 选择数据库方言。不同数据库的语法有差别,选对了才能正确识别各自特有的写法。不确定就选 Standard SQL。
- 选择关键字用大写、小写还是保持原样,以及缩进宽度。
- 把 SQL 粘贴到左侧,右侧实时给出格式化结果。可以一次粘贴多条语句,用分号分隔,结果里每条之间空一行。
- 复制结果。如果提示无法解析,检查报出的行列附近是否有没配对的括号或引号,或者换一个方言试试。
格式化做了什么、没做什么
只动空白和关键字
格式化由开源库 sql-formatter 完成:它把 SQL 切成关键字、标识符、字符串、注释等记号,再按子句重新排版。SELECT、FROM、WHERE、GROUP BY 这些子句各占一行,列、条件、排序项逐项缩进,JOIN 跟在表名下面,运算符两边加空格。字符串里的内容一个字符都不会动,所以 'a b -- 不是注释' 这样的字符串保持原样;真正的注释会保留在原来的位置。
关键字大小写不影响表名和列名
「关键字」选项只改 SELECT、FROM 这类保留字,表名、列名、函数里的标识符保持你写的样子。这一点很重要:按 PostgreSQL 文档,不加引号的标识符会被自动转成小写,加了双引号的标识符区分大小写,所以 FOO、foo、"foo" 是同一个名字,而 "Foo" 是另一个。如果格式化工具顺手把标识符的大小写也改了,加引号的名字就会指向别的对象。
为什么要选方言
各数据库都有自己的写法,例如 MySQL 里用反引号括起来的 order、PostgreSQL 的参数 $1 和类型转换 ::int、SQL Server 里用方括号括起来的 [order]。选对方言,这些记号才会被当作一个整体保留;选错了,可能被拆开、插进空格,甚至无法解析。sql-formatter 支持的方言见它的说明文档,本工具提供其中最常用的十几种。
数据留在本地
SQL 里常常有真实的表结构、客户数据甚至连接信息。格式化完全在你的浏览器里进行,不会上传。如果还要贴给 AI 或同事,可以先用本站的脱敏工具把邮箱、手机号和密钥换成占位符。
示例
输入:
select a.id, count(*) as n from users a left join orders o on o.user_id=a.id where a.created_at>='2026-01-01' and o.status in ('paid','shipped') group by a.id having count(*)>2 order by n desc limit 10;选 MySQL、关键字大写、2 个空格缩进,得到:
SELECT
a.id,
count(*) AS n
FROM
users a
LEFT JOIN orders o ON o.user_id = a.id
WHERE
a.created_at >= '2026-01-01'
AND o.status IN ('paid', 'shipped')
GROUP BY
a.id
HAVING
count(*) > 2
ORDER BY
n DESC
LIMIT
10;PostgreSQL 方言下,SELECT $1::int FROM t 中的 $1::int 会被当作一个整体保留,不会在 :: 两边插入空格。
局限
- 按 sql-formatter 的说明,它不支持存储过程,也不支持把语句分隔符从分号改成别的(例如 MySQL 客户端里的 DELIMITER //)。
- 格式化只检查能否切分记号和括号是否配对,不检查语义:表不存在、列名写错、语法在目标数据库里不合法,都不会被发现。
- 只调整排版,不优化查询,也不改变执行计划。
- 非常长的 SQL(几 MB)在手机上可能要等几秒。
常见问题
格式化会改变 SQL 的意思吗?
不会。只调整空白、换行和关键字大小写,字符串、注释和标识符保持不动。
关键字大写会把表名也改成大写吗?
不会。这很重要:在 PostgreSQL 里加了双引号的名字区分大小写,改了就会指向别的对象。
为什么提示无法解析?
通常是括号或引号没配对,或者用了所选方言不认识的写法。换成正确的方言再试。
支持存储过程吗?
不支持,这是 sql-formatter 的已知限制。
我的 SQL 会上传吗?
不会,格式化在浏览器里完成。