SQL 格式化工具怎么用
- 粘贴一条语句或整个脚本——用分号分隔的多条语句也可以。从慢查询日志、MyBatis 日志或 ORM 输出里复制的长长一行 SQL 最适合拿来格式化。
- 在数据库方言里选择你的数据库(默认 MySQL),让工具按它的引号规则读取(见下表),再选择关键字写成大写、小写还是保持原样。
- 选格式化得到每个子句一行、用 2 个空格、4 个空格或制表符缩进的结果,或选压缩成一行,把每条语句压到一行里,方便放进日志、配置文件或代码字符串。
- 点击结果旁的复制,或点下载保存为 .sql 文件。
排版规则
工具把 SQL 拆成一个个记号——关键字、名称、字符串、数字、运算符、注释——再按几条固定规则排版:
- 主要子句另起一行:
SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY、SET、VALUES和RETURNING单独占一行,内容缩进写在下面;LIMIT、UNION、INSERT INTO、UPDATE、DELETE FROM、WITH和CREATE TABLE的内容留在同一行。 - 列表每项一行:
SELECT的字段、VALUES的各行、SET的赋值、CREATE TABLE的列定义和WITH的公共表表达式。函数调用和IN (…)里的逗号留在同一行。 - JOIN 写在
FROM下面,ON跟在同一行;WHERE、HAVING和连接条件里的每个AND、OR另起一行——BETWEEN … AND …里的AND除外。 - 子查询逐层缩进:括号里是
SELECT时多缩进一级,右括号单独一行。CASE的每个WHEN、ELSE各占一行,END与CASE对齐。 - 多条语句之间空一行。
不会改动的内容
字符串(包括 '广东' 这样的中文)、带引号的名称(`order`、"Order"、[Order Date])、数字、注释和 PostgreSQL 的美元符号引用体都按原样复制。只有 SQL 关键字会改变大小写,内置函数名(如 COUNT(、IFNULL()只在后面紧跟括号时才改。表名和字段名保持你的写法;一些在某些数据库里是关键字、但常被当作字段名的词——date、name、status、type、value、timestamp——也保持原样。点号后面的名称(如 t.order)一律当作名称处理。除了空白,什么都不增删,所以格式化后的语句查询结果完全相同。
计算示例
输入框里的示例是一条写在一行里的统计查询,带有注释、CASE 表达式、两部分的连接条件、IN 列表和 HAVING 子句。按默认设置(MySQL、关键字大写、2 个空格)格式化后:
-- 今年消费最多的客户
SELECT
c.id,
c.name,
COUNT(o.id) AS order_count,
SUM(o.total) AS spent,
CASE
WHEN SUM(o.total) > 10000 THEN '金牌'
ELSE '普通'
END AS tier
FROM
customers c
LEFT JOIN orders o ON o.customer_id = c.id
AND o.status <> 'cancelled'
WHERE
o.created_at >= '2026-01-01'
AND c.province IN ('广东', '浙江')
GROUP BY
c.id,
c.name
HAVING
COUNT(o.id) > 2
ORDER BY
spent DESC
LIMIT 10;
注释保持在单独一行,中文字符串保留引号,c、o、spent 这些标识符保持原来的大小写,结果共 25 行。带反引号的 MySQL 分页查询是这样的:
SELECT `id`, `nick_name` FROM `t_user` WHERE `nick_name` LIKE '%张%' LIMIT 20, 10
子查询和公共表表达式(MySQL 8.0 起支持 WITH):
WITH recent AS (
SELECT
user_id
FROM
t_order
WHERE
created_at > NOW() - INTERVAL 30 day
)
SELECT
nick_name
FROM
t_user
WHERE
id IN (
SELECT
user_id
FROM
recent
)
方言:选择会影响什么
每种数据库的 SQL 写法略有不同,主要区别在引号。方言只告诉工具怎样读取文本——它不会把你的 SQL 改写成另一种数据库的语法。
| 方言 | 读取方式的差别 |
|---|---|
| MySQL / MariaDB(默认) | "文本" 也是字符串,反斜杠是转义符('It\'s'),`名称`,# 注释;-- 后面跟空格时才是注释 |
| 标准 SQL | '文本',里面的单引号写成 '';"名称";-- 注释 和 /* 注释 */ |
| PostgreSQL | $$ … $$ 和 $tag$ … $tag$ 整段保留,带反斜杠转义的 E'…' 字符串,嵌套的 /* /* */ */ 注释,:: 类型转换,$1 参数 |
| SQL Server(T-SQL) | [名称](里面用 ]] 表示 ]),N'文本',@变量,#临时表,嵌套注释,单独一行的 GO 作为批处理分隔符 |
| Oracle(PL/SQL) | q'[It's]' 替代引号写法,:bind 绑定变量 |
| SQLite | 除了 "名称",还接受 [名称] 和 `名称`;?、?1、:name、@name、$name 参数 |
这个区别很重要:'It\'s' 在 MySQL 里是一个完整的字符串,但在标准 SQL 里反斜杠只是普通字符,字符串在第二个引号处就结束了,第三个引号开始了一个永远不会闭合的字符串。方言选错时,你可能会看到“字符串没有闭合”。达梦、人大金仓等国产数据库的语法大多兼容 Oracle 或 PostgreSQL,可以选对应的方言。
会报告的错误
这个工具不是完整的 SQL 解析器,不检查语句对你的数据库是否有效。它只在无法确定记号在哪里结束时停下:没有闭合的字符串、带引号的名称、注释或美元符号引用体,不成对的括号,以及从 Word 或聊天软件里粘贴过来的弯引号(‘ ’ “ ”)。每种错误都会显示行号、列号,并用 ^ 标出位置。
限制与小技巧
- 过程化代码——存储过程、PL/pgSQL、T-SQL 的
BEGIN … END块、PL/SQL 包——按普通语句排版;PostgreSQL 函数体放在$$里时完全按原样保留。 - MyBatis 的占位符
#{id}、${table}和动态 SQL 标签不是 SQL 语法,建议先复制日志里实际执行的语句再格式化;映射文件本身可以用 XML 格式化整理。 - 长列表(
IN (…)里的值、长函数调用)保持在一行。 - 压缩成一行时会保留
--注释,所以每条注释后面仍会换行;语句的其他部分都在一行里。 - 查询结果是 JSON 时,可以用 JSON 格式化查看,或用 JSON 转 CSV 导出成表格。
SQL 不会离开你的设备
格式化在你的浏览器里完成。SQL 语句常常暴露表结构、字段名和写在条件里的客户数据,这些内容都不会被上传或记录,也不会被保存:刷新页面就会清空。
常见问题
格式化会改变 SQL 的执行结果吗?
不会。只改变空白和关键字的大小写,而 SQL 关键字不区分大小写。字符串、带引号的名称、数字和注释都原样复制,所以查询返回的行完全一样。
应该选哪种方言?
选语句实际运行的数据库,国内项目大多是 MySQL,所以默认就是它。方言只影响引号、反斜杠和注释的读取方式;如果语句里没有上表中的特殊写法,选哪种方言结果都一样。
为什么 date、name 这样的词没有变成大写?
date、name、status、type、value、timestamp 这些词在某些数据库里是关键字,但也是非常常见的字段名,所以保持你的写法。count、date 这样的函数名只有后面跟着括号时才会变成大写。
能帮我修正 SQL 语法错误吗?
它能找出没有闭合的字符串、注释和带引号的名称、不成对的括号和中文弯引号,并标出位置。其他错误,比如关键字拼错、少了逗号,会按原样格式化——这些要由数据库报告。
我的 SQL 会被上传吗?
不会。格式化工具以 JavaScript 在你的浏览器里运行,语句不会离开你的设备,页面加载后断网也能使用。
最后更新:2026年10月16日