コンテンツへスキップ
ホーム » 記事一覧 » SQLのJOINとは?表をつなぐ仕組みと使い方を初心者向けに解説

SQLのJOINとは?表をつなぐ仕組みと使い方を初心者向けに解説

見出し「SQLのJOINとは?」と2つの小さな表をつなぐイラスト。16:9、重要要素は中央3:2。alt案:SQLのJOINで2つの表の情報を組み合わせるイメージ。

「注文一覧には顧客番号しかなく、誰の注文なのか分からない」

そんなときに使うのが、SQLのJOIN(ジョイン)です。別の表にある顧客名を、注文情報と一緒に取り出せます。

SQLは、データベースに保存したデータを取り出したり、更新したりするための言語です。この記事では、顧客と注文の小さな表を使って、JOINの意味と基本的な書き方を説明します。

💡 このページでわかること

  • JOINで表をつなぐとは、どういうことか
  • INNER JOINとLEFT JOINで、結果がどう変わるか
  • ONに書く条件の意味と、結果を読むときの注意点

SQLのJOINとは?別の表にある情報を組み合わせる仕組み

JOINとは、表の行どうしを組み合わせて、必要な情報を一緒に取り出すためのSQLの仕組みです。日本語では「結合」と呼びます。

データベースでデータを保存する表を「テーブル」といいます。横の1件分が「行」、顧客名や注文番号などの項目が「列」です。

たとえば、ネットショップでは次の情報を別々のテーブルで管理できます。

  • 顧客テーブル:顧客番号、名前など
  • 注文テーブル:注文番号、注文した顧客の番号など

注文のたびに顧客の情報をすべて書き写すのではなく、番号で対応を示しておく形です。名前を一緒に見たいときは、JOINで対応する行を組み合わせます。

この記事で使うSELECT文のJOINは、検索結果を組み立てるものです。元のテーブルを1つに作り替えたり、保存している値を書き換えたりはしません。

具体例:顧客一覧と注文一覧を番号でつなぐ

次の2つのテーブルがあるとします。英語の名前は、後ほどSQLに書くテーブル名・列名です。

customers(顧客テーブル)

customer_id(顧客番号)customer_name(顧客名)
1佐藤
2鈴木
3田中

orders(注文テーブル)

order_id(注文番号)customer_id(顧客番号)
1011
1021
1032

注文番号101の顧客番号は「1」です。顧客テーブルで番号1を探すと、名前は「佐藤」と分かります。注文番号102も佐藤さん、103は鈴木さんの注文です。

このように、「顧客番号が同じ行を組み合わせる」という条件で、注文番号と顧客名を一緒に取り出します。

田中さんの顧客情報はありますが、今回の注文テーブルに田中さんの注文はありません。この違いが、JOINの種類を選ぶポイントになります。

顧客3行と注文3行を並べ、顧客番号1から注文101・102、2から103へ対応を示す。田中には注文がない。alt案:顧客番号を手がかりに、佐藤と注文101・102、鈴木と注文103を対応付ける図。

INNER JOIN:両方の表に対応する行があるものを取り出す

INNER JOIN(インナージョイン/内部結合)は、指定した条件に合う行の組み合わせだけを取り出します。今回なら、注文がある顧客と、その注文を表示できます。

SELECT customers.customer_name, orders.order_id
FROM customers
INNER JOIN orders
  ON customers.customer_id = orders.customer_id
ORDER BY orders.order_id;

結果は次の3行です。

customer_nameorder_id
佐藤101
佐藤102
鈴木103

田中さんは、条件に合う注文の行がないため、結果に含まれません。

このSQLは、上で示したテーブルとデータが用意されている前提です。実行する場合は、学習用データベースに接続したツールのSQL入力画面を使います。SQLを貼るだけで、例のテーブルが自動作成されるわけではありません。

SELECT・FROM・ONは、それぞれ何を指定している?

SQLを部分ごとに見ると、次の意味になります。

書く部分この例での意味
SELECT結果に表示する顧客名と注文番号を選ぶ
FROM customers顧客テーブルを指定する
INNER JOIN orders注文テーブルと、条件に合う行どうしを組み合わせる
ON customers.customer_id = orders.customer_id両方の顧客番号が等しいことを、組み合わせる条件にする
ORDER BY orders.order_id結果を注文番号の小さい順に並べる

customers.customer_id は「customersテーブルのcustomer_id列」という書き方です。両方のテーブルに同じ名前の列があるため、どちらの列か分かるようにしています。

この例のONは、どの行どうしを組み合わせるかを決める部分です。JOINとONを使うこの書き方では、列名が同じだから自動でつながるのではなく、ONに書いた条件で対応を判断します。

LEFT JOIN:対応する注文がなくても顧客を残す

LEFT JOIN(レフトジョイン/左外部結合)は、結合の段階で左側のテーブルの行をすべて残し、右側から条件に合う行を組み合わせます。

今回の書き方では、FROMの後のcustomersが左側、LEFT JOINの後のordersが右側です。「注文がない人も含め、顧客を全員表示したい」ときに使えます。

SELECT customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders
  ON customers.customer_id = orders.customer_id
