SQL 语句美化与压缩工具

跨主流关系型与分析型数据库方言规范化 SQL 查询语法,或将长查询深度压缩为生产就绪的紧凑单行代码。

SQL 方言:
示例模板:
SQL 输入源码1 行 • 532 B
检测到 1 条独立 SQL 语句
•
SELECT
  u.id,
  u.username,
  u.email,
  COUNT(o.id) AS total_orders,
  COALESCE(SUM(o.total_amount), 0) AS lifetime_spend,
  MAX(o.created_at) AS last_order_date
FROM
  users u
  LEFT JOIN orders o ON u.id = o.user_id
  AND o.status NOT IN ('cancelled', 'refunded')
WHERE
  u.active = 1
  AND u.created_at >= '2024-01-01'
  AND (
    u.country_code IN ('US', 'CA', 'GB')
    OR u.is_vip = TRUE
  )
GROUP BY
  u.id,
  u.username,
  u.email
HAVING
  COUNT(o.id) > 2
  AND COALESCE(SUM(o.total_amount), 0) >= 250.00
ORDER BY
  lifetime_spend DESC,
  u.username ASC
LIMIT
  50
OFFSET
  0;
586 B•32 行•10ms
需要其他代码排版或比对工具?

操作指南与使用流程

步骤 1

载入查询语句

在输入区直接粘贴待排版、混淆或已压缩的 SQL,亦可将本地 .sql 文件直接拖拽至编辑器中。

步骤 2

定制排版规则

选择目标数据库方言,自由调整缩进层级(2 空格、4 空格或 Tab)、关键字大小写(UPPER/lower)及表格式垂直对齐风格。

步骤 3

审计核验与导出

在“差异对比 (Diff)”标签页中逐行审查语法结构变化,一键复制格式化结果或导出下载为独立 SQL 文件。

典型 SQL 排版与转换范例

1. CTE 表达式、子查询与多表 JOIN 结构对齐

原始输入(单行紧凑 CTE 关联语句)

with regional_stats as (select department_id, avg(salary) as avg_sal from employees where status = 'active' group by department_id) select e.id, e.first_name, e.last_name, e.salary, r.avg_sal from employees e inner join regional_stats r on e.department_id = r.department_id where e.salary > r.avg_sal order by e.salary desc limit 20;

格式化产物(层级缩进与子句清晰断行)

WITH regional_stats AS (
  SELECT
    department_id,
    avg(salary) AS avg_sal
  FROM
    employees
  WHERE
    status = 'active'
  GROUP BY
    department_id
)
SELECT
  e.id,
  e.first_name,
  e.last_name,
  e.salary,
  r.avg_sal
FROM
  employees e
  INNER JOIN regional_stats r ON e.department_id = r.department_id
WHERE
  e.salary > r.avg_sal
ORDER BY
  e.salary DESC
LIMIT
  20;

2. 剥离无用注释并完整保留优化器 Hint 指令

原始输入(夹带行内注释、块级注释与 Hint)

-- 查询活跃订单并强制走日期索引
/* 多行审计批注:已核验付款状态 */
SELECT /*+ INDEX(orders idx_order_date) */
  id,
  customer_id,
  total_amount
FROM
  orders
WHERE
  status = 'completed'
  AND order_date >= '2024-01-01';

压缩产物(安全清除注释,Hint 完整保留)

SELECT /*+ INDEX(orders idx_order_date) */ id,customer_id,total_amount FROM orders WHERE status='completed' AND order_date>='2024-01-01';

3. DDL 数据表结构定义与字段完整性约束

原始输入(单行压缩建表语句)

create table if not exists accounts (id bigint generated always as identity primary key, email varchar(255) not null unique, balance numeric(14,2) default 0.00 check (balance >= 0), created_at timestamp with time zone default current_timestamp);

格式化产物(字段列与约束垂直结构化对齐)

CREATE TABLE IF NOT EXISTS accounts (
  id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  email varchar(255) NOT NULL UNIQUE,
  balance numeric(14, 2) DEFAULT 0.00 CHECK (balance >= 0),
  created_at timestamp WITH time zone DEFAULT current_timestamp
);

排版规则与核心参数参考表

