RunToolz iconRunToolz
Welcome to RunToolz!
SQL数据库代码质量

可读的SQL不是可选的

混乱的SQL查询让调试变成噩梦。学习SQL格式化的最佳实践,包括缩进规范、关键字大写、JOIN对齐等技巧,让查询代码清晰易读。

RunToolz Team2026年1月28日4 min read

你继承了一个查询。它是一行。400个字符。多个join、子查询和CASE语句全部挤在一起。

祝你理解它。

SQL格式化不是关于美学。它是关于查询是否可维护。

密集SQL的问题

SELECT u.id,u.name,o.total,p.name FROM users u JOIN orders o ON u.id=o.user_id JOIN products p ON o.product_id=p.id WHERE o.created_at>'2024-01-01' AND u.status='active' ORDER BY o.total DESC;

join条件在哪里?过滤什么?每列来自哪个表?

现在想象凌晨2点调试这个。

想亲自试试吗?格式化SQL

同样的查询,可读的

SELECT
    u.id,
    u.name,
    o.total,
    p.name
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id
WHERE o.created_at > '2024-01-01'
    AND u.status = 'active'
ORDER BY o.total DESC;

每个子句有自己的行。条件对齐。结构可见。

有效的格式化规则

每行一个子句。 SELECT、FROM、WHERE、ORDER BY各自独占一行。

列在单独行上。 长SELECT列表变得可扫描。

缩进连续条件。 多个WHERE条件对齐。

关键字大写。 SELECT、FROM、WHERE从表名和列中脱颖而出。

一致的大小写。 选择一种风格。坚持它。

子查询格式化

子查询很快变得混乱。清楚地缩进它们:

SELECT *
FROM orders
WHERE user_id IN (
    SELECT id
    FROM users
    WHERE status = 'premium'
)

或在子查询变复杂时使用CTE:

WITH premium_users AS (
    SELECT id
    FROM users
    WHERE status = 'premium'
)
SELECT *
FROM orders
WHERE user_id IN (SELECT id FROM premium_users)

CTE通常比嵌套子查询更清晰。

JOIN格式化

总是指定join类型。单独的JOININNER JOIN,但显式更好。

SELECT *
FROM orders o
INNER JOIN users u ON o.user_id = u.id
LEFT JOIN shipping s ON o.id = s.order_id

对于简单join,将join条件放在同一行。对于复杂条件,换到下一行。

性能怎么样?

格式化不影响执行。数据库优化器不在乎空白。

但格式化的SQL更容易优化。你可以看到结构,识别不必要的join,发现缺失的索引。

不可读的SQL隐藏性能问题。

团队标准

选择一种风格。记录它。用自动格式化工具强制执行。

存在不同的风格。有些团队把逗号放在行首。有些大写所有东西。有些不大写。

一致性比你选择哪种风格更重要。


每个查询被阅读的次数多于被编写的次数。为可读性格式化。你的队友——和未来的你——会感谢你。