seegongsik
データ

わかりやすく SQL JOIN とは

注文の表には、だれが何を買ったかが書いてありますが、「だれ」は顧客番号でしか分かりません。その番号の人の名前は、別の顧客の表にあります。では、この注文をした人の名前はどうやって調べればよいのでしょうか。二つの表のどちらにも入っている顧客番号を手がかりに、番号が同じ行どうしを組にすればよいのです。このように、共通の列で散らばった表をつなぐことをジョインといいます。

01

情報が二つの表に分かれています

前のレッスンでは、SQLで一つの表に尋ねて、ほしい行を取り出しました。でも、実際のデータベースでは、必要な情報が一つの表に全部そろっていることはあまりありません。お店なら、注文は注文の表に書き、お客さんの名前や連絡先は顧客の表に別に書いておきます。
わざとそう分けているのです。注文が入るたびにお客さんの名前と連絡先を行ごとに書き直すと、同じ内容が何度も積み重なり、連絡先が変われば、その行をすべて探して直さなければなりません。まず、二つの表を並べて開いてみましょう。

押して開く
押して開く
表の見出しを押して開きましょう

表の見出しを押して、一つずつ開いてみましょう。注文の表と顧客の表が、それぞれ別の列を持っているのが分かります。

開いてみると、二つの表の役目はちがいます。注文の表には注文番号、顧客番号、品物があり、顧客の表には顧客番号と名前があります。注文の表だけでは、鉛筆を買った人については番号しか分かりません。
「鉛筆を買った人の名前は?」という問いは、表をまたぎます。品物はこちらの表に、名前はあちらの表にあるので、二つをつながないと答えが出ません。まず、つなぐ手がかりがどこにあるかを探しましょう。

02

二つの表が共通して持つ列を探す

二つの表の列名を並べてみると、両方にあるものが一つあります。顧客番号です。顧客の表では、顧客番号はお客さん一人ずつに、ほかと重ならない番号としてついているので、番号さえ分かればどのお客さんかがはっきり決まります。
注文の表の顧客番号は、その番号をそのまま書き写したものです。そのため、顧客の表の顧客番号を主キー、それを指す注文の表の顧客番号を外部キーと呼びます。二つの表が共通して持つこの列が、二つをつなぐ橋になります。

注文の表顧客の表
二つの表が共通して持つ列を選びましょう

列名を一つずつ押してみましょう。両方の表にある列を選ぶと光り、片方の表にしかない列を選ぶと、どちらの表にしかないかを教えてくれます。

品物は注文の表だけに、名前は顧客の表だけにありました。両方の表にある列は、顧客番号の一つだけです。
この列の値が同じなら、二つの行は同じお客さんを指しています。注文の表の顧客番号7と顧客の表の顧客番号7は、同じ人、ハジュンです。ですから、この列を道しるべにして、行どうしを組み合わせればよいのです。

03

同じ番号どうしを組み合わせる

組み合わせ方は単純です。注文の表から一行選んでその顧客番号を読み、顧客の表で同じ顧客番号を持つ行を探します。番号が同じなら、二つの行は組です。
一人のお客さんが何度も注文することもあります。そのときは、注文の表のいくつもの行が、顧客の表の同じ一行を指します。下で鉛筆の注文と消しゴムの注文を順に押すと、どちらも同じお客さんにつながります。お客さん一人に注文がいくつもつく、このような関係を一対多といいます。

注文の表
顧客の表
3|ミンソ
7|ハジュン
注文の行を押して、組の相手を探しましょう

注文の表の行を押してみましょう。同じ顧客番号を持つ顧客の表の行が光り、その注文がだれのものかが下に出ます。

番号だけだった注文に、今は人の名前がついてきます。鉛筆と消しゴムの注文はどちらもハジュンに、ノートの注文はミンソにつながりました。
データベースは、これを行ごとにくり返します。主キーにはふつう索引が自動でつくので、表が大きくても、顧客の表から組の相手を素早く見つけられます。では、見つけた組を一行にまとめると、どんな表になるでしょうか。

04

組にした行を一つの表にまとめる

組にした二つの行を横に並べると、列の増えた新しい行になります。注文の列の横にそのお客さんの列が並び、両方の表にあった顧客番号は一度だけ置きます。こうしてできた行を集めると、何を買ったかとだれが買ったかが同じ行に入った、結果の表ができます。
SQLでは、二つの表の名前の間にJOINと書き、どの列どうしの値が同じであるべきかをONで書きます。前のレッスンのSELECTやWHEREも、そのままいっしょに使えます。

顧客番号
品物
7
鉛筆
3
ノート
7
消しゴム
顧客番号
名前
7
ハジュン
3
ミンソ
7
ハジュン
まとめるを押して、二つの表を一つにつなぎましょう

まとめるボタンを押してみましょう。二つの表が顧客番号をもとに一行ずつつながり、何をだれが買ったかが一つの表に集まります。もう一度押すと、元のように分かれます。

結果の表には、ハジュンという名前が二度出てきます。それでも、顧客の表ではハジュンは今も一行だけで保存されています。名前が重なるのは、問いに答えるために一時的に作った結果の表だけで、保存されている表はそのままです。
組のない行は結果から外れることも、覚えておきましょう。まだ一度も注文していないお客さんが顧客の表にいても、組にする注文がないので、基本のジョインの結果には出てきません。組のない行まで残したいときに使うジョインは、別にあります。

05

まとめ

まとめるとこうです。データベースは、同じ情報を何度も書かないように、情報をいくつかの表に分けて持っています。表をまたぐ問いに答えるには、二つの表が共通して持つ列を探し、その列の値が同じ行どうしを組にして横に並べます。
すると、一つの表のように読める結果の表ができます。分けて保存し、尋ねるときにつなぐ。これがジョインです。

要点を順に押して振り返りましょう

要点を順に押して振り返りましょう。(表が二つ → 共通の列を探す → 共通の列で組み合わせる → 一つの表にまとめる)

これで、散らばった表を共通の列でつないで尋ねられるようになりました。表を分けておいても、答えを得るのには困らないということです。
では、表はどんな基準で分ければよいのでしょうか。お客さんの名前を注文ごとに書くと何が困るのか、重なる情報をどう減らすのかを、次のレッスン「正規化」で扱います。

一言でいうとデータベースは、同じ情報を何度も書かないように、情報をいくつかの表に分けて持っています。注文は注文の表に、お客さんの名前は顧客の表に別にあるので、「この注文をした人の名前は?」という問いには、一つの表だけでは答えられません。そんなときは、二つの表が共通して持つ列を探します。顧客の表でお客さんごとに一つずつついている顧客番号が注文の表にも書かれているので、この列の値が同じ行どうしを組にして横に並べると、一つの表のように読める結果の表ができます。組のない行は、基本のジョインの結果から外れます。共通の列で行どうしを組み合わせ、散らばった表をつなぐこと、これがジョインです。
← データ
このページがお役に立ったなら支援する