配置项可选参数值底层处理机制与安全约束
SQL 方言 (Dialect)Standard ANSI / MySQL / PostgreSQL / SQLite / T-SQL / PL/SQL / MariaDB / Snowflake / BigQuery / ClickHouse / Redshift / DuckDB加载特定数据库专有的保留字字典、标识符定界符规则(如反引号、方括号)及特色子句解析模型。
关键字大小写 (Keyword Casing)全大写 (UPPER) / 全小写 (lower) / 保持原样 (Preserve)归一化 SQL 预留关键字风格,严格保护数据库表名、列字段名、别名及字符串字面量内容不受改动。
缩进宽度 (Indentation Width)2 空格 / 4 空格 / Tab 制表符基于子查询、CTE 表达式及圆括号作用域的递归嵌套深度,规范计算各行前导对齐空白。
排版对齐风格 (Indent Style)标准块级缩进 / 表格式左对齐 / 关键字右对齐支持将主要子句关键字向右对齐,使字段列表、表名引用与过滤谓词在垂直方向形成对齐基线。
逻辑连接符换行 (Logical Operators)置于行首 (Before) / 置于行尾 (After)控制多条件筛选过滤子句中 AND 与 OR 连接符的断行位置,满足团队统一的代码审查风格。
剥离注释 (Strip Comments)压缩模式下默认启用安全清除单行(--、#)与块级(/* */)非必要注释,字符串字面量内部的注释字符受严格保护。
保留优化器提示 (Keep Hints)启用 / 禁用精准识别特定格式的优化器指令(/*+ ... */),压缩输出时完整保留,杜绝执行计划降级或全表扫描。

SQL 词法分词与语法树转换流水线

SQL 语法无法仅依靠简单正则表达式进行安全格式化。SQL 允许在字符串内部出现关键字(例如 'SELECT status FROM logs')、转义引号('' 或 \')、方言专有定界符以及深层嵌套的括号子句。企业级排版引擎严格遵循四个确定性处理阶段:

阶段 1

词法流扫描

将字符流拆解为类型化 Token:保留字、操作符、标识符、字面量与注释块。建立严格的 Token 边界隔离,杜绝字面量内部内容被意外篡改。

阶段 2

括号与作用域栈

动态跟踪圆括号及 CTE 嵌套深度,精准区分嵌套子查询括号块与常规标量函数调用(如 COALESCE())。

阶段 3

子句排版重构

依据选定规则对顶层子句(SELECT、FROM、WHERE)执行断行换行,对多层子树施加级联缩进或收缩冗余空白。

阶段 4

序列化输出

按目标配置输出格式化文本,或在保障相邻语法单元不发生粘连(保留必须的空格间隔)的前提下拼接为最小化单行代码。

多数据库方言文法与标识符差异矩阵

不同数据库引擎对标识符定界规范、参数占位符及专有查询边界有着不同约束。下表详细列出了各主流方言的解析与排版映射标准:

数据库引擎方言标识符定界符参数占位符专有子句与核心语法特性
标准 SQL (ANSI)"identifier"?FETCH FIRST n ROWS ONLY,标准窗口函数 (OVER / PARTITION BY)
MySQL & MariaDB`identifier`?, :paramLIMIT offset, count,ON DUPLICATE KEY UPDATE,# 单行注释
PostgreSQL"identifier"$1, $2, ?RETURNING,ON CONFLICT DO UPDATE,美元符定界块 ($$body$$)
SQLite`id`, "id", [id]?, ?1, :name, @name, $nameUPSERT 语法,AUTOINCREMENT,宽容的动态类型亲和机制
SQL Server (T-SQL)[identifier]@param, ?TOP (n),CROSS APPLY,OUTER APPLY,WITH (NOLOCK) 表级提示
Oracle PL/SQL"identifier":param, :1CONNECT BY,ROWNUM 过滤,优化器指令提示 (/*+ ... */)
Snowflake & BigQuery`identifier` / "id"?, @paramQUALIFY 子句,半结构化 FLATTEN / UNNEST,反引号表名标识
ClickHouse`identifier` / "id"? / {param:Type}PREWHERE 过滤,FINAL,ARRAY JOIN,ENGINE = MergeTree 表级配置
Amazon Redshift"identifier"?, $1DISTKEY,SORTKEY,VACUUM,数据湖 UNLOAD / COPY 载入指令
DuckDB"identifier" / `id`?, $1, $nameCOLUMNS(*),EXCLUDE,REPLACE,直接查询 Parquet / CSV 数据文件

SQL 压缩安全不变式与优化器 Hint 完整性保护

压缩 SQL 必须严格遵守词法不变式。缺乏语法感知的盲目字符剥离会导致执行报错或严重的线上性能劣化:

语法单元粘连防御 (Token Collision)

相邻字母数字 Token 之间的空白(如 SELECT id FROM users)绝不可被直接消除,否则会退化为非法标识符 SELECTidFROMusers。此外,连续的算术减号(如减去负常数 a - -1)必须严格保留空格,防止第二个负号被误解析为单行注释前缀(--)。

// 原始输入: WHERE a - -1
// 安全压缩结果: WHERE a- -1 (合法 SQL)
// 危险剥离后果: WHERE a--1 (被误识别为注释导致解析中断)

优化器指令提示完整保留 (Optimizer Hints)

数据库查询优化器将以 /*+ 开头的注释块(如 Oracle /*+ INDEX(t idx) */、MySQL /*+ MAX_EXECUTION_TIME(1000) */ 以及 PostgreSQL pg_hint_plan)视为最高优先级的执行指令。若误删此类注释,将迫使优化器回退至代价高昂的全表扫描。

// 包含优化器指令的语句:
SELECT /*+ LEADING(e d) */ e.name FROM emp e ...
// 压缩产物: 完整保留指令内容,执行计划不受影响

企业级工程实践与协作场景

ORM 复杂长查询反混淆排查

从 Hibernate、Prisma、TypeORM 或 MyBatis 输出的日志中提取单行、数千字符的超长 SQL。通过美化排版迅速展开嵌套 JOIN 关系与过滤谓词,助力 EXPLAIN ANALYZE 慢查询高效分析。

数据库迁移脚本规范审查 (Code Review)

在将 DDL 建表脚本合并入 Flyway、Liquibase 或内部版本库前,统一排版规约表结构、索引与外键约束声明,生成整洁清晰的 Git Diff 记录。

生产配置与 RPC 报文载荷优化

压缩硬编码在微服务配置中心、JSON 报文或 RPC 调用中的长查询,在严格维持关系型语义一致性的前提下,最大程度剥离无效字节与空行。

线上慢查询日志快速诊断

直接粘贴源自 MySQL Slow Query Log、PostgreSQL pg_stat_statements 或云监控服务的日志片段,秒级排版理清复杂索引命中瓶颈。

Frequently Asked Questions

如何格式化包含多层嵌套子查询与多表关联(JOIN)的复杂 SQL 语句?

在输入区粘贴 SQL 语句并选择期望的缩进层级(如 2 空格、4 空格或 Tab)。语法分析引擎会根据圆括号作用域与公用表表达式(CTE)深度构建语法层级,将根级子句(SELECT、FROM、WHERE、GROUP BY、HAVING 等)拆分换行,同时对嵌套子查询与 JOIN ON 关联谓词进行规范的级联缩进,形成层次分明的视觉排版。

对 SQL 语句执行单行压缩是否会改变数据库执行计划、查询结果或执行效率?

完全不会。关系型数据库引擎(如 MySQL、PostgreSQL、Oracle、SQL Server 等)在解析 SQL 时,词法分析器会自动剔除语法冗余空白符及非指令类注释,再交由查询优化器生成执行计划。压缩后的单行 SQL 与原语句在逻辑语义和执行计划上严格等价,同时能显著减少微服务 RPC 调用、网络 Socket 传输及应用日志记录中的报文体积。

在 MySQL、PostgreSQL、SQLite 及 SQL Server 之间切换方言如何影响排版结果?

不同数据库引擎遵循不同的语法规范与标识符定界标准。选择对应方言可确保引擎专有语法特性被精准解析与排版,例如 MySQL 的反引号定界符(`id`)、SQL Server 的方括号标识符([id])、PostgreSQL 的双引号与美元定界符($$body$$),以及 RETURNING、QUALIFY、CROSS APPLY 等专有子句的缩进对齐。

格式化与压缩工具是否支持参数化查询与预编译占位符?

完整支持。引擎将常见的位置占位符(如 ?、$1、$2)以及命名参数(如 :id、@user_id、#{param})识别为原子标识符 Token。在执行格式化缩进或压缩去空格的过程中,参数的前缀符号、命名标识及数值索引均会原样保留,绝不破坏预编译执行逻辑。

为什么在执行压缩并移除注释时,仍需完整保留数据库优化器提示(Optimizer Hints)?

各大数据库优化器将特定格式的注释识别为最高优先级的运行指令,例如 Oracle 的 /*+ INDEX(...) */、MySQL 的 /*+ MAX_EXECUTION_TIME(...) */ 以及 PostgreSQL 的 pg_hint_plan。若将其作为常规无用注释误删,将导致优化器退化为代价高昂的全表扫描或错误的连接顺序,引发严重的线上生产性能劣化。

标准块级缩进与表格式右对齐(Tabular Alignment)有何工程差异?

标准缩进以左顶格的主关键字为基准,对字段列表与条件子句进行相对缩进排版;表格式右对齐则将 SELECT、FROM、WHERE、ORDER BY 等主要保留字统一向右对齐,使字段清单、数据表名与过滤条件在视觉上形成整齐划一的垂直参考基线,极大降低复杂长查询的审阅心智负担。

“差异对比 (Diff)”视图如何直观呈现格式化前后的语法排版调整?

差异对比视图采用经典 Myers LCS(最长公共子序列)算法,对原始输入与处理产物执行逐行比对分析。通过绿色高亮标示新增缩进与规范化关键字、红色标示被移除的冗余空行与废弃注释,便于开发者在复制代码或提交版本控制前进行严密的安全审计。

为什么使用正则表达式(RegEx)无法安全可靠地排版与压缩 SQL?

SQL 文法高度上下文相关:字符串字面量内部可能包含保留字(如 'SELECT status FROM logs')与单引号转义('' 或 \'),算术运算中可能存在连续负号(如 a - -1),若简单使用正则替换极易导致连续负号被误当作 -- 单行注释前缀,从而破坏语句合法性。必须依赖分词状态机才能安全处理。