工具
指南

SQL 格式化

格式化

使用 sql-formatter 对多种方言(MySQL、PostgreSQL、T-SQL 等)的 SQL 进行格式化或压缩。

100% 客户端 无后端
SQL
输出
本页内容

什么是 SQL 格式化?#

SQL 格式化器把一条“写给引擎看”的查询——常常挤在一行、或者从日志里粘出来时缩进乱七八糟——改写成“写给人看”的样子。关键字各占一行、列名对齐、子查询往里退一级,一个带五个 AND 条件的 WHERE 子句不再是糊在一起的字墙。反方向的压缩,则把这些空白全压回一行,方便查询通过配置文件或 API 参数传递。

SQL 格式化的麻烦在于:每个数据库都有自己的方言。带 RETURNING 的 Postgres 查询、带反引号标识符的 MySQL 查询、带 TOP (n) 的 SQL Server 查询、带结构和数组字面量的 BigQuery 查询,长得都不一样;一个假装“SQL 全球通用”的格式化器,会在边角情况上悄悄出错。本页通过 sql-formatter 加上显式方言选择来处理这件事:标准 SQL、MySQL、MariaDB、PostgreSQL、SQLite、T-SQL、PL/SQL、BigQuery、Redshift、Snowflake、DB2、Trino——共 12 种。你选你的数据库真正在用的那种,格式化器就按对应语法解析。

怎么用#

  1. 把查询粘进左侧 SQL 框,或点 Sample 加载一段示例。
  2. 在工具栏选 Language(方言)——你数据库的方言。默认 sql 是安全的通用味;用到方言专有语法时再切到 postgresqlmysqltsql 等。
  3. Indent(缩进)24tab。SQL 列表长,4 空格更好读。
  4. 点一个操作按钮:
    • Format —— 重新缩进、按逻辑换行,默认把关键字大写,让 SELECTFROMWHERE 从标识符里跳出来。
    • Minify —— 删 -- 行注释和 /* */ 块注释,然后把所有连续空白折成一个空格。换行变成空格,这对 SQL 是安全的,因为语句以分号结尾、不以换行结尾。
  5. 在右侧 Output 框查看,Copy 复制;Clear 清空两边。

主要特性#

  • 12 种方言。 MySQL、MariaDB、PostgreSQL、SQLite、T-SQL、PL/SQL、BigQuery、Redshift、Snowflake、DB2、Trino,外加通用标准 SQL。格式化器的语法会跟着切换,方言专有关键字也能被正确摆放。
  • 关键字大小写。 Format 默认把关键字大写(selectSELECT),标识符原样不动。纯排版,从不改变查询语义。
  • 安全的压缩。 空白折成单个空格;SQL 以分号结尾,所以并到一行不会像换行敏感的语言那样把两条语句粘成一条。
  • 压缩时删注释。 --/* */ 在压缩时一并删除,让载荷尽量紧。
  • 左右双栏、复制就绪、完全在浏览器端。 格式化器在本地跑,查询不会发到任何地方。

实例演示#

一条报表查询被 dumped 到一行,带注释、带 join、带 GROUP BY

输入:

select u.id,u.name,count(o.id) as orders from users u join orders o on o.user_id=u.id where u.status='active' and o.created_at >= '2026-01-01' group by u.id,u.name order by orders desc

Language 选 postgresql,选 2 空格,点 Format

SELECT
  u.id,
  u.name,
  count(o.id) AS orders
FROM
  users u
  JOIN orders o ON o.user_id = u.id
WHERE
  u.status = 'active'
  AND o.created_at >= '2026-01-01'
GROUP BY
  u.id,
  u.name
ORDER BY
  orders DESC

每个子句各占一行,join 条件清清楚楚,WHERE 的两个谓词被拆开,一眼就能看出日期过滤是 >= 而不是 >。关键字变大写,列名却原样保留。再对同一份输入点 Minify,就拿到单行形式,可以直接塞进配置或 ?query= 参数:

select u.id,u.name,count(o.id) as orders from users u join orders o on o.user_id=u.id where u.status='active' and o.created_at >= '2026-01-01' group by u.id,u.name order by orders desc

常见问题#

我该选哪个方言?#

跟你的数据库对齐。不确定的话,通用 sql 是合理的起点,常见子句都能正确处理。等查询用到了通用语法没料到的写法(RETURNING 属于 Postgres、反引号标识符属于 MySQL、TOP (n) 属于 T-SQL、结构/数组字面量属于 BigQuery)时,再切到对应方言。选错方言通常也能格式化,但可能把某个生僻关键字摆错位置。

为什么 Format 把关键字大写,却不改我的列名?#

因为关键字大写只是可读性约定,对引擎毫无影响——SELECTselect 完全等价;但你的标识符可能本身大小写敏感(Postgres 会把不带引号的标识符折叠成小写;MySQL 在某些平台区分大小写)。标识符不动是安全默认。如果你偏好小写关键字,格式化后手动过一遍即可。

压缩会保留多语句脚本吗?#

它把每段连续空白折成一个空格(包括换行),但分号原样保留。所以 SELECT 1; SELECT 2; 仍然是分号隔开的两条语句。不过对一个有很多条语句的迁移脚本来说,压成单行既难读又难调——压缩更适合单条查询或短批。

我的查询会被上传吗?#

不会。格式化器打包进本页,在浏览器里本地运行。你的 SQL——表名也好、字面量也好——什么都不会离开这个标签页。