什么是 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;
列对齐
在复杂查询中,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 查询优化技巧
有效使用索引
-- 检查列是否已索引后再过滤:
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 |
SERIAL 或 BIGSERIAL |
AUTO_INCREMENT |
IDENTITY |
AUTOINCREMENT |
本工具支持格式化标准 SQL、PostgreSQL、MySQL 和 SQL Server 方言的 SQL。
使用本工具
粘贴任意 SQL 查询,即可即时格式化,包括正确的缩进、关键字大小写和间距。支持所有主流 SQL 方言,并能处理包括子查询、CTE、窗口函数和存储过程在内的复杂查询。
-> 试试 SQL 美化工具