SQL 格式化:在线美化 SQL 语句
复制粘贴的 SQL 挤成一行看不清、同事写的 SQL 缩进混乱、上线脚本要压缩成单行——SQL 格式化工具一键解决这些痛点。本文详解在线 SQL 格式化器的用法。
为什么需要 SQL 格式化?
阅读难
未格式化的 SQL:
select id,name,email from users where age>18 and status='active' order by created_at desc limit 10
格式化后:
SELECT
id,
name,
email
FROM
users
WHERE
age > 18
AND status = 'active'
ORDER BY
created_at DESC
LIMIT 10;
可读性提升 10 倍。
调试难
复杂查询嵌套多层子查询,未格式化很难看清逻辑结构。
团队规范
团队代码规范要求统一格式,手动调整费时。
上线压缩
数据库脚本通常压成一行(节省空间、避免换行符问题),但又需要可读版本。
52tool SQL 格式化器
工具地址:SQL 格式化
功能
- 自动美化(增加换行、缩进)
- 关键字大写/小写/保持
- 标识符大小写
- 多种方言(MySQL、PostgreSQL、SQL Server、Oracle、SQLite)
- 压缩成一行
- 浏览器端处理,SQL 不外传
实战 1:美化 SQL
输入:
select u.id,u.name,count(o.id) as order_count from users u left join orders o on u.id=o.user_id where u.created_at>'2024-01-01' group by u.id,u.name having count(o.id)>5 order by order_count desc
输出:
SELECT
u.id,
u.name,
COUNT(o.id) AS order_count
FROM
users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE
u.created_at > '2024-01-01'
GROUP BY
u.id,
u.name
HAVING
COUNT(o.id) > 5
ORDER BY
order_count DESC;
实战 2:关键字大写
选项:关键字 → 大写
输入 select * from users 输出 SELECT * FROM users。
实战 3:压缩成一行
选项:压缩到单行
输入多行 SQL,输出一行:
SELECT id,name FROM users WHERE age>18 ORDER BY name
适合上线脚本。
SQL 关键字分类
DQL(数据查询语言)
- SELECT
- FROM
- WHERE
- GROUP BY
- HAVING
- ORDER BY
- LIMIT
DML(数据操作语言)
- INSERT
- UPDATE
- DELETE
DDL(数据定义语言)
- CREATE
- ALTER
- DROP
- TRUNCATE
DCL(数据控制语言)
- GRANT
- REVOKE
TCL(事务控制语言)
- BEGIN
- COMMIT
- ROLLBACK
- SAVEPOINT
各类语句格式化示例
SELECT 语句
输入:
select id,name,email,created_at from users where status='active' and age between 18 and 65 order by created_at desc limit 20 offset 0
美化:
SELECT
id,
name,
email,
created_at
FROM
users
WHERE
status = 'active'
AND age BETWEEN 18 AND 65
ORDER BY
created_at DESC
LIMIT 20
OFFSET 0;
INSERT 语句
输入:
insert into users (name,email,age,created_at) values ('John','john@example.com',30,NOW())
美化:
INSERT INTO users (
name,
email,
age,
created_at
) VALUES (
'John',
'john@example.com',
30,
NOW()
);
多行 INSERT
INSERT INTO users (name, email, age) VALUES
('John', 'john@example.com', 30),
('Jane', 'jane@example.com', 25),
('Bob', 'bob@example.com', 35);
UPDATE 语句
UPDATE users
SET
name = 'John Doe',
email = 'john.doe@example.com',
updated_at = NOW()
WHERE
id = 123;
DELETE 语句
DELETE FROM users
WHERE
status = 'inactive'
AND last_login_at < '2024-01-01';
CREATE TABLE
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
age INT DEFAULT 0,
status ENUM('active', 'inactive') DEFAULT 'active',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_email (email),
INDEX idx_status (status)
);
JOIN 查询
SELECT
u.id,
u.name,
u.email,
o.id AS order_id,
o.total,
p.name AS product_name
FROM
users u
INNER JOIN orders o ON u.id = o.user_id
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id
WHERE
u.status = 'active'
AND o.created_at >= '2024-01-01'
ORDER BY
o.created_at DESC;
子查询
SELECT
id,
name,
email
FROM
users
WHERE
id IN (
SELECT user_id
FROM orders
WHERE total > 1000
GROUP BY user_id
HAVING COUNT(*) > 5
)
ORDER BY
name;
WITH(CTE)
WITH active_users AS (
SELECT id, name, email
FROM users
WHERE status = 'active'
),
user_order_counts AS (
SELECT
user_id,
COUNT(*) AS order_count
FROM orders
GROUP BY user_id
)
SELECT
au.name,
au.email,
COALESCE(uoc.order_count, 0) AS orders
FROM
active_users au
LEFT JOIN user_order_counts uoc ON au.id = uoc.user_id
ORDER BY
orders DESC;
不同数据库方言
MySQL
- 反引号 `
`` 标识符 - LIMIT offset, count
- AUTO_INCREMENT
- NOW()、CURDATE()
PostgreSQL
- 双引号
"标识符 - LIMIT count OFFSET offset
- SERIAL、RETURNING
- NOW()、CURRENT_DATE
SQL Server (T-SQL)
- 方括号
[ ]标识符 - TOP n
- IDENTITY
- GETDATE()
Oracle (PL/SQL)
- 双引号
"标识符 - ROWNUM
- SEQUENCE.NEXTVAL
- SYSDATE
SQLite
- 反引号或双引号
- LIMIT count OFFSET offset
- AUTOINCREMENT
- datetime('now')
52tool 格式化器选择对应方言,输出符合该数据库规范。
编程实现
JavaScript
// npm install sql-formatter
import { format } from 'sql-formatter';
const formatted = format('select * from users', {
language: 'mysql',
tabWidth: 2,
keywordCase: 'upper'
});
Python
# pip install sqlparse
import sqlparse
formatted = sqlparse.format(
'select * from users',
reindent=True,
keyword_case='upper'
)
Java
// 使用 Hibernate 的 SQLFormatter
import org.hibernate.engine.jdbc.internal.BasicFormatterImpl;
String formatted = new BasicFormatterImpl().format("select * from users");
进阶技巧
技巧 1:用别名简化
-- 未简化
SELECT users.id, users.name, orders.id, orders.total
FROM users
INNER JOIN orders ON users.id = orders.user_id;
-- 用别名
SELECT u.id, u.name, o.id, o.total
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
技巧 2:字段对齐
SELECT
id AS user_id,
name AS user_name,
email AS user_email,
created_at AS join_date
FROM users;
手工对齐提升可读性。52tool 格式化器自动对齐。
技巧 3:注释规范
-- 单行注释
SELECT
id,
name,
-- email, -- 临时隐藏字段
created_at
FROM users;
/* 多行
注释 */
技巧 4:分号结尾
每条 SQL 语句以分号结尾,便于执行多条语句:
UPDATE users SET status = 'inactive' WHERE last_login_at < '2024-01-01';
DELETE FROM users WHERE status = 'inactive';
技巧 5:CASE 表达式格式化
SELECT
name,
CASE
WHEN age < 18 THEN 'minor'
WHEN age BETWEEN 18 AND 65 THEN 'adult'
ELSE 'senior'
END AS age_group
FROM users;
实战场景
场景 1:分析慢查询
数据库慢查询日志通常是一行:
select id,name,email,phone,created_at from users where email like '%@gmail.com' and created_at > '2024-01-01' order by created_at desc limit 100
复制到 52tool SQL 格式化器 一键美化,分析逻辑。
场景 2:调试 ORM 生成的 SQL
ORM(如 Hibernate、SQLAlchemy)生成的 SQL 难读。打印日志后格式化:
# SQLAlchemy 打印 SQL
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
# 看日志中的 SQL,复制到格式化器
场景 3:上线脚本压缩
开发时多行可读:
INSERT INTO users (name, email, age)
VALUES ('John', 'john@example.com', 30);
上线时压缩成一行(避免换行符问题):
INSERT INTO users (name,email,age) VALUES ('John','john@example.com',30);
场景 4:SQL 代码评审
代码评审时统一格式,方便发现:
- 缺失索引
- SQL 注入风险
- 性能问题
常见问题
Q: 格式化会改变 SQL 执行结果吗?
A: 不会。格式化只改变文本格式(换行、空格、大小写),不改变语义。执行结果完全相同。
Q: 不同数据库的 SQL 能通用格式化吗?
A: 大部分 SQL 标准语法(SELECT、INSERT)通用。但方言特性(如 MySQL 的反引号、SQL Server 的方括号)需要选择对应方言。
Q: 工具支持哪些数据库?
A: 52tool SQL 格式化器支持 MySQL、PostgreSQL、SQL Server、Oracle、SQLite、MariaDB 等主流数据库。
Q: 能格式化存储过程吗?
A: 简单的可以,复杂的存储过程(含控制流、变量声明)格式化效果有限。建议用专业数据库工具(如 DBeaver、Navicat)。
Q: SQL 注释会保留吗?
A: 多数格式化器保留注释。但格式化后注释位置可能调整。
Q: 工具会泄露我的 SQL 吗?
A: 52tool SQL 格式化器在浏览器端运行,SQL 不上传服务器。适合处理含表名、字段名等敏感信息的 SQL。
与其他工具配合
SQL + JSON
工具:JSON 格式化
把 SQL 查询结果(JSON 格式)格式化输出。
SQL + 正则
工具:正则表达式
批量提取 SQL 中的字段名、表名。
SQL + 文本对比
工具:文本对比
对比两个 SQL 版本的差异。
常见问题解答
Q: 格式化后 SQL 不能执行了?
A: 多数是引号、分号问题。检查:1) 字符串值是否用单引号;2) 标识符是否用对应方言的引号;3) 语句末是否需要分号。
Q: 怎么把多行 SQL 合并成一行?
A: 用 52tool SQL 格式化器 的"压缩"模式,自动移除多余空格、换行。
Q: 关键字大写好还是小写好?
A: 看团队规范。大写更易区分关键字和标识符(SQL 标准做法)。小写在某些 IDE 中看起来更现代。
Q: 缩进 2 空格还是 4 空格?
A: 看团队规范。SQL 通常用 4 空格更清晰,但与代码风格保持一致更重要。
Q: 工具有 API 接口吗?
A: 52tool 当前提供网页版,无 API。需要批量处理可以用 npm 包 sql-formatter 或 Python 的 sqlparse 库。
Q: 能格式化 NoSQL 吗?
A: 不支持 MongoDB 查询等 NoSQL 语法。NoSQL 通常是 JSON 格式,用 JSON 格式化工具。
总结
SQL 格式化是开发高频小工具:
- 在线美化 → 52tool SQL 格式化器
- 压缩上线 → 同工具的"压缩"模式
- 调试 ORM → 复制 SQL 到工具
- 多方言支持 → 选对应数据库
记住:写 SQL 时一定格式化,未来调试感谢自己;上线时压缩,节省传输和存储。