ITの教科書検索
入門読了 約9分

SQLのJOIN(結合)とは ― 種類と使い分け

SQLのJOINは、分けて持つ複数の表を共通の列でつなぎ、必要な情報をまとめて取り出す操作です。INNER・LEFT・RIGHT・FULLの違いを、図で結果の行を比べて確かめられます。

目次
  1. JOINとは
  2. 4種類の違い
  3. 種類を選んで結果を見る
  4. 練習問題

JOINとは、2つ以上の表を共通の列でつなぐ操作

SQLのJOIN(結合)とは、2つ以上の表を、共通の列の値をもとにつなぐ操作です。RDB(リレーショナルデータベース)はデータを複数の表に分けて持ちます。そのため、顧客と注文のように分かれた表から情報をまとめて取り出すときに、JOINを使います。

例えば、顧客テーブルと注文テーブルがあるとします。注文テーブルは、どの顧客の注文かを外部キーの顧客IDで示します。顧客の氏名とその人の注文を同時に見たいときは、2つの表を顧客IDでJOINします。

JOINには複数の種類があり、一致しない行(相手が見つからない行)を結果に含めるかどうかが違います。書き方は、SELECT文のSELECT・FROM・WHEREに、JOINの指定が1つ加わる形です。

JOINは行を横につなぎ、列を増やします。同じ列を持つ2つの結果を縦につないで行を増やしたいときは、UNIONを使います。

INNER・LEFT・RIGHT・FULLの4種類は、残す行の範囲が違う

代表的なJOINには、INNER JOIN・LEFT JOIN・RIGHT JOIN・FULL JOINの4種類があります。違いは、どちらの表の行をどこまで残すかです。

JOINの4種類と、結果に残る行の範囲
種類別の書き方結果に残る行
INNER JOININNERを省いてJOINとだけ書いても同じ両方の表で顧客IDが一致する行だけ
LEFT JOINLEFT OUTER JOINとも書く左側(FROMの表)の行は全部。一致しない分は右側が空になる
RIGHT JOINRIGHT OUTER JOINとも書く右側(JOINの表)の行は全部。一致しない分は左側が空になる
FULL JOINFULL OUTER JOINとも書く両方の表の行が全部。一致しない分はどちらかが空になる

INNER JOINは、両方の表で値が一致する行だけを残し、一致しない行は結果から消えます。この結合を内部結合と呼びます。

LEFT JOINとRIGHT JOINは、一方の表の行を必ず残します。LEFT JOINはFROMの直後に書いた表(左側)、RIGHT JOINはJOINの直後に書いた表(右側)の行を全部残します。一致する相手がいない行は、もう一方の表の列を空(NULL)にして結果に残ります。この空の列をIS NULLで探す書き方は、SQLのNULLの記事で説明しています。

FULL JOINは、両方の表の行を全部残します。一致する相手がいない行は、どちらの表にあっても、空の列を付けて結果に加わります。LEFT JOIN・RIGHT JOIN・FULL JOINのように、一致しない行も残す結合を外部結合と呼びます。

RIGHT JOINとFULL JOINは、DBMSによって使えない場合があります。MySQLは、FULL JOINに対応していません。SQLiteは、2022年公開のバージョン3.39.0でRIGHT JOINとFULL JOINに対応しました。PostgreSQLやSQL Serverでは、4種類とも使えます。なお、RIGHT JOINで取り出す行は、2つの表の順番を入れ替えればLEFT JOINでも取り出せます。

顧客テーブル101 田中美咲102 佐藤健太103 鈴木大輔104 高橋愛注文テーブル5001 (顧客ID 101)5002 (顧客ID 101)5003 (顧客ID 102)5004 (顧客ID 103)5005 (顧客ID 106)顧客IDが一致一致する相手がいない行
顧客104は注文が無く、注文5005の顧客ID106は顧客テーブルに無いため、この2行には一致する相手がいません。どちらの行を結果に含めるかが、JOINの種類によって変わります。

JOINの種類を選んで、結果の行を見る

次の図でJOINの種類を選ぶと、SQL文と結果の表が変わります。どの種類も同じ顧客テーブルと注文テーブルを使います。図は実際のデータベースには接続しておらず、結果はあらかじめ計算した固定の値です。顧客104には注文が無く、注文5005の顧客ID106は顧客テーブルにありません。この2行の扱いが、種類ごとに変わります。

顧客テーブル

顧客ID氏名
101田中美咲
102佐藤健太
103鈴木大輔
104高橋愛

注文テーブル

注文ID顧客ID商品
5001101ノートPC
5002101モニター
5003102マウス
5004103キーボード
5005106デスク

色のついた行(顧客104・注文5005)は、もう一方の表に一致する顧客IDが無い行です。

SELECT c.顧客ID, c.氏名, o.注文ID, o.顧客ID AS 注文側顧客ID, o.商品
FROM 顧客 AS c
INNER JOIN 注文 AS o ON c.顧客ID = o.顧客ID;

両方の表で顧客IDが一致する行だけが残ります。注文が無い顧客104と、顧客がいない注文5005はどちらも消えます。

実行結果(4行)
顧客ID氏名注文ID注文側顧客ID商品
101田中美咲5001101ノートPC
101田中美咲5002101モニター
102佐藤健太5003102マウス
103鈴木大輔5004103キーボード

参考にした資料

練習問題(全5問)

Q1JOINの説明として最も適切なものはどれ?
Q2顧客テーブルと注文テーブルをINNER JOINしたとき、結果に残る行はどれ?
Q3顧客テーブル LEFT JOIN 注文テーブルとしたとき、注文が1件も無い顧客の行はどうなる?
Q4RIGHT JOINについて正しいものはどれ?
Q5FULL JOINの結果に出る行数が、INNER JOINの結果に出る行数より多くなるのはなぜ?

選んでから「採点する」を押すと、解説つきで答え合わせができます。

関連記事

おすすめの本 PR

セキュリティとデータベースは、基本情報技術者試験の対策本でまとめて学べます。

目的別の本の選び方を見る

データベースの記事を続けて読む

データベース 全36本中16本目