はじめに
以前の初記事投稿からもう3年が経ってしまいました・・!
あれから多少書けるようになったとはいえ、まだまだ知識や応用力には自信がない今日この頃です![]()
そこで今回はGeminiにSQLのコーチになってもらい、学習のサポートをしてもらいました。
以下に実行した内容をまとめさせていただきます。
まずはパートナーとなる「AIコーチ」を召喚します
最強のAIコーチを召喚するには、ただ漫然と質問するのではなく、Geminiに明確な「役割(ペルソナ)」を与えることが重要だと聞きましたので、今回は、「厳しくも的確なアドバイスをくれるベテランDBエンジニア」 をイメージしてプロンプトを作成しました。
実際に使ったプロンプトは以下の通りです。
プロンプト
あなたは実務経験豊富なシニア・データベースエンジニアです。私はSQLの基礎は理解していますが、応用力やパフォーマンスを意識したクエリ作成に自信がありません。
今から私が書くクエリに対して、以下の観点でレビューとフィードバックを行ってください。
1. 正確性(意図したデータが取れるか)
2. パフォーマンス(インデックスが効くか、無駄な処理がないか)
3. 可読性(他のメンバーが見て分かりやすいか)
必要であれば、より良い書き方のサンプルコードとその理由を提示してください。
ケーススタディ
ウィンドウ関数
「カテゴリごと(ドリンク、フード、デザートなど)の人気メニューランキングを出したい」という要件で実施してみます。
私が書いたコード(Before)
SELECT
c.category_name,
m.menu_name,
s.total_sold
FROM menu_items m
JOIN categories c ON m.category_id = c.id
JOIN sales_summary s ON m.id = s.menu_id
WHERE s.total_sold = (
SELECT MAX(total_sold)
FROM sales_summary s2
JOIN menu_items m2 ON s2.menu_id = m2.id
WHERE m2.category_id = c.id
);
これをAIコーチに投げると、即座にフィードバックが返ってきました。
AIコーチからの指摘
サブクエリを使ったアプローチも間違いではありませんが、以下の点で改善の余地があります。
- 可読性:
WHERE句の中にさらに集計ロジックが入っており、一目で意図が伝わりにくいです。- 柔軟性: 「各カテゴリのトップ3まで出したい」となった場合、この書き方では対応が困難です。
現代のSQLでは、
RANK()やDENSE_RANK()などのウィンドウ関数を使うのが一般的です。
提案されたコード(After)
SELECT
category_name,
menu_name,
total_sold,
ranking
FROM (
SELECT
c.category_name,
m.menu_name,
s.total_sold,
-- カテゴリごとに区切って(PARTITION BY)、販売数が多い順に順位をつける
RANK() OVER (PARTITION BY c.id ORDER BY s.total_sold DESC) as ranking
FROM menu_items m
JOIN categories c ON m.category_id = c.id
JOIN sales_summary s ON m.id = s.menu_id
) as ranked_data
WHERE ranking <= 3; -- ここを変えるだけでTop1もTop3も自由自在!
解説文には PARTITION BY(仕切り)の意味や、WHERE ranking <= 3 とするだけで簡単に抽出範囲を変えられる柔軟性について丁寧に添えられていました。
AIコーチ、めちゃくちゃ丁寧で優しい・・!
AIコーチとの関わり方
今回のAIコーチとの特訓を通じて、インプットに非常に有益だと感じました!
非エンジニアでもこの方法であれば自身のペースでカジュアルに学ぶことができると思います。
その上で、以下のことを意識して学習しています。
-
まず自分で考える
- いきなり答えを聞かず、ロジックを考える。
-
AIコーチに壁打ちする
- 自分の考えをアウトプットし、より良い方法がないか聞いてみる。
-
回答を深掘りする
- 提案されたコードに対して「なぜこの関数を使ったか」「他にも良い方法はないか」と質問を重ね、しっかりと情報をインプットする
まとめ
これからSQLを学ぶ方も、すでに使っている方も、ぜひ生成AIをコード生成や検索ツールとして使う以外にも、「専属の学習コーチ」として伴奏してもらうことも選択肢に入れてみてはいかがでしょうか!