正在加载,请稍候…

如何格式化 SQL 查询以提高可读性

学习 SQL 格式化最佳实践、缩进规则和关键字大小写。使用我们的在线格式化工具即时清理混乱的查询——支持 MySQL、PostgreSQL、SQLite 等。

如何格式化 SQL 查询以提高可读性

什么是 SQL 格式化?

SQL(结构化查询语言)格式化是指一致地样式化 SQL 代码以提高可读性和可维护性。格式良好的 SQL 更易于阅读、调试和在版本控制中审查。由于 SQL 对空白不敏感,同一个查询可以用多种方式编写——格式化关乎人类可读性。

如何格式化 SQL 查询以提高可读性 插图

SQL 格式化约定

关键字大小写

SQL 关键字传统上使用大写,而标识符(表名、列名)使用小写或蛇形命名:

-- 推荐
SELECT user_id, first_name, last_name
FROM users
WHERE created_at > '2025-01-01'
ORDER BY last_name ASC;

-- 差(难以区分关键字和标识符)
select user_id, first_name, last_name from users where created_at > '2025-01-01' order by last_name asc;

缩进

每个子句另起一行,续行缩进:

SELECT
    u.user_id,
    u.first_name,
    u.last_name,
    o.order_count
FROM users u
LEFT JOIN (
    SELECT user_id, COUNT(*) AS order_count
    FROM orders
    WHERE status = 'completed'
    GROUP BY user_id
) o ON u.user_id = o.user_id
WHERE u.created_at > '2025-01-01'
  AND u.active = TRUE
ORDER BY u.last_name ASC, u.first_name ASC
LIMIT 100;

如何格式化 SQL 查询以提高可读性 插图

列对齐

在复杂查询中,SELECT 后的列对齐以提高可读性:

SELECT
    p.product_id,
    p.product_name,
    p.price,
    c.category_name,
    COUNT(oi.order_item_id) AS order_count,
    SUM(oi.quantity)        AS total_quantity
FROM products p
JOIN categories c ON p.category_id = c.category_id
LEFT JOIN order_items oi ON p.product_id = oi.product_id
GROUP BY p.product_id, p.product_name, p.price, c.category_name
HAVING COUNT(oi.order_item_id) > 10
ORDER BY order_count DESC;

编写可读的 JOIN

清晰表达 JOIN 条件,展示表之间的关系:

-- 差:隐式连接(避免)
SELECT * FROM orders, users
WHERE orders.user_id = users.user_id;

-- 好:显式 JOIN
SELECT
    o.order_id,
    u.email,
    o.total_amount
FROM orders o
INNER JOIN users u ON o.user_id = u.user_id
WHERE o.created_at >= CURRENT_DATE - INTERVAL '30 days';

SQL 查询优化技巧

如何格式化 SQL 查询以提高可读性 插图

有效使用索引

-- 检查列是否已索引后再过滤:
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';

-- 为频繁过滤的列创建索引:
CREATE INDEX idx_users_email ON users(email);

避免 SELECT *

始终指定你需要的列。SELECT * 会传输不必要的数据,并在表结构变化时破坏代码:

-- 差
SELECT * FROM products WHERE category_id = 5;

-- 好
SELECT product_id, product_name, price FROM products WHERE category_id = 5;

使用 EXISTS 代替 COUNT 进行存在性检查

-- 差(计算所有匹配行)
SELECT * FROM users WHERE (SELECT COUNT(*) FROM orders WHERE user_id = users.id) > 0;

-- 好(在第一个匹配处停止)
SELECT * FROM users WHERE EXISTS (SELECT 1 FROM orders WHERE user_id = users.id);

SQL 方言

SQL 有多种方言,语法各有不同:

特性 标准 SQL PostgreSQL MySQL SQL Server SQLite
字符串拼接 ` ` `
当前时间 CURRENT_TIMESTAMP NOW() NOW() GETDATE() CURRENT_TIMESTAMP
限制行数 FETCH FIRST n ROWS LIMIT n LIMIT n TOP n LIMIT n
自增 GENERATED ALWAYS AS IDENTITY SERIALBIGSERIAL AUTO_INCREMENT IDENTITY AUTOINCREMENT

本工具支持格式化标准 SQL、PostgreSQL、MySQL 和 SQL Server 方言的 SQL。

使用本工具

粘贴任意 SQL 查询,即可即时格式化,包括正确的缩进、关键字大小写和间距。支持所有主流 SQL 方言,并能处理包括子查询、CTE、窗口函数和存储过程在内的复杂查询。

-> 试试 SQL 美化工具