SQL 查詢撰寫
用 Claude 撰寫高效的 SQL 查詢 — 從簡單的 SELECT 到複雜的 JOIN、CTE 和效能優化。
你將學到什麼
- 如何提示 Claude 從你所需內容的自然語言描述撰寫 SQL 查詢
- 解釋你的 schema 讓 Claude 生成實際能在你的資料表上運行的查詢的技巧
- 如何使用 Claude 優化慢速查詢並理解查詢執行計劃
使用情境
SQL 是一個你了解語言和你善用它之間的差距是巨大的技能。你可能對撰寫基本的 SELECT 陳述式感到得心應手,但在窗函數、側向連接或遞迴 CTE 上卻舉步維艱。或者你知道你需要什麼數據,但不確定使用哪種連接類型,或如何用集合論邏輯表達業務需求。
Claude 非常擅長將業務需求翻譯成 SQL,因為它既理解自然語言又理解關係代數。你用自然語言描述你想要的——「給我每個地區 2026 年第一季前 10 名客戶的收入」——Claude 處理翻譯成帶有正確聚合、分組和過濾邏輯的可用查詢。
除了生成之外,Claude 在查詢優化方面也很出色。當查詢運行緩慢時,你可以分享查詢和執行計劃,請 Claude 識別瓶頸——缺少索引、全資料表掃描、低效的連接順序,或應該是 CTE 的子查詢。這種優化指導曾經需要隨時待命的 DBA。現在只需一次對話。
逐步指南
第一步:先分享你的 schema
在請求 SQL 查詢之前,你能做的最重要的事情是分享你的資料表結構。沒有了解你的 schema,Claude 無法寫出正確的 JOIN 條件、使用正確的欄位名稱,或正確處理數據類型。
你不需要貼上完整的 DDL 傾印。一個簡潔的 schema 描述就足夠了:
資料表:
- orders (id, customer_id, created_at, status, total_amount)
- customers (id, name, email, region, created_at)
- order_items (id, order_id, product_id, quantity, unit_price)
- products (id, name, category, cost_price)
資料庫:PostgreSQL 15
如果關係不明顯,添加外鍵關係:「orders.customer_id 引用 customers.id」。
第二步:用自然語言描述你的需求
用自然語言寫出你想要的,就像向同事解釋一樣。對以下方面要具體:
- 你想要返回什麼數據(欄位、計算)
- 要包含哪些記錄(過濾條件)
- 如何分組或聚合(每個群組的總和、計數、平均值)
- 如何排序以及你需要多少結果
範例:「我需要一個查詢,顯示每個客戶的訂單總數、總消費和平均訂單金額——但只針對 2025 年下了至少 3 個訂單的客戶。按總消費降序排列,並限制為前 20 名。」
第三步:指定你的 SQL 方言
SQL 方言的差異大到重要。提及你的資料庫:
- PostgreSQL、MySQL 8、SQLite、SQL Server、BigQuery、Snowflake、DuckDB 等。
每種資料庫都有不同的日期函數、字符串聚合、窗函數和 CTE 語法。在 PostgreSQL 上完美運行的查詢可能需要針對 MySQL 進行調整。
第四步:連同查詢一起請求解釋
Claude 生成查詢時,請它解釋方法——尤其是帶有多個 CTE、窗函數或子查詢的複雜查詢。理解結構幫助你在需求改變時調整它。
在你的提示中添加:「在查詢後,簡要解釋它的工作方式——尤其是窗函數或 CTE 結構等非顯而易見的部分。」
第五步:優化慢速查詢
對於優化,同時貼上慢速查詢和其執行計劃(PostgreSQL 中 EXPLAIN ANALYZE 的輸出、MySQL 中 EXPLAIN 等)。請 Claude:
- 識別計劃中最昂貴的操作
- 建議對查詢或 schema 的具體修改(索引、將子查詢重寫為連接等)
- 顯示優化後的版本
提示範本
資料庫:[PostgreSQL / MySQL / SQLite / 等]
Schema:
[資料表名稱] ([欄位1, 欄位2, ...])
[資料表名稱] ([欄位1, 欄位2, ...])
[任何重要的關係,例如「orders.customer_id 引用 customers.id」]
我需要的:
[你想要的數據的自然語言描述,包括:]
- 要包含哪些記錄(過濾)
- 如何聚合或分組(如果適用)
- 如何排序和限制結果
請為此撰寫一個高效的 SQL 查詢。在查詢後,簡要解釋它的工作方式。
對於查詢優化:
資料庫:[PostgreSQL / MySQL / 等]
我有一個慢速查詢。以下是它:
[貼上查詢]
執行計劃(EXPLAIN ANALYZE 輸出):
[貼上 EXPLAIN 輸出]
是什麼導致了慢速,你如何重寫查詢或添加索引來修復它?
技巧與最佳實踐
-
為了可讀性使用 CTE,而不只是正確性 — 當 Claude 生成複雜查詢時,請它使用 CTE(公共資料表運算式)將邏輯分解成命名步驟。這使查詢更容易理解、測試和修改。添加:「請使用 CTE 而不是嵌套子查詢來組織這個。」
-
請求邊界情況處理 — SQL 有尖銳的邊緣:聚合中的 NULL、計算欄位中的除以零、空群組。添加 「適當地處理 NULL 值並避免除以零錯誤」 從一開始就獲得強健的查詢。
-
請求索引建議 — 獲得查詢後,問:「哪些索引最能改善這個查詢的效能?請撰寫 CREATE INDEX 陳述式。」 這通常是可用的最高槓桿優化。
-
先用 LIMIT 測試 — 當 Claude 給你一個你還沒有運行過的查詢時,請它添加一個
LIMIT 100,這樣你可以在不運行昂貴的全掃描的情況下驗證輸出。一旦你確認了正確性,可以刪除限制。 -
用數據範例迭代 — 如果查詢沒有返回你期望的,分享樣本輸入數據和預期輸出。「給定 orders 中的這 3 行……我期望得到……但我得到的是……」 這讓 Claude 推理確切的行為,而不是猜測你的數據。
動手試試
想一個你需要從你工作的資料庫中獲取的報告或數據提取。用一段自然語言段落寫出你需要什麼——欄位、過濾條件、分組和排序順序。然後打開 Claude 並貼上:
「以下是我的資料庫 schema:[你的資料表]。我需要:[你的自然語言描述]。請為此撰寫一個 PostgreSQL 查詢,並解釋任何複雜的部分。」
運行查詢,檢查輸出,並使用後續提示精化它。