SQLクエリ作成
Claudeで効率的なSQLクエリを作成 — 基本的なSELECTから複雑なJOIN、CTE、パフォーマンス最適化まで。
学べること
- 必要なものの平易な言語の説明からSQLクエリを書くためのClaudeへのプロンプト方法
- Claudeが実際のテーブルに対して実行するクエリを生成できるよう、スキーマを説明するテクニック
- 遅いクエリを最適化してクエリ実行計画を理解するためのClaude活用方法
ユースケース
SQLは言語を知ることとそれをうまく使う方法を知ることの間のギャップが大きいスキルの一つです。基本的なSELECT文は快適でも、ウィンドウ関数、ラテラルジョイン、再帰的なCTEには苦労するかもしれません。または必要なデータは分かるが、使うべきジョインの種類が分からない、またはビジネス要件を集合ベースのロジックで表現する方法が分からないかもしれません。
Claudeはビジネス要件をSQLに変換することに非常に優れています。なぜなら自然言語と関係代数の両方を理解するからです。平易な英語で必要なものを説明——「2026年のQ1で各地域ごとに収益でトップ10の顧客を見せてください」——と、Claudeは適切な集計、グルーピング、フィルタリングロジックを備えた動作するクエリに翻訳します。
生成を超えて、ClaudeはクエリのSQLの最適化に優れています。クエリが遅く動作しているとき、クエリと実行計画を共有して、ボトルネックを特定するようClaudeに依頼できます——欠けているインデックス、フルテーブルスキャン、非効率なジョイン順序、またはCTEにすべきサブクエリ。この種の最適化ガイダンスはかつてDBAsのオンコールを必要としていました。今は会話です。
ステップバイステップガイド
ステップ1:まずスキーマを共有する
SQLクエリを依頼する前にできる最も重要なことは、テーブル構造を共有することです。Claudeはスキーマを知らなければ正しいJOIN条件を書いたり、正しい列名を使ったり、データ型を適切に処理したりできません。
完全なDDLダンプを貼り付ける必要はありません。簡潔なスキーマの説明で十分です:
Tables:
- 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)
Database: PostgreSQL 15
明白でない場合は外部キーの関係を追加しましょう:「orders.customer_idはcustomers.idを参照します」。
ステップ2:必要なものを平易な言語で説明する
同僚に説明するように、自然言語で必要なものを書き出しましょう。以下について具体的にしましょう:
- 必要なデータ(列、計算)
- 含めるレコード(フィルタリング条件)
- グループ化または集計の方法(グループごとの合計、カウント、平均)
- 並べ替え方法と必要な結果数
例:「各顧客について、注文の総数、総支出、平均注文金額を示すクエリが必要です——ただし2025年に少なくとも3件の注文をした顧客のみ。総支出の降順で並べ替え、上位20に制限してください。」
ステップ3:SQLの方言を指定する
SQLの方言は十分に異なるため重要です。データベースを言及しましょう:
- PostgreSQL、MySQL 8、SQLite、SQL Server、BigQuery、Snowflake、DuckDB など
各々は日付関数、文字列集計、ウィンドウ関数、CTEなどで異なる構文があります。PostgreSQLで完璧に動作するクエリはMySQLで調整が必要かもしれません。
ステップ4:クエリとともに説明を依頼する
ClaudeがクエリSQLを生成したら、アプローチを説明するよう依頼しましょう——特に複数のCTE、ウィンドウ関数、またはサブクエリを含む複雑なクエリについて。構造を理解することで、要件が変わったときに適応するのに役立ちます。
プロンプトに追加しましょう:「クエリの後に、その仕組みを簡単に説明してください——特にウィンドウ関数やCTEの構造などの自明でない部分。」
ステップ5:遅いクエリを最適化する
最適化のために、遅いクエリとその実行計画(PostgreSQLのEXPLAIN ANALYZE、MySQLのEXPLAINなどのアウトプット)の両方を貼り付けましょう。Claudeに依頼しましょう:
- 計画における最も高価な操作を特定する
- クエリまたはスキーマへの特定の変更(インデックス、サブクエリをジョインに書き換えるなど)を提案する
- 最適化されたバージョンを示す
プロンプトテンプレート
Database: [PostgreSQL / MySQL / SQLite / など]
Schema:
[テーブル名] ([column1, column2, ...])
[テーブル名] ([column1, column2, ...])
[重要な関係、例:「orders.customer_idはcustomers.idを参照します」]
必要なもの:
[以下を含む必要なデータの平易な言語の説明:]
- 含めるレコード(フィルタリング)
- 集計またはグループ化の方法(適用可能な場合)
- 並べ替えと結果の制限方法
このための効率的なSQLクエリを書いてください。クエリの後に、その仕組みを簡単に説明してください。
クエリの最適化の場合:
Database: [PostgreSQL / MySQL / など]
遅いクエリがあります。こちらです:
[クエリを貼り付けてください]
実行計画(EXPLAIN ANALYZEのアウトプット):
[EXPLAINのアウトプットを貼り付けてください]
遅さの原因は何で、修正するためにクエリを書き直すかインデックスを追加するにはどうすればよいですか?
ヒントとベストプラクティス
-
読みやすさのためだけでなく正確さのためにCTEを使う — Claudeが複雑なクエリを生成したら、ネストされたサブクエリではなくCTE(共通テーブル式)を使ってロジックを名前付きステップに分解するよう依頼しましょう。これによりクエリが理解、テスト、修正するのがはるかに容易になります。追加しましょう:「ネストされたサブクエリではなくCTEを使ってこれを構成してください。」
-
エッジケースの処理を依頼する — SQLには鋭いエッジがあります:集計でのNULL、計算列での0除算、空のグループ。*「NULL値を適切に処理し、0除算エラーを避けてください」*を追加して、最初から堅牢なクエリを得ましょう。
-
インデックスの推奨を依頼する — クエリを得たら尋ねましょう:*「このクエリのパフォーマンスを最も改善するインデックスは何ですか?CREATE INDEX文を書いてください。」*これはしばしば利用可能な最も影響力の高い最適化です。
-
まずLIMITでテストする — Claudeが以前に実行したことのないクエリを与えたら、高価なフルスキャンを実行せずにアウトプットを検証できるよう
LIMIT 100を追加するよう依頼しましょう。正確さを確認したらリミットを削除できます。 -
データの例で反復する — クエリが期待するものを返さない場合は、サンプルの入力データと期待するアウトプットを共有しましょう。*「ordersにこれら3つの行が与えられた場合…私は期待していますが…実際には得ています…」*これにより、Claudeはデータを推測するのではなく正確な動作について推論できます。
試してみよう
作業しているデータベースから必要なレポートまたはデータエクストラクトを考えましょう。列、フィルター、グループ化、ソート順を含む1段落の平易な言語でそれを書き出しましょう。次にClaudeを開いて貼り付けましょう:
「これは私のデータベースのスキーマです:[あなたのテーブル]。必要なもの:[あなたの平易な言語の説明]。このためのPostgreSQLクエリを書いて複雑な部分を説明してください。」
クエリを実行し、アウトプットを確認して、フォローアップのプロンプトで改善しましょう。