SQL 応用 — JOIN・サブクエリ・ウィンドウ関数

INNER/LEFT JOIN の使い分け、サブクエリの種類、ウィンドウ関数で実現するランキング・累計を整理。

AP の SQL は科目B問6で記述問題として出ます。INNER JOIN・LEFT JOIN・サブクエリ・GROUP BY ・HAVING を確実に書けるようにしましょう。

鳴海 理央(普段) 鳴海 理央

SQL の基本構文は SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY。
INNER JOIN は両表に存在する行のみ、LEFT JOIN は左表の全行を返します。

砂原 ニコ(しょんぼり) 砂原 ニコ

JOINいっぱいあって、こんがらがってきた…

緒方 ナオミ 先生(笑顔) 緒方 ナオミ 先生

ベン図で覚えると分かりやすいのよ。
INNER は重なり部分、LEFT は左の円すべて、RIGHT は右の円すべて、FULL OUTER は両方の円すべて、ということね。

例: INNER JOIN と LEFT JOIN の違い

-- 学生と履修科目を結合 (履修している学生だけ)
SELECT s.name, c.title
  FROM students s
  INNER JOIN courses c ON s.id = c.student_id;

-- すべての学生を表示 (履修なしは title が NULL)
SELECT s.name, c.title
  FROM students s
  LEFT  JOIN courses c ON s.id = c.student_id;
藤咲 まりあ(普段) 藤咲 まりあ

サブクエリ って何ですかぁ?

鳴海 理央(普段) 鳴海 理央

SELECT 文の中に別の SELECT 文を埋め込むことです。
WHERE 句の IN/EXISTS、FROM 句のインラインビュー、SELECT 句のスカラサブクエリなど、多彩な使い方があります。

緒方 ナオミ 先生(普段) 緒方 ナオミ 先生

ウィンドウ関数 は『集計しつつ行を保持する』高度機能。
ROW_NUMBER・RANK・SUM OVER (PARTITION BY ...) などを使い、ランキングや累計が1クエリで書けるわ。

確認クイズ

あるテーブル 'orders' から、顧客別に最新の注文1件のみを取得するクエリとして最も自然な構文はどれか。

  1. SELECT * FROM orders WHERE date = MAX(date)
  2. SELECT * FROM orders ORDER BY date DESC
  3. SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY date DESC) rn FROM orders) WHERE rn = 1
  4. SELECT customer_id, MAX(date) FROM orders GROUP BY customer_id
こたえを見る

正解: 3. SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY date DESC) rn FROM orders) WHERE rn = 1

顧客別に最新1件を取得するには、ウィンドウ関数で PARTITION BY customer_id ORDER BY date DESC で順位付けし、ROW_NUMBER = 1 の行を取り出すのが標準的。1 は WHERE で集約関数を使えず構文エラー、4 は集約後の他の列が取れません。

🔖 この記事の関連書籍

Amazonアソシエイトリンクを含みます。他分野は おすすめ書籍ページ へ。