用你的方言,写出易读的 SQL
这款 SQL 格式化工具可以处理任意长度的查询,甚至一次处理多条语句,并统一缩进:每个子句一行,列和条件对齐,关键字使用你喜欢的大小写。它理解十五种以上方言的语法,从 PostgreSQL、MySQL、SQL Server 到 BigQuery、Snowflake 和 Oracle PL/SQL,因此各方言特有的运算符、引号和占位符都会原样保留。切换到“压缩”可将查询还原为一行,方便放进配置文件或代码中的字符串。一切都在浏览器中运行,你的查询永远不会被上传。
如何格式化 SQL 查询
- 1将 SQL 粘贴到左侧面板,或从示例查询开始。
- 2选择查询所用的方言。大多数简单查询用 Standard SQL 即可;但对于 PostgreSQL 的
::类型转换、MySQL 的反引号标识符或 SQL Server 的[brackets]等,选对方言很重要。 - 3设置关键字大小写和缩进,并打开更多选项调整数据类型和函数的大小写、表格式缩进、
AND/OR的位置以及语句之间的空行。 - 4输入时右侧会实时显示格式化后的查询。如果无法解析,会显示出错的行号和列号。
- 5复制结果、下载为
.sql文件,或选择压缩将其合并为一行。
为什么要格式化 SQL?
SQL 写一次,却要读很多次:在代码评审中、在慢查询日志里、在某人凌晨 2 点必须调试的迁移脚本中。ORM 生成的查询或从日志复制的查询通常是一整行超长文本。每个子句独占一行、子查询缩进之后,结构一目了然:连接了哪些表、按什么连接、哪些条件作用在哪里。
统一的格式还能让 diff 更小。当团队所有人都用同样的方式格式化查询时,修改一个条件只会显示为一行变化,而不是整段重新排版。
格式化选项说明
- 关键字大小写
- UPPER 让 SELECT、FROM 和 WHERE 从表名和列名中凸显出来,是最常见的约定。lower 适合觉得大写太刺眼的团队。“保留”则按你输入的样子保留关键字。
- 缩进
- 两个或四个空格,或制表符。表格式风格则会把关键字填充到固定宽度的列中,使其后的表达式对齐。
- AND / OR 位置
- “行首”把每个逻辑运算符放在行的开头,便于注释掉某个条件;“行尾”则把它留在上一行的末尾。
- 表达式宽度
- 括号内的表达式短于该字符数时保持在一行;更长的会被拆分。
- 紧凑运算符
- 写成 a+b 而不是 a + b。更紧凑,但更难阅读。
选择合适的方言
SQL 方言之间的差异比你想象的要多:标识符如何加引号("name"、`name` 或 [name])、占位符长什么样(?、$1、:name、@param),以及哪些是保留字。格式化工具为每种方言使用独立的语法,因此不会把 PostgreSQL 的 $$ 函数体或 MySQL 的 # 注释误认为别的东西。
如果一个你确信有效的查询出现解析错误,首先检查方言。Standard SQL 有意设计得很严格,并不认识所有厂商扩展。
压缩 SQL
压缩与格式化相反:删除注释,并把所有空白合并为单个空格,得到一行可以粘贴到 YAML 文件、环境变量或字符串字面量中的文本。字符串字面量、带引号的标识符和美元符号引用的函数体都会原样复制,因此像 'two spaces' 这样的值会保留两个空格。以 /*+ … */ 写成的优化器提示和 MySQL 的可执行注释 /*! … */ 会被保留,因为它们会影响查询的执行方式。
在处理 JSON?JSON 格式化与校验可对 JSON 文档做同样的事,代码压缩工具则支持 CSS、JavaScript 和 HTML。
常见问题
- 我的 SQL 会被发送到服务器吗?
- 不会。格式化和压缩完全在浏览器中运行,因此包含表名、客户数据或凭据的查询永远不会离开你的设备。
- 支持哪些 SQL 方言?
- Standard SQL、PostgreSQL、MySQL、MariaDB、SQLite、SQL Server (T-SQL)、Oracle PL/SQL、BigQuery、Snowflake、Amazon Redshift、Spark SQL、Hive、Trino 和 Presto、DuckDB、ClickHouse、IBM Db2 和 Db2 for IBM i、SingleStoreDB、TiDB 以及 Couchbase N1QL。
- 格式化会改变查询的行为吗?
- 不会。只有空白会改变,以及你选择时关键字、数据类型和函数的大小写。带引号的标识符和字符串字面量绝不会被修改。在大多数数据库中更改无引号标识符的大小写是安全的,但如果你的数据库对其区分大小写,请保持“保留”。
- 为什么会出现解析错误?
- 要么查询有语法错误,例如未闭合的括号或引号,要么使用了所选方言不包含的语法。错误信息会显示解析停止的行号和列号;请尝试你的数据库实际使用的方言。
- 可以一次格式化多条语句吗?
- 可以。用分号分隔,每条语句会依次格式化,语句之间的空行数由你决定。
- 注释会保留吗?
- 格式化时会:行注释和块注释都留在原位。压缩会删除注释,但优化器提示和 MySQL 可执行注释除外。
- 如何把 SQL 查询压缩成一行?
- 在工具顶部选择“压缩”。注释会被删除、空白会被合并,而字符串字面量和带引号的标识符保持原样。