データベース・SQL入門 第3回:複数のテーブルをガッチャンコ!「結合」と「副照会」をマスターしよう
これまでの連載で、1つのテーブルから必要なデータを絞り込んだり、集計したりする方法を学んできました。
しかし、リレーショナルデータベース(RDB)の本当の力はここからです。RDBでは、データを1つの巨大な表にするのではなく、目的ごとに複数の表(テーブル)に分割して管理するのが基本です 。
例えば、顧客情報を管理する「KOKYAKU(顧客)」テーブルと、注文の履歴を管理する「JUCHU(受注)」テーブルといった具合です 。データを分割することで重複を防ぎ、スッキリと管理できます(これをデータの「正規化」と呼びます) 。
今回は、バラバラに管理されているテーブルを繋ぎ合わせ、意味のあるデータとして取り出すための魔法「結合(JOIN)」と「副照会(サブクエリ)」について解説します!
1. 両方に共通するデータだけを繋ぐ「内部結合(INNER JOIN)」
テーブル同士を繋ぐための最も基本的な方法が「内部結合」です 。これは、2つのテーブルの両方に存在する共通のキー(例えば「顧客ID」など)を使って、ピッタリ一致するデータだけを合体させます 。
例えば、「誰が、いつ注文したか」を知るために、顧客テーブルと受注テーブルを繋げてみましょう。
SELECT KOKYAKU.ID, NAME, DENPYO, JDATE
FROM KOKYAKU
INNER JOIN JUCHU
ON KOKYAKU.ID = JUCHU.ID;INNER JOIN:ここで繋ぎ合わせるテーブル(JUCHU)を指定します 。
ON:テーブルを繋ぐための「条件」を指定します 。ここでは、両方のテーブルにある ID が一致するものを紐付けています 。
このコードを実行すると、注文履歴がある顧客の名前と、その受注日(JDATE)が横に並んだ美しい表が出来上がります 。
2. 一方のデータをすべて残す「外部結合(OUTER JOIN)」
内部結合は「両方にデータがあるもの」だけを残しますが、「まだ一度も注文をしていない顧客も含めて、全員のリストを出したい」というケースもあります。
そんな時に活躍するのが「外部結合(OUTER JOIN)」です 。特に、左側のテーブル(最初に FROM で指定したテーブル)のデータをすべて残す「左外部結合」をよく使います 。
SELECT * FROM KOKYAKU
LEFT JOIN JUCHU
ON KOKYAKU.ID = JUCHU.ID;LEFT JOIN(または LEFT OUTER JOIN)を使うと、受注履歴がない顧客もリストから消えずに表示されます 。その場合、受注日などのデータがない部分は「空欄(NULL)」として出力されます 。
3. 検索結果を使ってさらに検索する「副照会(サブクエリ)」
テーブルを結合する以外にも、複数のテーブルをまたいで検索するテクニックがあります。それが「副照会(サブクエリ)」です 。
これは、「SQL文の中に、もう一つのSQL文を入れる」という少し高度な技です。
例えば、「『新宿クラウド』という顧客が注文した商品のIDを知りたい」としましょう。これを一発で出すために、カッコ ( ) を使ってSQLを入れ子にします。
SELECT DENPYO, JDATE
FROM JUCHU
WHERE ID = (
SELECT ID
FROM KOKYAKU
WHERE NAME = '新宿クラウド'
);まず、内側のSQL(カッコの中)が実行され、「新宿クラウド」の顧客ID(例:MC001)が導き出されます。
次に、その結果を使って外側のSQLが実行され、該当するIDの伝票番号(DENPYO)と受注日(JDATE)が取り出されます。
このように、別の検索結果を条件として使いたい時にサブクエリは非常に強力な武器になります。
まとめ
今回は、少しステップアップして以下の2つを学びました。
結合(JOIN):キーを使って複数のテーブルを横にガッチャンコする。ピッタリ合うものだけの INNER JOIN と、片方を残す LEFT JOIN がある。
副照会(サブクエリ):SQLの中に別のSQLを入れ子にして、検索結果を条件として再利用する。
この「結合」が自由にできるようになれば、あなたはもう立派なSQL使いです!
次回は最終回として、データの「追加(INSERT)」「更新(UPDATE)」「削除(DELETE)」といった、データを操作・管理する方法について解説します。お楽しみに!
いいなと思ったら応援しよう!
よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!