格式化、检查并读懂任何一条 SQL 查询。
十九种方言、能报出行与列的检查器、语法高亮,以及每条语句的拆解——全部在这个标签页里完成,不向任何地方上传。
这里不会自动运行。查询准备好后按「格式化」。
还没有载入内容。
只要有一条语句,这里就会给出拆解。
十九种方言,不止一种
PostgreSQL、MySQL、MariaDB、SQLite、SQL Server、BigQuery、Snowflake、Redshift、DuckDB、Oracle 等等,各有各的保留字、引号规则和占位符。粘贴查询,方言会自动判断。
问题带着行号
没闭合的引号和括号、没有 WHERE 的 DELETE、没有 ORDER BY 的 LIMIT。每条提示都给出行和列,点一下光标就落到那里。
在主线程之外
格式化在 Web Worker 里进行,5 MB 的导出文件处理时页面也不会卡住。结果旁边显示的时间是真实测得的。
什么都不会离开这个标签页
没有上传,没有账号,也不往服务器跑一趟。生产环境的查询带着表名、ID 和业务逻辑,这些都不会去到任何地方。
如何使用
把查询拿进来
粘贴、拖入 .sql、加载示例,或者让另一个工具递过来。拖进来的文件会等着:在你开口之前不会载入,也不会格式化。
定好规则
方言、关键字大小写、缩进宽度、AND 和 OR 的位置、表达式多宽才换行。每个选项都会改变下一次格式化的结果。
按下格式化
引擎重写查询,检查面板列出值得看一眼的地方,拆解面板显示涉及的语句、表、连接和 CTE。
带走它
复制、下载 .sql,或者直接送到套件里的另一个工具:比较两个版本、做成图片、计算哈希。
格式化只是工作的一半
大多数在线 SQL 美化工具只做一件事:加换行。这在查询只是难看时够用,但查询不只是难看而是写错时就不行了——中途没闭合的引号、始终没关上的括号、复制粘贴时弄丢的 WHERE。SQLFlow 在动手之前先把查询读成词元,因此能告诉你问题从哪一行哪一列开始,而不是默默吐出一段被弄坏的结果。
这一遍词元处理同样保护你的数据。粗糙的格式化工具会对整段文本套用正则表达式,于是 '你好 世界' 里的空格被压掉,注释里的逗号还会开出新的一行。在这里,字符串和注释是不可触碰的整体:你写在里面的东西会逐字节原样出来,不管你选的是哪种方言。
而且同一遍处理还顺带搭出了拆解结果,所以你拿到的不只是好看的文本:文件里有哪些语句、每条语句碰到哪些表、有哪些 CTE、有多少连接、还有哪些占位符在等值。这就是「看起来整齐的查询」和「在跑上生产之前你已经看懂的查询」之间的差别。
常见问题
我的查询会被发送到服务器吗?
不会。格式化器以及围绕它的一切都在你的浏览器里运行。没有上传,也没有 API 调用,查询不会离开你的设备。
支持哪些 SQL 方言?
十九种:标准 SQL、PostgreSQL、MySQL、MariaDB、SQLite、SQL Server(T-SQL)、Oracle PL/SQL、BigQuery、Snowflake、Redshift、DuckDB、ClickHouse、Spark、Hive、Trino、Db2、SingleStore、TiDB 和 N1QL。每种都有自己的保留字、引号规则和占位符语法,并且会尽可能从查询本身推断方言。
它会改变我的查询做的事情吗?
不会。格式化只动空白和关键字的大小写。字符串、注释和带引号的名称原样输出,连里面的空格都不变。
检查面板会检查什么?
没闭合的引号、注释和括号;不以 SQL 关键字开头的语句;没有 WHERE 的 DELETE 和 UPDATE;DROP 和 TRUNCATE;SELECT *;用逗号连接却没有条件的表;没有 ORDER BY 的 LIMIT;没有列清单的 INSERT;以及末尾缺失的分号。每一条都会给出行和列。
粘贴查询之后为什么什么都没发生?
这是有意为之:格式化只有在你按下「格式化」或 Ctrl+Enter 时才运行。如果希望它边输入边跑,可以在「更多选项」里打开「边输入边格式化」。
可以一次格式化多条语句吗?
可以。用分号分隔的语句会一起格式化,拆解面板会逐条列出并标明它碰到的表,方便你直接跳过去。