SQL 格式化

貼上壓縮的 SQL 查詢即可得到縮排清晰、易讀的結果。可選擇方言、縮排寬度與關鍵字大小寫,全部在瀏覽器本地完成。

把一整牆 SQL 變回能讀的樣子。 貼上查詢——一行或一千行都行——輸入即重新排版。先選對方言,避免方言特有語法被破壞,再挑選團隊使用的縮排方式和關鍵字大小寫。

為別人能讀懂而格式化 SQL

方言選擇器為什麼重要

SQL 之所以稱為標準,大致相當於英語拼寫稱為標準。每個引擎都實現公共核心,然後各自新增別家沒有的語法;如果格式化器不知道你的目標引擎,它要麼會誤解這些語法,要麼就靜默地原樣跳過不做處理。

這些差異並不冷僻。僅識別符號引用方式就已經分家:MySQL 用反引號,PostgreSQL 和標準 SQL 用雙引號,SQL Server 用方括號。假設了錯誤約定的格式化器,可能把帶引號的識別符號當成字串字面量,並圍繞一個根本不存在的邊界重新折行。除引用方式外,還有 LIMITTOPFETCH FIRST 之別、PostgreSQL 的 :: 轉換運算子、T-SQL 中以 @ 開頭的變數、BigQuery 用反引號包裹的專案路徑,以及 Snowflake 的 QUALIFY 子句。選對方言,才能讓這些保持完整。

縮排其實是一個 diff 決策

縮排寬度和關鍵字大小寫看似只是外觀,實際上決定了你的版本歷史長什麼樣。格式化只有在保持一致時才有價值——一旦兩個人對同一個檔案用了不同的格式,每次提交都會夾帶一片無關的空白改動,程式碼評審就此失效。選定一套配置,寫進倉庫,然後機械地執行。

關鍵字全大寫是最常見的約定,在閱讀密集查詢時很有幫助,因為結構性詞彙能與表名列名在視覺上分開。近年在把 SQL 當作普通程式碼、不喜歡"喊話"風格的程式碼庫裡,全小寫也逐漸流行。而當你要格式化別人的查詢、希望只調整排版而不改動其一個字元時,"保持原樣"是正確選擇——這樣產生的 diff 是純結構性的。

製表符與空格之爭照舊,但 SQL 場景有個特有的細節:查詢經常被粘進終端、工單系統和聊天工具,而這些地方常把製表符渲染成八列寬。用製表符縮排的深層巢狀查詢,恰恰會在你最可能分享它的場合折行成一團亂麻。

格式化不會做的事

格式化純粹是呈現層面的。它不會讓查詢變快,也不會改變最佳化器生成的執行計劃。一個縮排優美的關聯子查詢,仍然是每行執行一次。效能問題請用 EXPLAIN,格式化只負責可讀性。

它同樣不做校驗。本工具的解析足以重排文本,但它不是資料庫引擎的解析器,一條列名拼錯或缺少連線條件的查詢,它照樣會格式化得漂漂亮亮。排版整潔不等於語法正確,唯一有權判定查詢是否有效的,是你打算執行它的那個資料庫。

有一個值得與格式化一起養成的習慣是引數化。把值直接拼進字串的查詢,格式化之後只是讓注入風險變得更易讀,風險本身分毫未減。如果你發現自己正在格式化一段把使用者輸入直接拼接進文本的 SQL,那麼首先需要修的顯然不是格式。

開源說明:格式化由 sql-formatter 提供,遵循 MIT 許可證。

常見問題

支援哪些 SQL 方言?
共 14 種:標準 SQL、MySQL、MariaDB、PostgreSQL、SQLite、SQL Server (T-SQL)、Oracle PL/SQL、IBM Db2、BigQuery、Snowflake、Redshift、Hive、Spark SQL 和 Trino。選對方言才能保住識別符號引用、型別轉換運算子等特有語法。
格式化會改變查詢的行為嗎?
不會。只有空白、換行和關鍵字大小寫發生變化,語義完全相同。關鍵字大小寫之所以安全,是因為 SQL 關鍵字本身大小寫不敏感;你的識別符號和字串字面量絕不會被改寫大小寫。
格式化能讓查詢跑得更快嗎?
不能。格式化隻影響呈現,最佳化器看到的是同一條語句。要最佳化效能,請在真實資料庫上執行 EXPLAIN 或 EXPLAIN ANALYZE 並檢視執行計劃。
我的 SQL 會被髮送到伺服器嗎?
不會。sql-formatter 完全在瀏覽器中執行,不傳輸任何內容。這一點在這裡尤其重要,因為真實查詢常常包含表名、庫表結構細節,有時還有來自生產環境的字面值。
為什麼我的查詢格式化失敗?
通常是引號或括號不配對,或者用錯方言解析了方言特有語法。請先把方言選擇器切換到與你的資料庫一致;如果仍然失敗,檢查是否有未閉合的字串字面量。
該用製表符還是空格?
都行,只要全團隊統一。空格在任何地方渲染都一致,把查詢粘進終端、工單或聊天工具時更省心;製表符則讓每位讀者在編輯器裡自選寬度。