SQL格式化和验证器 - 在线免费格式化SQL查询
这款免费SQL格式化和验证工具能自动将关键字转换为大写、添加合理的换行和缩进,使原本杂乱的SQL语句变得清晰易读。同时它还会检测常见语法问题,例如未闭合的引号或缺少ON连接条件的JOIN语句,并给出提示,支持MySQL、PostgreSQL、SQL Server和Oracle等主流数据库方言。
SQL 格式化和验证器
使用自动缩进、关键字大写和语法错误检测来格式化和验证 SQL 查询。
文档
SQL 格式化器和验证器是什么?
SQL 格式化器是一种工具,它会用一致的空格、换行和大写关键字重写 SQL 查询,使其更易于阅读。SQL 验证器会在不连接数据库的情况下,检查同一个查询是否存在结构错误,例如未闭合的引号或缺失的括号。此工具同时具备这两种功能。它完全在浏览器中运行,因此查询文本不会发送到服务器。
如何格式化 SQL 查询
- 将 SQL 查询粘贴或输入到输入框中。
- 格式化后的版本会自动显示在右侧,无需点击按钮。
- 所有验证错误都会显示在输出下方的列表中。
- 点击复制按钮即可将格式化后的查询发送到剪贴板。
SQL 格式化规则
关键字大小写
格式化工具会把一组固定的 SQL 关键字转为大写,前提是它们不在字符串或带引号的标识符之内。SQL 关键字不区分大小写,因此这只会改变查询的外观,不会改变其行为。该列表涵盖主要子句(SELECT、FROM、WHERE、GROUP BY、ORDER BY、HAVING、LIMIT、OFFSET)、连接用词(JOIN、LEFT、RIGHT、INNER、OUTER、FULL、ON)、语句类型(INSERT、UPDATE、DELETE、CREATE、ALTER、DROP),以及常见的运算符和连接词(AND、OR、NOT、IN、BETWEEN、LIKE、AS、CASE、WHEN、THEN、ELSE、END、UNION、DISTINCT、VALUES、SET,以及其他少数几个)。
有些看起来像关键字的词会保持输入时的样子。聚合函数如 COUNT、SUM 和 AVG 不在列表中,因此 count(*) 如果是小写输入,就仍保持小写。排序方向词 ASC 和 DESC,以及单独出现的字面量 TRUE、FALSE 和 NULL,同样不会被改动。字符串字面量('...')、带引号的标识符("..."、MySQL 的反引号 `...`,或 SQL Server 的方括号 [...])或注释中的文本,无论内容是什么,都不会被更改。
换行和缩进
每个主要子句都从新的一行的左边距开始:SELECT、FROM、WHERE、GROUP BY、ORDER BY、HAVING、LIMIT 和 OFFSET。JOIN(及其变体,如 LEFT JOIN)也另起一行。CASE、WHEN、THEN、ELSE 和 END 各自另起一行,而 UNION(或 UNION ALL,两词保持在同一行)前后用空行隔开。每个逗号之后也会换行,因此 SELECT 或 GROUP BY 中的列清单最终每行一列。
缩进只出现在括号内。子查询或分组表达式内部的内容,每嵌套一层缩进两个空格。不含括号的查询,所有子句都紧贴左边距,完全没有缩进。
示例:格式化前后
格式化前:
1select id, first_name, last_name, email from customers where status = 'active' order by last_name, first_name;
2格式化后:
1SELECT id,
2first_name,
3last_name,
4email
5FROM customers
6WHERE status = 'active'
7ORDER BY last_name,
8first_name;
9每个关键字都是大写,每个子句和列都单独占一行。由于查询没有括号,因此没有任何行缩进。
括号会改变这种情况。将(select count(*) from employees e where e.department_id = d.id)作为较大查询的一部分进行格式化时,内部的SELECT、FROM和WHERE会缩进两个空格;count则保持小写,因为它是函数名,不是列表中的关键字。
SQL 验证器检查什么
验证器会在不连接数据库的情况下查找结构问题:
- 未闭合的引号。 打开后一直没有闭合的单引号或双引号。
- 括号不平衡。 字符串和注释之外的
(与)数量必须相同。 - 未加括号的子查询。 嵌套在另一个
SELECT ... FROM ... SELECT模式中、且没有用( )括起来的SELECT。 - 以
AND或OR开头的WHERE。 开头的连接词前没有任何内容。 - 没有匹配条件的
JOIN。JOIN需要ON或USING子句。CROSS JOIN和NATURAL JOIN不受此规则限制,因为它们不需要条件。 - 空的
GROUP BY或ORDER BY。 查询末尾只有子句关键字,后面没有列名。 - 不完整的
WHERE条件。 查询末尾存在没有值的悬空比较,例如WHERE status =,或单独的WHERE后面没有任何内容。 - 有
SELECT却没有FROM。 仅当选择列表是普通列名时才会标记;SELECT之后的表达式、函数调用或字面量本身是有效的,不会被标记。 - 子句顺序。 检查两种具体情况:
GROUP BY不得出现在WHERE之前,ORDER BY不得出现在GROUP BY之前。这些检查只针对查询的顶层,不考虑子查询内部的内容。
不检查的内容
验证器不知道表或列是否真实存在、连接的列类型是否兼容,也不知道查询的性能如何。它也不会标记真实数据库强制执行的所有规则。举两个例子:不带 GROUP BY 的 HAVING 会被接受,因为即使没有 GROUP BY,出现 HAVING 也会使查询成为分组查询,所以验证器不会为此报错。同样,它不会检查 SELECT 列表中每个未聚合的列是否也出现在 GROUP BY 中。许多数据库会强制执行这条规则,但本工具不检查。缺少末尾的分号也不会被标记,因为分号是语句分隔符,不属于单个查询。
示例:验证器能捕获的错误
1SELECT id FROM orders
2JOIN users
3WHERE status =
4此查询会产生两个错误:
- “一个或多个 JOIN 语句缺少 ON 条件。”
JOIN users没有ON或USING子句。 - “WHERE 条件不完整。”
status =的等号后面没有值。
常见问题
此工具适用于 MySQL、PostgreSQL、SQL Server 和 Oracle 吗?
它支持这些数据库共有的核心 SQL 语法:SELECT、JOIN、WHERE、GROUP BY及类似子句。数据库特有的语法,例如 PostgreSQL 数组字面量或 T-SQL 过程块,不会导致格式化器出错,但可能不会得到特殊处理。
SQL 查询会发送到服务器吗?
不会。格式化和验证都在浏览器中运行。查询文本不会被传输到任何地方。
它会将 COUNT、SUM 和 AVG 等函数名改为大写吗?
不会。只有子句关键字、连接词和固定列表中的运算符会改为大写。函数名(如count、sum和avg)以及asc、desc、true、false和null这些词都会保持输入时的形式。
验证器会标记不带 GROUP BY 的 HAVING 吗?
不会。不带 GROUP BY 的 HAVING 子句会把整个结果归为一个组,这是有效的 SQL,因此验证器不把它视为错误。
验证器能捕获所有 SQL 错误吗?
不能。它检查的是结构:括号、引号、少数几条子句顺序规则,以及一些常见的逻辑缺口,例如没有条件的 JOIN。它不检查表名或列名、数据类型或查询性能。仍然需要连接真实的数据库,才能确认查询能否正确运行。
格式化会改变查询的运行方式吗?
不会。格式化只会改变空白字符以及未加引号关键字的大小写。字符串、带引号的标识符或注释中的任何内容都会原样复制,因此查询的含义与格式化前完全相同。
参考文献
- PostgreSQL 全球开发组。Lexical Structure。postgresql.org — 关键字不区分大小写。
- Oracle。MySQL 8.0 Reference Manual: Schema Object Names。dev.mysql.com — 反引号是 MySQL 的标识符引号字符。
- Microsoft。Database Identifiers。learn.microsoft.com — SQL Server 的定界标识符使用方括号或双引号。
- PostgreSQL 全球开发组。SELECT。postgresql.org — 即使没有 GROUP BY,HAVING 也会使查询成为分组查询。