SQL 格式化美化工具 — 11 种方言,压缩,高亮
把杂乱的 SQL 格式化为可读、缩进一致的查询,支持 PostgreSQL、MySQL、T-SQL、BigQuery 等。在浏览器中运行。
发现问题,或者觉得哪里可以更好?每条消息我们都会阅读,并尽快修复。
这款免费的 SQL 格式化工具可以把从日志、ORM 或单行迁移脚本中粘贴来的查询变成可读的 SQL:每个子句一行,缩进一致,关键字按你选择的大小写。选择你的数据库方言,PostgreSQL 的 :: 类型转换和 $$ 函数体、MySQL 的反引号、T-SQL 的 [方括号] 和 @变量,以及 BigQuery 和 Snowflake 的 QUALIFY 子句等语法就能被正确理解,而不会被弄乱。
格式化只改变空白,以及关键字、数据类型和函数名的大小写。字符串字面量、带引号的标识符和注释会原样保留。格式化工具需要先解析你的 SQL 才能排版,所以模板化的 SQL(dbt 或 Jinja 的 {{ }} 块)和某些厂商特有的语句可能会失败;出现这种情况时,它会告诉你在哪一行哪一列停了下来。“压缩”则反其道而行:压成一行,删除注释,保留 /*+ INDEX(...) */ 之类的优化器提示。
使用方法
- 把一条或多条 SQL 语句粘贴到输入框中。初始已载入一条示例查询,方便你先看看效果。
- 选择你的数据库所用的方言。这对引号、参数和厂商特有语法影响最大。
- 设置关键字大小写、缩进以及语句之间的空行数。修改时输出会实时更新。
- 如果需要把查询放在一行中,例如放进 JSON 配置或 Shell 命令,请切换到“压缩”。
- 复制结果,或下载为 .sql 文件。
常见问题
格式化会改变 SQL 查询的执行结果吗?
不会。格式化工具只改变空白,以及关键字、数据类型和函数的字母大小写,而 SQL 数据库对这些不区分大小写。字符串值、带引号的标识符("Column"、`col`、[col])和注释都会原样复制,所以查询返回的结果相同。表名和列名不会改变大小写,只有一个例外:在所选方言中同时也是关键字的未加引号名称(例如名为 month 的别名)会跟随关键字的大小写。在大多数数据库中,未加引号的名称不区分大小写,所以这很少有影响;但 MySQL 的表名在 Linux 上可能区分大小写,选择“保持原样”即可让文本完全保持你写的样子。
应该选择哪种 SQL 方言?
你的数据库所运行的那一种。标准 SQL 适用于简单的 SELECT、INSERT 和 UPDATE 语句,但它不认识 PostgreSQL 的 :: 类型转换和 $1 参数、MySQL 的反引号标识符和 # 注释、T-SQL 的方括号、@变量和 TOP、Oracle PL/SQL 代码块,以及 BigQuery 和 Snowflake 中的 QUALIFY 子句。如果格式化时出现解析错误,首先要尝试的就是选对方言。
为什么格式化工具提示“Parse error”(解析错误)?
它遇到了在所选方言中不该出现的标记。常见原因有:方言不匹配、括号或引号未闭合、dbt 中 {{ ref("orders") }} 之类的模板占位符,或者解析器不支持的过程化代码。状态行会显示行号和列号,下方的框会指向出错的字符,通常足以找到问题所在。
SQL 关键字应该大写吗?
这是惯例,不是规则。大写关键字(SELECT、FROM、WHERE)能让结构从表名和列名中凸显出来,也是文档和风格指南中最常见的写法。许多使用 dbt 或带语法高亮的现代编辑器的团队更喜欢小写。选定一种并处处统一即可;本工具可以双向转换,也可以保持你原来的写法。
压缩 SQL 安全吗?
对查询本身而言是安全的:压缩会合并空白并删除 -- 和 /* */ 注释,绝不会触碰字符串内部。优化器提示(/*+ ... */)和 MySQL 版本注释(/*! ... */)会被保留,因为它们会改变执行行为。代价是可读性,所以只在传输时(JSON 配置、环境变量、日志行)压缩,代码仓库中保留格式化后的版本。
我的 SQL 会被发送到服务器吗?
不会。格式化库会下载到你的浏览器并在其中运行。表名、列名以及 WHERE 子句中的任何数据都不会离开你的电脑。
会让格式化工具出错的方言差异
• 标识符引号:标准 SQL 和 PostgreSQL 使用 "双引号",MySQL 和 MariaDB 使用 `反引号`,SQL Server 使用 [方括号]。方言设置错误时,格式化工具可能会把带引号的名称当作字符串或运算符。
• 参数:PostgreSQL 使用 $1、$2;MySQL 和 SQLite 使用 ?;SQL Server 使用 @name;Oracle 使用 :name。这些都会原样保留。
• 类型转换和运算符:PostgreSQL 有 value::type、JSON 运算符 -> 和 ->>,以及 ILIKE。BigQuery 和 Snowflake 有用于筛选窗口函数的 QUALIFY。Spark 和 Hive 有 LATERAL VIEW。
• 字符串和函数体:PostgreSQL 的函数体常用 $$ ... $$ 包裹(美元符号引用),转义字符串使用 E'...'。其中的所有内容都被视为一个字符串,原样保留。
• 注释:-- 和 /* */ 在所有方言中都有效;# 只在 MySQL 和 MariaDB 中表示注释。在 T-SQL 中,#name 是临时表。
可读 SQL 风格的五条规则
已发布的 SQL 风格指南在逗号放在行首还是行尾等细节上各有不同,但大多认同几条排版规则,本格式化工具默认就会应用它们:
• 每个主要子句占一行:SELECT、FROM、JOIN、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT。
• 每个选取的列占一行,这样差异比较能准确显示哪一列发生了变化。
• 在 WHERE 和 ON 中,AND 或 OR 之后的条件各占一行。
• 子查询和 CTE 主体比其父级多缩进一级。
• 脚本中的语句之间空一行,让每条语句都成为一个整体。
格式化工具做不到的是起个好名字。请使用有意义的表别名(orders o 可以,t1 不行),并用 AS 给计算列起一个明确的名称。
相关免费工具
- JSON 格式化 — 格式化、压缩和校验 JSON,解析错误精确到行和列。在浏览器中运行,无需上传。
- JSON 转 TypeScript — 粘贴 JSON 示例,即可得到 TypeScript 接口、Zod 模式、JSON Schema,或 Go、Python、Java、C#、Kotlin、Swift 和 Rust 的类型定义。
- YAML 验证器 — 验证 YAML,精确给出每个错误的行号和列号,并揪出解析器会默默接受的错误:yes/no 布尔值、制表符、重复键。
- 正则表达式测试 — 用示例文本测试正则表达式,实时高亮匹配结果,显示捕获组并预览替换效果。免费,在浏览器中运行。
- 文本对比(Diff) — 比较文本、代码或 JSON 文件的两个版本,准确看出哪些行、词和字符发生了变化。