如何格式化 SQL 查询

· 7 分钟阅读

混乱的SQL是引入错误的最快方式之一。当查询是没有缩进的单个长行时,很难看出哪些条件适用于哪些连接、子查询从哪里开始和结束,或者逻辑是否正确。基于浏览器的格式化工具在本地处理整个工作,而无需将您的查询上传到服务器。

为什么格式化很重要

如何格式化SQL

  1. 粘贴您的SQL:将缩小或混乱的查询输入格式化工具。它处理SELECT、INSERT、UPDATE、DELETE、CREATE TABLE,以及带有子查询和连接的复杂查询。
  2. 配置选项:选择缩进大小以及是否将关键字大写。这些设置与您项目的样式指南相匹配。
  3. 复制结果:格式化的SQL已准备好粘贴回您的编辑器、数据库客户端或文档中。

好的格式化是什么样的

select u.name, o.total from users u join orders o on u.id = o.user_id where o.total > 100 and u.active = 1 order by o.total desc这样的查询变成:

SELECT
  u.name,
  o.total
FROM users u
JOIN orders o
  ON u.id = o.user_id
WHERE o.total > 100
  AND u.active = 1
ORDER BY o.total DESC

每个子句都从自己的一行开始。条件在其父子句下缩进。连接和它们的ON条件清楚地配对。

SQL格式化约定的简史

SQL由IBM研究人员Donald Chamberlin和Raymond Boyce于1974年创建,最初称为SEQUEL(Structured English Query Language)。原始名称中的「QL」反映了语言读起来像英语的意图。从一开始,这种人类可读的设计就暗示了一种约定:缩进您的子句,使它们像句子一样从上到下阅读。

在20世纪80年代和90年代的大部分时间里,SQL是在文本编辑器中手工编写的,格式化是个人化的。一些工作室采用「河流风格」(每个关键字垂直对齐到虚拟列的右侧),其他人使用「埃及风格」(同行括号等效),大多数只是使用作者喜欢的任何东西。

第一个广泛使用的SQL格式化工具是Apex SQL Formatter(2000年),其次是Devart的SQL Complete(2002年)和Red Gate的SQL Prompt(2003年)。这些工具为SQL Server和Oracle开发人员带来了IDE级别的格式化。到2010年,每个主要的IDE(SSMS、DataGrip、DBeaver)都内置了SQL格式化,在线格式化工具成为临时清理的标准。

2017年,格式化工具生态系统随着sql-formatter(npm)而改变,这是一个开源JavaScript库,为今天包括这个在内的大多数基于浏览器的SQL格式化工具提供支持。现代格式化工具处理方言差异(MySQL反引号、PostgreSQL窗口函数、SQL Server方括号)并产生一致、可配置的输出。

大型公司使用的SQL样式指南

大多数专业代码库遵循几种已发布的SQL样式指南之一:

样式指南起源关键约定
Mozilla SQL StyleMozilla大写关键字,snake_case名称,2空格缩进
GitLab SQL StyleGitLab数据团队大写关键字,小写名称,4空格缩进,前导逗号
Holistics SQL StyleHolistics大写关键字,snake_case,2空格,尾随逗号
Simon Holywell SQL个人/流行「河流」对齐,大写关键字
dbt SQL Styledbt Labs小写关键字(现代方言),snake_case,前导逗号
PostgreSQL Wiki StylePostgreSQL社区小写关键字,snake_case,K&R风格缩进

如果您正在开始一个新项目,请选择已建立的指南之一。如果您加入现有代码库,请遵循已有的内容。项目内的一致性比任何特定风格都更重要。

常见格式化选择

方言差异

SQL格式化工具需要处理特定于方言的语法:

方言独特功能
PostgreSQL窗口函数、LATERAL JOIN、美元引号字符串($$)、CTE密集型风格
MySQL/MariaDB反引号标识符、LIMIT子句语法、REPLACE INTO
SQL Server (T-SQL)方括号标识符、TOP子句、OUTPUT子句、MERGE
Oracle (PL/SQL)DUAL表、ROWNUM、分层CONNECT BY、点后缀包调用
SQLite有限类型系统、REPLACE/UPSERT、单文件数据库
Snowflake变体数据类型、QUALIFY子句、COPY INTO
BigQuery反引号标识符、ARRAY/STRUCT类型、EXCEPT/REPLACE列列表
Redshift源自PostgreSQL但有独特的DDL,从S3的COPY

一个好的格式化工具检测或接受方言提示,然后处理其他方言会拒绝的语法。

常见陷阱

提示

隐私和机密查询

SQL格式化工具完全在您的浏览器中运行。您粘贴的查询、中间处理和格式化的输出都保留在您的设备上。没有任何内容上传到服务器、记录或与任何人共享。

这很重要,因为SQL查询通常包含极其敏感的信息:揭示产品架构的表名、暴露业务逻辑和指标的列名、WHERE子句中真实的客户ID、存储过程中的内部API端点、测试数据中的SSN和信用卡号、HR查询中的员工薪酬、分析查询中的财务数据、营销查询中的客户电子邮件地址。云SQL格式化工具记录其请求日志中的每个查询,有时为「服务改进」保留它们,并参与了真正的违规行为,其中粘贴的生产查询泄露了敏感的架构和数据。基于浏览器的格式化工具没有任何暴露:查询永远不会离开您的机器。

基于浏览器的格式化在页面加载后也可以离线工作,对于在飞机上、在没有互联网访问的安全环境中,或在任何您不能或不应将数据库查询粘贴到第三方服务的地方格式化查询很有用。

常见问题

SQL 关键字应该大写吗?

将 SQL 关键字大写(SELECT、FROM、WHERE)而将表或列名小写是广泛遵循的约定。这让查询在视觉上更易读。大多数风格指南都推荐这样做,但没有数据库引擎强制要求。

格式化会改变查询的执行吗?

不会。空白和缩进对 SQL 执行没有影响。格式化纯粹是为了人类可读性。压缩的查询和缩进的查询产生相同的结果。

应该使用什么缩进大小?

2 或 4 空格都常见。选择您团队使用的并保持一致。大多数 SQL 格式化器允许您配置。

我的 SQL 会发送到服务器吗?

不会。格式化完全在您的浏览器中进行。您的查询从不离开您的设备。