ORDER BY customers.customer_id, orders.order_id;
customer_nameorder_id
佐藤101
佐藤102
鈴木103
田中NULL

結果は4行です。田中さんも表示され、対応する注文がないため、注文番号の部分はNULLになります。

NULL(ヌル)は、値がない・不明であることを表すものです。数値の0や、文字が一つも入っていない文字列(空文字)と同じ意味ではありません。

この例では、対応する注文の行がないため、結果の注文番号がNULLになります。使用するツールによっては空欄で表示されますが、空文字が入っているという意味ではありません。

INNER JOINとLEFT JOINは、何を残したいかで選ぶ

やりたいこと選ぶJOIN今回の結果
注文がある顧客と注文を表示したいINNER JOIN佐藤さんの2行と鈴木さんの1行
注文がない顧客も含めて表示したいLEFT JOIN上の3行に田中さんの1行が加わる

迷ったら、「対応するデータがない行も残したいか」を考えてみましょう。

INNERの結果3行とLEFTの結果4行を比較。田中・NULLの追加を強調。alt案:INNER JOINでは注文がある顧客の3行、LEFT JOINでは田中とNULLの行を含む4行が表示される比較。

JOINはどんな場面で使われる?

JOINは、別々に保存している情報を、画面や一覧で一緒に見たいときに使います。

場面組み合わせる情報一緒に見られる内容
ネットショップの注文確認顧客と注文誰がどの注文をしたか
社内の社員一覧社員と部署社員がどの部署に所属しているか
図書館の貸出確認本と貸出記録どの本がいつ貸し出されたか

どの場面でも、まず「どの情報を一緒に見たいか」を決めます。そのうえで、顧客番号や部署番号など、正しい相手を探せる項目を確認します。

JOINで初心者が注意したいこと

同じ人が複数行に出ても、間違いとは限らない

佐藤さんは注文が2件あるため、結果にも2行出てきます。JOINは「顧客1人につき1行にまとめる」という意味ではありません。

条件に合う相手が複数あれば、その組み合わせごとに結果が出ます。「同じ名前が並んでいる」という理由だけで、不要な重複と判断しないようにしましょう。

名前や列名だけで結合条件を決めない

同姓同名の人がいると、名前が同じという条件だけでは別の人の注文まで組み合わさるおそれがあります。今回の例では、顧客ごとに異なる番号を使います。

また、customersのcustomer_idとordersのorder_idは、どちらも番号ですが意味が違います。顧客番号と注文番号を比べても、正しい対応にはなりません。

結果が予想より多い・少ないときは、ONに指定した列と、その値の対応を確認してください。

LEFT JOINの後にWHEREを付けると、残した行が消えることがある

WHEREは、結果に残す行を条件で絞るための部分です。

たとえば、先ほどのLEFT JOINに、注文番号を101に絞る条件を加えてみます。WHEREはORDER BYの前に書きます。

SELECT customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders
  ON customers.customer_id = orders.customer_id
WHERE orders.order_id = 101
ORDER BY customers.customer_id, orders.order_id;

結果は次の1行です。

customer_nameorder_id
佐藤101

WHEREで残るのは、条件が成り立つ行だけです。田中さんの注文番号はNULLなので、101と等しいとは判定されず、結果から除かれます。佐藤さんの注文102と鈴木さんの注文103も、101ではないため除かれます。

LEFT JOINでも、WHEREの条件によっては、注文がない顧客が結果から除かれます。 ONは行を組み合わせる条件、WHEREは結合後の行を絞る条件です。LEFT JOINでは、同じ条件でもONとWHEREのどちらに書くかで結果が変わることがあります。

JOINのよくある疑問

JOINとINNER JOINは同じですか?

JOIN orders ON ... のように、種類を付けずにJOINと書いた場合はINNER JOINの意味になります。最初はINNER JOINと書くと、どの結合を使っているか確認しやすくなります。

左側のテーブルを入れ替えるとどうなりますか?

LEFT JOINでは、残す対象が変わります。今回の例で FROM orders LEFT JOIN customers と書くと、すべて残す対象は注文です。注文がない田中さんを表示する目的には合いません。

RIGHT JOINなど、ほかの種類も覚える必要がありますか?

右側の行をすべて残すRIGHT JOINや、左右両方の行を残すFULL OUTER JOINなどもあります。使える種類はデータベース製品によって異なります。

まずは、INNER JOINとLEFT JOINで「対応しない行を残すかどうか」の違いを理解すると、ほかの種類も読みやすくなります。

まとめ・関連記事

JOINは、別のテーブルにある情報を組み合わせて取り出すための仕組みです。ONで行どうしの対応を指定します。

  • INNER JOIN:条件に合う行の組み合わせだけを取り出す
  • LEFT JOIN:結合の段階では左側の行を残し、対応する相手がいない右側の項目はNULLになる
  • 相手が複数ある場合は、同じ顧客が複数行に出ることもある

まずは今回の表を見ながら、「田中さんを結果に残すならどちらを使うか」「佐藤さんが2行になるのはなぜか」を確認してみてください。

SQLの役割や、SELECT文の読み方から確認したい方には、次の記事が役立ちます。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です