跳到主要内容

SQL 格式化实战:把一行长查询变回能读的脚本

讲清 SQL 格式化的几件事:关键字大写、缩进换行、JOIN 与子查询的排版、不同方言怎么选,以及为什么把查询放在浏览器本地处理更安全。

发布于 作者 李雷
#SQL #格式化 #数据库 #开发工具

SQL 格式化实战:把一行长查询变回能读的脚本

写过 SQL 的人都遇到过这种场景:从 BI 平台导出一段查询,粘出来一看,是一整行没有任何换行的字符串,几百个字符挤在一起,SELECT、FROM、WHERE 全糊成一团。这时候逐个找断点重排既费时又容易看错关联条件。SQL 格式化要解决的,就是把这种压缩成一行的查询还原成层次清楚、能逐行读的脚本。

下面把格式化里真正影响可读性的几件事拆开讲,顺带说说本地处理为什么对生产查询很重要。

关键字大写让结构一眼可见

SQL 关键字大小写不影响执行结果,但影响阅读速度。把 SELECT、FROM、WHERE、JOIN、GROUP BY 这类关键字统一成大写,标识符(表名、字段名)保持原样,眼睛扫一遍就能定位每个子句的边界。团队里最怕的是一个人写 select,另一个写 SELECT,第三个两种混用,提交迁移脚本时 diff 全被大小写噪音污染,真正的表结构改动反而被淹没。

格式化工具一般提供三档:UPPER(全大写)、lower(全小写)、preserve(保持原样)。我自己的习惯是迁移脚本一律走 UPPER 加 2 空格缩进,文档示例则用 lower 加 4 空格,读起来更柔和。关键是同一份代码库内保持一致,而不是哪一档更对。

缩进与换行决定长查询的可读性

缩进的核心作用是表达嵌套层级。一个带子查询的语句,外层 SELECT 顶格,子查询往里缩一级,WHERE 里的 EXISTS 再缩一级,层级关系就从视觉上立住了。缩进单位常见的是 2 空格、4 空格或 Tab,选哪个看团队规范。

换行同样重要:每个主关键字另起一行,SELECT 列表里的字段逐个换行,长条件按 AND / OR 拆开。这样一条几百字符的查询会拉成几十行,但每一行都短而清楚,排查问题时定位速度反而快得多。

JOIN 与子查询的排版怎么摆

多表关联是 SQL 可读性的重灾区。格式化得当的话,每个 JOIN 独占一行,紧跟它的 ON 条件对齐,读的时候顺着往下扫就能数清关联了几张表、各自的键是什么。嵌套子查询和 CTE(WITH 子句)则靠缩进把边界划出来,哪段是公共表表达式、哪段是主查询,一目了然。

有些工具提供 Tabular-Left 这类对齐布局,把 SELECT、FROM、WHERE、JOIN 对齐到左侧固定列。它对扁平查询很整齐,但深层嵌套的 CTE 在这个布局下会显得不太常规,这时候切回标准块缩进就好,不是工具出了 bug。

一段真实的压缩查询美化

下面这条从日志里抠出来的查询,原样是一整行:

select u.id,u.name,o.total from users u join orders o on o.user_id=u.id where o.status='paid' and o.created_at>'2026-01-01' order by o.total desc;

过一遍格式化(关键字 UPPER、2 空格缩进)后变成:

SELECT
  u.id,
  u.name,
  o.total
FROM
  users u
  JOIN orders o ON o.user_id = u.id
WHERE
  o.status = 'paid'
  AND o.created_at > '2026-01-01'
ORDER BY
  o.total DESC;

同样的逻辑,后者一眼就能看清查了哪几列、按什么键关联、过滤条件有几个。

不同方言别选错

SQL 不是只有一种语法。MySQL、PostgreSQL、BigQuery、SQLite、Snowflake、T-SQL、Oracle PL/SQL 各有自己的关键字列表和标识符规则。最典型的坑是用 ANSI 标准模式去格式化 BigQuery,结果 QUALIFY 或反引号包的 project.dataset.table 直接被读坏。所以动手前第一件事是把方言下拉框对准你真正用的引擎,而不是图省事留默认。SQL 格式化工具 支持 20 种方言,选对了边角语法才不会被误判。

为什么我坚持本地处理

我之前排查一条 Prisma 自动生成的慢查询,别名全是 t0、t1、t2,600 个字符一行。我没敢把它贴到随便哪个在线工具,因为里面带着真实表名和字段名。换成纯客户端格式化后,我打开 DevTools 的网络面板确认了零外发请求,这才放心粘进去,二十秒就看出 t2.user_id 上少了索引。生产查询里往往藏着表结构、字段命名甚至样本 PII,数据不出标签页这一点,对要处理敏感内容的人不是锦上添花,而是底线。

格式化之外,如果你只想压缩 SQL 去掉空白节省体积,可以用 SQL 压缩工具;处理 JSON、XML 这类其他格式也有对应的格式化器可选。把这些动作都放在浏览器本地完成,既快又不用担心数据外泄。


Made by Toolora · Updated 2026-06-13