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件のみを取得するクエリとして最も自然な構文はどれか。
- SELECT * FROM orders WHERE date = MAX(date)
- SELECT * FROM orders ORDER BY date DESC
- SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY date DESC) rn FROM orders) WHERE rn = 1
- 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 は集約後の他の列が取れません。