query-builder について
Query Builder は、自然言語のデータに関する質問を SQL に変換するスキルです。データベースのスキーマを確認してからクエリを生成・実行し、探索的な操作の安全ルールも示します。
主な機能
- 01自然言語の条件を SQL に変換
- 02事前にテーブル構造と列型を確認
- 03絞り込み、結合、集計クエリの生成
- 04PostgreSQL、MySQL、SQLite の日付構文を提示
- 05探索クエリを制限し、未依頼の書き込みを回避
活用シーン
- 01指定期間に登録したユーザーの検索
- 02売上に基づく製品や顧客の順位付け
- 03顧客ごとの注文数の集計
- 04在庫数や金額でのレコード絞り込み
MCP 対応
このスキルの例では WhoDB の `whodb_tables`、`whodb_columns`、`whodb_query` ツールを使用します。入力には、その他の MCP 設定に関する説明はありません。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ clidey/ whodb --skill query-builderインストール後、Claude Code で/query-builderを入力して読み込まれたか確認します。
詳細
クエリビルダー
データベーススキーマを使って、自然言語の質問を SQL クエリに変換します。
使用するタイミング
ユーザーから次のような質問があった場合に有効にします。
- 「先月登録したユーザーをすべて表示して」
- 「100 ドルを超える注文を探して」
- 「在庫が少ない商品はどれ?」
- 「合計購入額が多い上位 10 人の顧客を取得して」
ワークフロー
1. スキーマを確認する
SQL を生成する前に、必ずテーブル構造を確認します。
whodb_tables(connection="...") → Get available tables
whodb_columns(table="relevant_table") → Get column names and types
2. 意図を特定する
自然言語のリクエストを解析します。
- 対象:どのエンティティですか?(ユーザー、注文、商品)
- フィルター:どの条件ですか?(先月、> 100 ドル、有効)
- 集計:件数、合計、平均、最大値、最小値のどれですか?
- グループ化:どの軸でグループ化しますか?
- 並べ替え:何で並べ替えますか?昇順ですか、降順ですか?
- 上限:結果はいくつ必要ですか?
3. スキーマに対応付ける
- エンティティをテーブル名に対応付けます
- 属性をカラム名に対応付けます
- 必要な外部キー結合を特定します
4. SQL を生成する
SQL のベストプラクティスに従ってクエリを作成します。
SELECT columns
FROM table
[JOIN other_table ON condition]
WHERE filters
[GROUP BY columns]
[HAVING aggregate_condition]
ORDER BY column [ASC|DESC]
LIMIT n;
5. 実行して結果を提示する
whodb_query(query="generated SQL")
変換パターン
| 自然言語 | SQL パターン |
|---|---|
| 「先週/先月/昨年」 | WHERE date_col >= DATE_SUB(NOW(), INTERVAL 1 WEEK) |
| 「X より多い」/「X を超える」 | WHERE col > X |
| 「上位 N 件」 | ORDER BY col DESC LIMIT N |
| 「いくつ」 | SELECT COUNT(*) |
| 「合計」/「〜の合計」 | SELECT SUM(col) |
| 「平均」 | SELECT AVG(col) |
| 「それぞれ」/「〜ごと」 | GROUP BY col |
| 「X から Y の間」 | WHERE col BETWEEN X AND Y |
| 「含む」/「〜のような」 | WHERE col LIKE '%term%' |
| 「〜で始まる」 | WHERE col LIKE 'term%' |
| 「空」/「NULL」 | WHERE col IS NULL |
| 「空ではない」 | WHERE col IS NOT NULL |
データベースごとの日付処理
PostgreSQL
WHERE created_at >= NOW() - INTERVAL '7 days'
WHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)
MySQL
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
WHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')
SQLite
WHERE created_at >= DATE('now', '-7 days')
WHERE created_at >= DATE('now', 'start of month')
例
「今月登録したユーザーを表示して」
SELECT * FROM users
WHERE created_at >= DATE_TRUNC('month', CURRENT_DATE)
ORDER BY created_at DESC;
「売上上位 5 件の商品を探して」
SELECT p.name, SUM(oi.quantity) as total_sold
FROM products p
JOIN order_items oi ON p.id = oi.product_id
GROUP BY p.id, p.name
ORDER BY total_sold DESC
LIMIT 5;
「顧客ごとの注文数は?」
SELECT customer_id, COUNT(*) as order_count
FROM orders
GROUP BY customer_id
ORDER BY order_count DESC;
安全ルール
- 調査用のクエリでは必ず LIMIT を使用します(デフォルト:100)
- 明示的に依頼されない限り、DELETE、UPDATE、DROP は生成しません
- クエリが大量の結果を返す可能性がある場合は警告します
- JOIN では読みやすさのためにテーブルエイリアスを使用します
コメント
Markdown 対応