📝 博客 · 2026-08-02 · ⏱ 19 分钟

SQL 格式化:在线美化 SQL 语句

SQL 格式化工具使用教程:INSERT/SELECT/CREATE TABLE 等多种语句美化,关键字大写、缩进对齐、压缩为一行,附主流数据库方言对比。

SQL格式化SQL美化在线工具数据库

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 格式化

功能

实战 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(数据查询语言)

DML(数据操作语言)

DDL(数据定义语言)

DCL(数据控制语言)

TCL(事务控制语言)

各类语句格式化示例

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

PostgreSQL

SQL Server (T-SQL)

Oracle (PL/SQL)

SQLite

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 代码评审

代码评审时统一格式,方便发现:

常见问题

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 格式化是开发高频小工具:

记住:写 SQL 时一定格式化,未来调试感谢自己;上线时压缩,节省传输和存储。