SQL 格式化工具
什么是 SQL 格式化?
SQL 格式化工具会用一致的缩进、换行和清晰分段整理查询语句。SELECT、JOIN、WHERE、GROUP BY、HAVING、ORDER BY、CTE 和子查询会更容易阅读,方便代码评审、调试、教学和长报表分析。格式化也能帮助更快发现意外笛卡尔积、过于拥挤的条件或括号位置问题。但它不会改变数据库逻辑,不会优化执行计划,不保证 MySQL、PostgreSQL、SQL Server、Oracle 等方言之间完全兼容,也不能让不安全的动态 SQL 变安全。生产环境修改仍需检查参数化、权限、索引、事务、锁和真实查询计划。
如何使用
如何使用
- 在左侧输入框中粘贴或输入 SQL 语句
- 选择缩进大小(2 spaces、4 spaces 或 Tab)和关键字大小写
- 点击「格式化」美化 SQL,或点击「压缩」移除空白
- 结果在右侧显示并带有语法高亮
- 点击「复制」或「下载」保存结果
SQL 审查注意事项
- 格式化改善可读性,但不验证权限、索引、执行计划或业务正确性。
- 运行更改的 SQL 前,请人工复查生成的子句、字符串字面量、注释及数据库特定语法。
使用场景
技术原理
打印阶段对每个子句应用一条规则:SELECT / FROM / WHERE / GROUP BY / HAVING / ORDER BY / LIMIT 各自在第 0 列开始新行,投影列和 ON 条件缩进一级(2 个空格、4 个空格或一个制表符),JOIN 关键字(INNER / LEFT / RIGHT / FULL / CROSS)对齐在 FROM 下方,CASE / WHEN / THEN / ELSE / END 垂直堆叠,括号内的子查询和 WITH 中的 CTE 获得额外一级缩进,使外层 SELECT 保持视觉锚定。字符串字面量、行注释(-- ...)、块注释(/* ... */)和美元引用块只分词一次,原样复制输出,内部间距不会被修改。
关键字大小写在打印时应用,而不是通过对源码进行盲目正则替换——只有被分类为 RESERVED_KEYWORD 的标记才会被转换为大写或小写,因此反引号内的 'order' 或 'user' 这类标识符会保持原始大小写。方言支持很重要,因为不同引擎的保留字列表不同:PostgreSQL 支持 DISTINCT ON、RETURNING、ILIKE;MySQL 增加了 IFNULL、LIMIT n,m、ENGINE=;SQL Server 使用 TOP n、OUTPUT、方括号标识符;Oracle 增加了 DUAL、ROWNUM、用 MINUS 代替 EXCEPT;BigQuery 和 Snowflake 通过 QUALIFY、EXCEPT(列)和数组/结构字面量扩展了标准。性能与源码长度成线性关系(O(n) 个标记,O(n) 个输出字节),即使是数兆字节的迁移脚本也能在毫秒级完成格式化。
- 分词器:将源码扫描为 RESERVED_KEYWORD、IDENTIFIER、STRING_LITERAL、NUMBER、OPERATOR、LINE_COMMENT(-- ...)、BLOCK_COMMENT(/* ... */)和 WHITESPACE 类别;注释和字符串原样保留
- 方言感知:单引号字符串(ANSI)、反引号标识符(MySQL)、方括号标识符(SQL Server)、双引号标识符(PostgreSQL/标准)、美元引用块 $$...$$(PostgreSQL)
- 子句布局:SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT 各自在第 0 列锚定;投影列和 ON 条件缩进一级;JOIN 关键字对齐在 FROM 下方
- CTE 和子查询缩进:WITH 子句将内层 SELECT 额外缩进一级;EXISTS / IN / 标量上下文中的关联子查询获得独立缩进,使外层查询保持锚定
- 大小写策略:在打印时按标记类别应用——只有 RESERVED_KEYWORD 标记会被转换为大写或小写,因此 `order` 或 [user] 等标识符保持原始大小写
- 绑定参数:问号占位符(MySQL 预处理语句)、dollar-1/dollar-2 编号绑定(PostgreSQL)和冒号命名绑定(Oracle/SQL*Plus)被分词为 PARAMETER,不会被重新格式化为标识符
- 复杂度:O(n) 词法分析和 O(n) 打印,其中 n = 源码长度——数兆字节的迁移脚本在毫秒级完成格式化;与 sql-formatter npm 库、pgFormatter 和 Prettier SQL 插件性能相当
示例
格式化带 JOIN 和 WHERE 的紧凑 SELECT
输入:select u.id,u.name,o.total from users u left join orders o on o.user_id=u.id where u.status='active' and o.created_at>='2026-01-01' order by o.total desc limit 10;
输出:
SELECT u.id, u.name, o.total
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE u.status = 'active'
AND o.created_at >= '2026-01-01'
ORDER BY o.total DESC
LIMIT 10;压缩格式化后的 SQL 用于配置字符串
输入(已格式化,6 行):
SELECT id, name
FROM products
WHERE price < 100
AND stock > 0
ORDER BY name;
压缩输出(1 行,78 字符):
SELECT id,name FROM products WHERE price<100 AND stock>0 ORDER BY name;WITH (CTE) + 嵌套子查询的格式化
WITH recent_orders AS (
SELECT user_id, SUM(total) AS spend
FROM orders
WHERE created_at >= NOW() - INTERVAL '30 days'
GROUP BY user_id
)
SELECT u.name, r.spend
FROM users u
JOIN recent_orders r ON r.user_id = u.id
WHERE r.spend > (SELECT AVG(spend) FROM recent_orders);关键字小写(团队风格)
设置:缩进 = 2 空格,关键字 = 小写
输入:SELECT * FROM Users WHERE Status=1;
输出:
select *
from users
where status = 1;
用途:匹配 Ruby on Rails / Django ORM 风格的迁移文件常见问题
支持哪些 SQL 方言?
标准 ANSI SQL 以及常见方言关键字:MySQL、PostgreSQL、MSSQL/T-SQL、SQLite、Oracle、BigQuery、Snowflake。请从下拉菜单选择目标方言,让格式化工具识别该方言特有的关键字(如 LIMIT vs TOP、RETURNING、MERGE 等)。
提供哪些样式选项?
关键字大小写、缩进字符数、列名前置或后置逗号、最大换行长度,以及在关键字前还是后换行。这些选项通常显示在页面侧栏。
它会校验 SQL 吗?
大多数格式化工具采用宽松解析,对可疑 SQL 原样保留输出。真正的校验需要数据库连接(或至少是 sqlparse、sqlglot 等真实的 SQL 解析器)。本工具仅用于排版;语法检查请用 IDE 或实际数据库。
能格式化存储过程和触发器吗?
大多数版本能处理 CREATE PROCEDURE / CREATE FUNCTION / 触发器,覆盖到方言所支持的范围。包含控制流(IF/ELSE/WHILE)的较长代码也能正确格式化;厂商扩展(如 T-SQL 特有关键字)需要选对方言。
我的查询会被上传吗?
不会。格式化通过浏览器中的 JavaScript SQL 解析器完成,粘贴的 SQL 不会被传输。话虽如此,请勿在任何在线工具中粘贴真实生产凭证或个人隐私数据。
为什么 CTE 和 JOIN 的缩进看起来很奇怪?
不同格式化工具对 CTE 对齐方式没有统一标准。有的对每个 CTE 定义缩进,有的让其顶格。JOIN 同样有多种合理风格('JOIN x ON' vs 'JOIN x\n ON')。选择与团队风格一致的选项,并保持稳定即可。
可以压缩 SQL 吗?
部分版本提供「单行模式」,去除换行和多余空白。适合在代码中以字符串字面量嵌入 SQL。请始终在版本控制中保留格式化后的版本——单行 SQL 在代码评审时几乎无法阅读。