RunToolz iconRunToolz
Welcome to RunToolz!
SQL資料庫程式碼品質

可讀的 SQL 不是可選的

混亂的 SQL 查詢讓除錯變成噩夢。學習 SQL 格式化的最佳實踐,包括縮排規範、關鍵字大寫、JOIN 對齊等技巧,讓查詢程式碼清晰易讀。

RunToolz Team2026年1月28日4 min read

你繼承了一個查詢。它是一行。400 個字符。多個連接、子查詢和 CASE 陳述式都擠在一起。

祝你理解它好運。

SQL 格式化不是關於美學。而是關於查詢是否可維護。

密集 SQL 的問題

SELECT u.id,u.name,o.total,p.name FROM users u JOIN orders o ON u.id=o.user_id JOIN products p ON o.product_id=p.id WHERE o.created_at>'2024-01-01' AND u.status='active' ORDER BY o.total DESC;

連接條件在哪裡?過濾什麼?每個欄位來自哪個表?

現在想像在凌晨 2 點除錯這個。

想親自試試嗎?格式化 SQL

同一個查詢,可讀

SELECT
    u.id,
    u.name,
    o.total,
    p.name
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id
WHERE o.created_at > '2024-01-01'
    AND u.status = 'active'
ORDER BY o.total DESC;

每個子句都有自己的行。條件對齊。結構是可見的。

有效的格式化規則

每個子句一行。 SELECT、FROM、WHERE、ORDER BY 各自有自己的行。

欄位在單獨的行上。 長 SELECT 清單變得可掃描。

縮排繼續條件。 多個 WHERE 條件對齊。

大寫關鍵字。 SELECT、FROM、WHERE 從表名和欄位中脫穎而出。

一致的大小寫。 選擇一種樣式。堅持它。

子查詢格式化

子查詢很快變得混亂。清楚地縮排它們:

SELECT *
FROM orders
WHERE user_id IN (
    SELECT id
    FROM users
    WHERE status = 'premium'
)

或者當子查詢變得複雜時使用 CTE:

WITH premium_users AS (
    SELECT id
    FROM users
    WHERE status = 'premium'
)
SELECT *
FROM orders
WHERE user_id IN (SELECT id FROM premium_users)

CTE 通常比巢狀子查詢更清楚。

JOIN 格式化

總是指定連接類型。單獨的 JOININNER JOIN,但明確更好。

SELECT *
FROM orders o
INNER JOIN users u ON o.user_id = u.id
LEFT JOIN shipping s ON o.id = s.order_id

將連接條件放在同一行以進行簡單連接。對於複雜條件換到下一行。

效能呢?

格式化不影響執行。資料庫優化器不關心空白。

但格式化的 SQL 更容易優化。你可以看到結構,識別不必要的連接,發現缺失的索引。

無法閱讀的 SQL 隱藏效能問題。

團隊標準

選擇一種樣式。記錄它。使用自動格式化器強制執行。

存在不同的樣式。有些團隊將逗號放在行的開頭。有些將所有東西都大寫。有些不這樣做。

一致性比你選擇哪種樣式更重要。


每個查詢被讀取的次數比被寫入的次數多。為可讀性格式化。你的團隊成員——和你未來的自己——會感謝你。