ToolAct工具行動

SQL 格式化工具

SQL 輸入
格式化輸出
行數: 1字元數: 0字節數: 0
行數: 1字元數: 0

什麼是 SQL 格式化?

SQL 格式化工具會用一致的縮排、換行和清楚分段整理查詢語句。SELECT、JOIN、WHERE、GROUP BY、HAVING、ORDER BY、CTE 和子查詢會更容易閱讀,方便程式碼審查、除錯、教學和長報表分析。格式化也能協助更快發現意外笛卡兒積、過於擁擠的條件或括號位置問題。但它不會改變資料庫邏輯,不會最佳化執行計畫,不保證 MySQL、PostgreSQL、SQL Server、Oracle 等方言之間完全相容,也不能讓不安全的動態 SQL 變安全。正式環境修改仍需檢查參數化、權限、索引、交易、鎖和真實查詢計畫。

使用方式

使用方式

  1. 在左側輸入框中貼上或輸入 SQL 語句
  2. 選擇縮排大小(2 格空格、4 格空格或 Tab)及關鍵字大小寫
  3. 點選「格式化」美化 SQL,或點選「壓縮」移除空白
  4. 右側將顯示結果並附帶語法高亮
  5. 點選「複製」或「下載」以儲存結果

SQL 審查注意事項

  • 格式化能提升可讀性,但不會驗證權限、索引、執行計畫或業務邏輯的正確性。
  • 執行修改過的 SQL 前,請手動檢查產生的子句、字串字面值、註解及特定資料庫語法。

使用場景

將密集的 SQL 查詢轉為可審查的格式貼上一段冗長的 SELECT、JOIN、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT 或 INSERT 語句,格式化工具會將主要子句拆分到獨立行並加入縮排。當 ORM 或報表工具產出的 SQL 壓成一行時,格式化後更容易審查、除錯和解說。
統一關鍵字大小寫以符合團隊規範選擇大寫或小寫關鍵字,同時保留字串字面值、註解和美元引號區塊不受影響。這能將程式碼片段統一為遷移檔案、儀表板、操作手冊和內部文件所需的格式,不需要逐一搜尋每個 SELECT、JOIN、CASE 或聚合函數。由於解析在瀏覽器本地進行,引用內部表名、未發布功能開關或預發布環境 schema 的查詢都可以安全格式化,SQL 不會經過任何第三方美化服務。
審查完成後壓縮 SQL 以便傳輸使用壓縮模式移除區塊註解、行註解、多餘空白以及逗號或括號周圍的空格。這適合用於 URL 參數、測試資料或精簡的設定值,但應在確認可讀版本內容無誤之後再套用。
以巢狀縮排格式化 CTE 與子查詢帶有 WITH 子句的常見資料表運算式(CTE)和關聯子查詢會獲得額外一層縮排,使外層 SELECT、內層 SELECT 和 UNION 區塊在視覺上保持分離。這讓遞迴 CTE 鏈和 EXISTS 子查詢在程式碼審查時更容易追蹤。方言偵測在此很重要:PostgreSQL 支援 `DISTINCT ON (col)`,MySQL 使用反引號識別字和 `IFNULL`,SQL Server 使用方括號 `[table]` 和 `TOP n` 而非 `LIMIT`,Oracle 則保留 `DUAL` 和 `ROWNUM`;格式化工具會一致對齊主要關鍵字(SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY),但特定方言的詞彙清單仍需使用者自行確認。
在部署前發現意外的笛卡兒積格式化一個多表 SELECT 並以逗號分隔 FROM 子句時,缺少 JOIN ... ON 條件的情況會變得一目了然。展開的排版會暴露出裸露的表清單,讓你在生產環境出現意外的列倍增之前就能發現問題。注意問號佔位符(MySQL 預備語句和許多 ORM 使用)與 $1、$2 編號(PostgreSQL 繫結參數)以及 :name 命名繫結(Oracle 和 SQL*Plus)之間的差異;格式化工具會保護這些詞彙不被誤判為識別字,但關鍵字大小寫仍需符合團隊選定的風格(遷移用大寫,程式碼審查可讀性用小寫)。

技術原理

SQL 格式化是三階段管線:詞法分析器將原始文字掃描為詞法單元流(關鍵字、識別字、字面值、運算子、註解、空白),解析器按子句結構將這些詞法單元分組,列印器遍歷結果並根據樣式策略輸出換行、縮排和大小寫。詞法分析器必須具備方言感知能力,因為字串和識別字的分隔符號各不相同:ANSI SQL 使用雙引號表示識別字、單引號表示字串,MySQL 使用反引號表示識別字,SQL Server 使用方括號,PostgreSQL 則增加了美元引號區塊($$...$$ 或 $tag$...$tag$),其中所有內部字元(包括引號)都會被跳脫。

列印階段對每個子句套用一條規則: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 在程式碼審查時根本無法閱讀。