跳至正文

SQL Formatter

格式化 SQL 查詢以提高可讀性並壓縮它們的工具。整理複雜的查詢並統一團隊內的 SQL 編碼風格!

Examples:
Formatted SQL will appear here...

💡 Tips

  • 복잡한 쿼리를 읽기 쉽게 포맷팅하세요
  • 팀 내 SQL 코딩 스타일을 통일하세요
  • Compress 기능으로 쿼리를 한 줄로 만들 수 있습니다
  • 여러 SQL 문을 한 번에 포맷팅할 수 있습니다

主要功能

1. SQL 格式化

  • 為關鍵字、欄位和資料表名稱進行適當的縮排
  • 換行以提高可讀性
  • 套用一致的編碼風格

2. 支援多種 SQL 方言

  • 標準 SQL
  • MySQL
  • PostgreSQL
  • MariaDB
  • PL/SQL (Oracle)
  • T-SQL (SQL Server)
  • SQLite

3. 自訂選項

  • 縮排樣式(2 個空格、4 個空格、Tab)
  • 關鍵字大寫
  • 行間距調整

4. 壓縮功能

  • 刪除不必要的空白
  • 壓縮為單行

使用範例

格式化前

SELECT u.id,u.name,u.email,o.order_id,o.total FROM users u LEFT JOIN orders o ON u.id=o.user_id WHERE u.active=1 AND o.total>100 ORDER BY o.total DESC LIMIT 10;

格式化後

SELECT
u.id,
u.name,
u.email,
o.order_id,
o.total
FROM
users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE
u.active = 1
AND o.total > 100
ORDER BY
o.total DESC
LIMIT
10;

使用場景

1. 程式碼審查

-- 格式化複雜查詢以便於審查
WITH monthly_sales AS (
SELECT
DATE_TRUNC('month', order_date) AS month,
SUM(total) AS revenue
FROM
orders
GROUP BY
DATE_TRUNC('month', order_date)
)
SELECT
month,
revenue,
LAG(revenue) OVER (
ORDER BY
month
) AS prev_month_revenue
FROM
monthly_sales;

2. 文件編寫

-- 整理 README 或文件中的 SQL
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_users_email ON users (email);

3. 除錯

-- 使日誌中的單行查詢可讀
SELECT
p.id,
p.name,
c.name AS category,
COUNT(o.id) AS order_count
FROM
products p
INNER JOIN categories c ON p.category_id = c.id
LEFT JOIN order_items o ON p.id = o.product_id
WHERE
p.active = TRUE
GROUP BY
p.id,
p.name,
c.name
HAVING
COUNT(o.id) > 10;

4. 複雜的 CTE(公用資料表運算式)

WITH RECURSIVE subordinates AS (
SELECT
employee_id,
manager_id,
full_name,
1 AS level
FROM
employees
WHERE
manager_id IS NULL
UNION ALL
SELECT
e.employee_id,
e.manager_id,
e.full_name,
s.level + 1
FROM
employees e
INNER JOIN subordinates s ON s.employee_id = e.manager_id
)
SELECT
employee_id,
full_name,
level
FROM
subordinates
ORDER BY
level,
full_name;

使用壓縮功能

何時使用?

  1. 日誌分析: 將多行查詢轉換為單行以便 grep 搜尋
  2. URL 參數: 在 URL 中包含查詢時
  3. 節省空間: 在程式碼中內嵌使用簡單查詢

範例

-- 壓縮前(多行)
SELECT
id,
name
FROM
users
WHERE
active = TRUE;

-- 壓縮後(單行)
SELECT id,name FROM users WHERE active=TRUE;

最佳實踐

1. 一致的風格

在團隊內使用相同的格式設定:

  • 縮排: 2 個空格
  • 關鍵字: 大寫
  • 行間距: 1

2. 對複雜查詢使用 CTE

-- 好: 用 CTE 分離
WITH active_users AS (
SELECT * FROM users WHERE active = TRUE
),
recent_orders AS (
SELECT * FROM orders WHERE created_at > NOW() - INTERVAL '30 days'
)
SELECT
u.*,
COUNT(o.id) AS order_count
FROM
active_users u
LEFT JOIN recent_orders o ON u.id = o.user_id
GROUP BY
u.id;

3. 使用 JOIN 而不是子查詢

-- 不好: 子查詢
SELECT
*
FROM
orders
WHERE
user_id IN (
SELECT
id
FROM
users
WHERE
active = TRUE
);

-- 好: 使用 JOIN
SELECT
o.*
FROM
orders o
INNER JOIN users u ON o.user_id = u.id
WHERE
u.active = TRUE;

4. 明確列出欄位

-- 不好: SELECT *
SELECT * FROM users;

-- 好: 明確欄位
SELECT
id,
name,
email,
created_at
FROM
users;

支援的 SQL 語法

DDL(資料定義語言)

CREATE TABLE, ALTER TABLE, DROP TABLE
CREATE INDEX, DROP INDEX
CREATE VIEW, DROP VIEW

DML(資料操作語言)

SELECT, INSERT, UPDATE, DELETE
MERGE(某些方言)

進階功能

-- CTE(公用資料表運算式)
WITH cte_name AS (...)

-- 視窗函數
ROW_NUMBER(), RANK(), LAG(), LEAD()

-- 連接
INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN

-- 子查詢
WHERE id IN (SELECT ...), FROM (SELECT ...) AS subquery

提示和技巧

1. 逐步編寫長查詢

-- 步驟 1: 基本 SELECT
SELECT * FROM users;

-- 步驟 2: 新增 JOIN
SELECT * FROM users u
JOIN orders o ON u.id = o.user_id;

-- 步驟 3: WHERE 條件
SELECT * FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.active = TRUE;

-- 步驟 4: 格式化

2. 使用註解

-- 查詢使用者訂單統計
SELECT
u.id,
u.name,
COUNT(o.id) AS total_orders, -- 總訂單數
SUM(o.total) AS total_revenue -- 總收入
FROM
users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY
u.id,
u.name;

3. 一致的資料表別名

-- 使用首字母
FROM users u, orders o

-- 使用有意義的縮寫
FROM users usr, orders ord

注意事項

  • 格式化程式不驗證 SQL 語法
  • 方言之間可能存在細微差異
  • 壓縮功能會犧牲可讀性(僅在需要時使用)
  • 格式化時保留註解

相關工具

鍵盤快速鍵

許多 SQL 編輯器提供格式化快速鍵:

  • VS Code: Shift + Alt + F
  • JetBrains: Ctrl + Alt + L
  • DBeaver: Ctrl + Shift + F