SQL 格式化工具
什麼是 SQL 格式化?
SQL 格式化工具會用一致的縮排、換行和清楚分段整理查詢語句。SELECT、JOIN、WHERE、GROUP BY、HAVING、ORDER BY、CTE 和子查詢會更容易閱讀,方便程式碼審查、除錯、教學和長報表分析。格式化也能協助更快發現意外笛卡兒積、過於擁擠的條件或括號位置問題。但它不會改變資料庫邏輯,不會最佳化執行計畫,不保證 MySQL、PostgreSQL、SQL Server、Oracle 等方言之間完全相容,也不能讓不安全的動態 SQL 變安全。正式環境修改仍需檢查參數化、權限、索引、交易、鎖和真實查詢計畫。
使用方式
使用方式
- 在左側輸入框中貼上或輸入 SQL 語句
- 選擇縮排大小(2 格空格、4 格空格或 Tab)及關鍵字大小寫
- 點選「格式化」美化 SQL,或點選「壓縮」移除空白
- 右側將顯示結果並附帶語法高亮
- 點選「複製」或「下載」以儲存結果
SQL 審查注意事項
- 格式化能提升可讀性,但不會驗證權限、索引、執行計畫或業務邏輯的正確性。
- 執行修改過的 SQL 前,請手動檢查產生的子句、字串字面值、註解及特定資料庫語法。
使用場景
技術原理
列印階段對每個子句套用一條規則:SELECT / FROM / WHERE / GROUP BY / HAVING / ORDER BY / LIMIT 各自在第零欄開始新行,投影欄位和 ON 條件縮排一層(2 個空格、4 個空格或一個 Tab),JOIN 關鍵字(INNER / LEFT / RIGHT / FULL / CROSS)對齊在 FROM 下方,CASE / WHEN / THEN / ELSE / END 垂直堆疊,括號內的子查詢和 WITH 內的 CTE 會獲得額外一層縮排,使外層 SELECT 在視覺上保持定位。字串字面值、行註解(-- ...)、區塊註解(/* ... */)和美元引號區塊只進行一次詞法分析後原樣複製,因此內部間距不會被觸及。
關鍵字大小寫在列印時套用,而非透過對原始碼的盲目正則替換——只有被分類為 RESERVED_KEYWORD 的詞法單元才會轉換為大寫或小寫,因此反引號內的識別字 'order' 或 'user' 會保留原始大小寫。方言支援很重要,因為保留字清單因引擎而異:PostgreSQL 識別 DISTINCT ON、RETURNING、ILIKE;MySQL 新增 IFNULL、LIMIT n,m、ENGINE=;SQL Server 使用 TOP n、OUTPUT、方括號識別字;Oracle 新增 DUAL、ROWNUM、用 MINUS 取代 EXCEPT;BigQuery 和 Snowflake 以 QUALIFY、EXCEPT(欄位)和陣列/結構字面值擴展標準。效能與來源長度呈線性關係(O(n) 詞法單元、O(n) 輸出位元組),因此即使是數 MB 的遷移腳本也能在毫秒內完成格式化。
- 詞法分析器:將來源掃描為 RESERVED_KEYWORD、IDENTIFIER、STRING_LITERAL、NUMBER、OPERATOR、LINE_COMMENT(-- ...)、BLOCK_COMMENT(/* ... */)和 WHITESPACE 類別;註解和字串原樣保留
- 方言感知:單引號字串(ANSI)、反引號識別字(MySQL)、方括號識別字(SQL Server)、雙引號識別字(PostgreSQL/標準)、美元引號區塊 $$...$$(PostgreSQL)
- 子句排版:SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT 各自定位在第零欄;投影欄位和 ON 條件縮排一層;JOIN 關鍵字對齊在 FROM 下方
- CTE 與子查詢縮排:WITH 子句將內層 SELECT 額外縮排一層;EXISTS / IN / 純量上下文中的關聯子查詢獲得自己的縮排,使外層查詢保持定位
- 大小寫策略:在列印時按詞法單元類別套用——只有 RESERVED_KEYWORD 詞法單元會被轉換大小寫,因此 `order` 或 [user] 等識別字保留原始大小寫
- 繫結參數:問號佔位符(MySQL 預備語句)、dollar-1/dollar-2 編號繫結(PostgreSQL)和冒號名稱繫結(Oracle/SQL*Plus)被詞法分析為 PARAMETER,不會被當作識別字重新格式化
- 複雜度:O(n) 詞法分析與 O(n) 列印,其中 n 為來源長度——數 MB 的遷移腳本在毫秒內完成格式化;與 sql-formatter npm 套件、pgFormatter 及 Prettier SQL 外掛效能相當
範例
格式化包含 JOIN 與 WHERE 的密集 SELECT
輸入:select u.id,u.name,o.total from users u left join orders o on o.user_id=u.id where u.status='active' and o.created_at>='2026-01-01' order by o.total desc limit 10;
輸出:
SELECT u.id, u.name, o.total
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE u.status = 'active'
AND o.created_at >= '2026-01-01'
ORDER BY o.total DESC
LIMIT 10;壓縮已格式化的 SQL 為設定字串
輸入(已格式化,6 行):
SELECT id, name
FROM products
WHERE price < 100
AND stock > 0
ORDER BY name;
壓縮輸出(1 行,78 個字元):
SELECT id,name FROM products WHERE price<100 AND stock>0 ORDER BY name;WITH (CTE) 加上巢狀子查詢的格式化
WITH recent_orders AS (
SELECT user_id, SUM(total) AS spend
FROM orders
WHERE created_at >= NOW() - INTERVAL '30 days'
GROUP BY user_id
)
SELECT u.name, r.spend
FROM users u
JOIN recent_orders r ON r.user_id = u.id
WHERE r.spend > (SELECT AVG(spend) FROM recent_orders);小寫關鍵字(團隊風格)
設定:縮排 = 2 個空格,關鍵字 = 小寫
輸入:SELECT * FROM Users WHERE Status=1;
輸出:
select *
from users
where status = 1;
用途:符合 Ruby on Rails / Django ORM 風格的 migration 檔案常見問題
支援哪些 SQL 方言?
標準 ANSI SQL,外加常見方言的關鍵字:MySQL、PostgreSQL、MSSQL/T-SQL、SQLite、Oracle、BigQuery、Snowflake。請從下拉選單中挑選對應方言,格式化器才能識別方言特有的關鍵字(LIMIT vs TOP、RETURNING、MERGE 等)。
有哪些樣式選項?
關鍵字大小寫、縮排空格數、欄位列表中逗號的前置或後置、自動換行的最大行寬,以及換行要在關鍵字之前還是之後。頁面通常會在側邊面板中顯示這些選項。
會驗證 SQL 的正確性嗎?
多數格式化器只做寬鬆解析,遇到可疑語法會原樣放行。真正的驗證需要連線到資料庫(或至少需要像 sqlparse、sqlglot 這類完整的 SQL 解析器)。本工具僅負責排版,語法檢查請使用 IDE 或實際資料庫。
能格式化預存程序與觸發器嗎?
多數版本可在方言支援的範圍內處理 CREATE PROCEDURE / CREATE FUNCTION / 觸發器。即使是包含流程控制(IF/ELSE/WHILE)的長段內容也能正確格式化;廠商擴充語法(如 T-SQL 特有關鍵字)則需要選對方言。
我的查詢語句會被上傳嗎?
不會。格式化由瀏覽器中的 JavaScript SQL 解析器執行,您貼上的 SQL 不會被傳送出去。話雖如此,任何網頁工具中都不應貼入正式環境的帳密或個資。
為什麼 CTE 和 JOIN 的縮排看起來怪怪的?
不同格式化器對 CTE 對齊方式各有主張:有些每個 CTE 定義都會縮排,有些則會靠左對齊。JOIN 同樣有多種合理寫法(「JOIN x ON」與「JOIN x\n ON」)。挑選符合團隊規範的選項並保持一致即可。
可以將 SQL 壓縮成一行嗎?
部分版本提供「單行模式」,會去除換行與多餘空白,方便在程式碼中以字串字面值嵌入 SQL。請務必將格式化版本納入版本控制——壓縮成一行的 SQL 在程式碼審查時根本無法閱讀。