ToolAct工具行动

SQL 格式化工具

SQL 输入
格式化输出
行数: 1字符数: 0字节数: 0
行数: 1字符数: 0

什么是 SQL 格式化?

SQL 格式化工具会用一致的缩进、换行和清晰分段整理查询语句。SELECT、JOIN、WHERE、GROUP BY、HAVING、ORDER BY、CTE 和子查询会更容易阅读,方便代码评审、调试、教学和长报表分析。格式化也能帮助更快发现意外笛卡尔积、过于拥挤的条件或括号位置问题。但它不会改变数据库逻辑,不会优化执行计划,不保证 MySQL、PostgreSQL、SQL Server、Oracle 等方言之间完全兼容,也不能让不安全的动态 SQL 变安全。生产环境修改仍需检查参数化、权限、索引、事务、锁和真实查询计划。

如何使用

如何使用

  1. 在左侧输入框中粘贴或输入 SQL 语句
  2. 选择缩进大小(2 spaces、4 spaces 或 Tab)和关键字大小写
  3. 点击「格式化」美化 SQL,或点击「压缩」移除空白
  4. 结果在右侧显示并带有语法高亮
  5. 点击「复制」或「下载」保存结果

SQL 审查注意事项

  • 格式化改善可读性,但不验证权限、索引、执行计划或业务正确性。
  • 运行更改的 SQL 前,请人工复查生成的子句、字符串字面量、注释及数据库特定语法。

使用场景

将密集的 SQL 查询拆分为可审查的子句粘贴一段冗长的 SELECT、JOIN、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT 或 INSERT 语句,格式化工具会将主要子句拆分到独立行并添加缩进。当 ORM 或报表工具生成了一行密密麻麻的代码时,格式化后的结果更便于审查、调试和讲解。
统一关键字大小写以匹配团队或数据库风格选择大写或小写关键字,同时保护字符串字面量、注释和美元引用块不受影响。这可以为迁移文件、仪表板、运维手册和内部文档统一代码片段格式,无需手动查找每一个 SELECT、JOIN、CASE 或聚合函数。由于解析完全在浏览器本地进行,引用内部表名、未发布功能标志或预发布 schema 的查询可以在不经过任何第三方美化器的情况下重新格式化。
审查后压缩 SQL 以便传输使用压缩模式移除块注释、行注释、重复空白以及逗号或括号周围的空格。这在处理 URL 参数、测试数据或紧凑的配置值时很方便,但应在确认可读版本的含义无误后再进行压缩。
为 CTE 和子查询添加嵌套缩进带 WITH 子句的公共表表达式和关联子查询会获得额外的缩进层级,使外层 SELECT、内层 SELECT 和 UNION 块在视觉上保持分离。这使得递归 CTE 链和 EXISTS 子查询在代码审查时更易追踪。方言检测在这里很重要:PostgreSQL 支持 DISTINCT ON (col),MySQL 使用反引号标识符和 IFNULL,SQL Server 使用方括号引用的 [table] 和 TOP n 而非 LIMIT,Oracle 使用 DUAL 和 RNUM;格式化工具会对主要关键字(SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY)进行一致对齐,但方言特定的令牌列表需要使用者自行验证。
在上线前发现意外的笛卡尔积对包含逗号分隔 FROM 子句的多表 SELECT 进行格式化,可以清楚地看到 JOIN ... ON 条件何时缺失。展开的布局会暴露裸表列表,在生产环境中突然出现行数倍增的情况。注意参数的写法:MySQL 预处理语句和许多 ORM 使用问号占位符,PostgreSQL 绑定参数使用 $1、$2 编号,Oracle 和 SQL*Plus 使用冒号命名绑定;格式化工具会保护这些令牌不被当作标识符处理,但关键字大小写仍需匹配团队选定的风格(迁移用大写,代码审查用小写以提高可读性)。

技术原理

SQL 格式化是一个三阶段流程:分词器将原始文本扫描为标记流(关键字、标识符、字面量、运算符、注释、空白),解析器按子句结构对这些标记进行分组,打印器遍历结果并根据样式策略输出换行、缩进和大小写。分词器必须具备方言感知能力,因为字符串和标识符的分隔符各不相同:ANSI SQL 使用双引号标识符和单引号字符串,MySQL 使用反引号标识符,SQL Server 使用方括号,PostgreSQL 还增加了美元引用块($$...$$ 或 $tag$...$tag$),其中所有内部字符(包括引号)都会被转义。

打印阶段对每个子句应用一条规则: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 在代码评审时几乎无法阅读。