JOIN応用(自己結合・N+1問題)とは?複数の表をつなげて1つの結果にするSQLの操作

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

JOINとは(全体像)

JOINは、ばらばらの表を、共通の列をたよりにつなげて1つの結果にする操作。たとえば「社員の表」と「部署の表」を、部署番号でつなげば「社員名と部署名が並んだ表」が作れるよー。

身近にたとえると、2つの名簿を、共通の番号で照らし合わせて1枚にまとめる感じ。

押さえるのは、JOINにはつなぎ方の種類があり、応用として自己結合N+1問題という話が出てくること。ここが試験でよく問われるのー。


詳しく:自己結合とN+1問題だけ覚えれば戦える

ここが記事の心臓部。まずJOINのつなぎ方を見ていこーね。

JOINの主な種類

種類つなぎ方
内部結合(INNER)両方にそろっている行だけをつなぐ
外部結合(OUTER)片方にしかない行も残してつなぐ
自己結合(SELF)同じ表を別名で2つあるように扱ってつなぐ

応用でよく出るのが自己結合同じ表を「別名(あだ名)」で2つあるかのように扱ってつなぐやり方で、たとえば社員表の中の「上司は誰か(上司も同じ社員表にいる)」を引くときに使うよー。

もう1つの重要テーマがN+1問題

N+1問題(取得の無駄)

やり方問い合わせ回数
N+1問題親を1回取り、子を1件ずつN回取る1+N回(無駄に多い)
解決JOINやIN句で1回にまとめる少ない回数で済む

ここで一番のひっかけが「N+1問題は速い良いやり方」という誤解。N+1は、本当は1回でまとめて取れるのに、わざわざ何回にも分けて取りにいってしまう無駄なパターン。だからJOINやIN句で1回(少ない回数)にまとめるのが解決策なのー。

なお、つなぐ条件を書くときのONWHEREは、外部結合(OUTER)では結果が変わることがあるので、同じだと思い込まないのも大事だよー。

わかりやすく言い換えると

要するに、社員名簿でイメージするとラクだよー。

JOIN … 社員名簿と部署名簿を、部署番号でつなげて1枚にする

自己結合 … 同じ社員名簿を別名で2つ使い、「その人の上司」を同じ名簿から引く

N+1問題 … 「部下100人ぶんの上司」を、まとめて1回で取らず1人ずつ100回聞きにいく無駄

つまり、「自己結合は同じ表を別名でつなぐ」「N+1はまとめて取れば速い」、この2点が試験の急所なのー。


試験のツボ

🔴 一番出る:JOINと自己結合

①JOINは複数の表を共通の列でつなげて1つの結果にする

②自己結合は同じ表を別名で2つあるように扱ってつなぐ(上司-部下など)

🔴 次に出る:N+1問題

①親を1回取って子を1件ずつN回取る、無駄に回数が多いパターン

②JOINやIN句で1回(少ない回数)にまとめれば解決する

🟡 押さえると安定:ONとWHEREの違い

①つなぐ条件のONと絞り込みのWHEREは役割が違う

②外部結合(OUTER)では結果が変わることがあるので同じと思い込まない


よくある間違い

「N+1問題は速くて良いやり方である」→ ✗  N+1は1回で取れるものをN回に分ける無駄。JOINやIN句で1回にまとめる。

「自己結合は2つの別々の表をつなぐことである」→ ✗  自己結合は同じ表を別名で2つあるように扱ってつなぐこと。

「ONとWHEREはいつもまったく同じ結果になる」→ ✗  外部結合(OUTER)では結果が変わることがある。役割が違う。


試験での出題パターン

実際の問題でたしかめてみよう。

オリジナル問題1(JOINとは)

📝 オリジナル問題 1 JOINとは

JOINに関する次の記述のうち、正しいものはどれか。

  1. JOINは1つの表を必ず複数の表にバラバラに分割するだけの操作だとされているものである
  2. JOINは画面に2つのボタンを並べて表示するだけの機能のことだとされているものである
  3. JOINは複数の表を共通の列をたよりにつなげて、1つの結果の表にするSQLの操作である
  4. JOINはデータをすべて消去する操作のことで、表のつなぎ合わせとは無関係だとされている
データスラ
データスラ 解答・解説

解答は 3 だよー。

JOINは、複数の表を共通の列をたよりにつなげて、1つの結果の表にするSQLの操作なのー。社員名簿と部署名簿を部署番号でつなぐ感じだよー。

選択肢1の「分割するだけ」、選択肢2の「ボタンを並べる」、選択肢4の「すべて消去」はどれも誤りなのー。

選択肢判定理由
1分割ではなくつなげる
2ボタン表示ではない
3共通の列でつなげ1つの結果に
4消去する操作ではない

オリジナル問題2(自己結合)

📝 オリジナル問題 2 自己結合

自己結合に関する次の記述のうち、正しいものはどれか。

  1. 自己結合は同じ表を別名で2つあるように扱ってつなぐ方法で、上司と部下の関係に使う
  2. 自己結合はまったく別々になっている2つの表をつなぐことだけを指すものだとされている
  3. 自己結合は表を1行も使わずに結果を作る方法のことだとされているものである
  4. 自己結合は画面を2分割して表示する機能のことで、表の結合とは無関係だとされている
データスラ
データスラ 解答・解説

解答は 1 だよー。

自己結合は、同じ表を別名で2つあるように扱ってつなぐ方法なのー。社員表の中の「その人の上司(上司も同じ社員表にいる)」を引くときなどに使うよー。

選択肢2の「別々の2つの表」、選択肢3の「1行も使わない」、選択肢4の「画面を2分割」はどれも誤りなのー。

選択肢判定理由
1同じ表を別名でつなぐ
2別々の表ではなく同じ表
3行を使わないわけではない
4画面分割の機能ではない

オリジナル問題3(N+1問題)

📝 オリジナル問題 3 N+1問題

N+1問題に関する次の記述のうち、正しいものはどれか。

  1. N+1問題は1回でまとめて取得するので、もっとも速くて良いやり方だとされているものだ
  2. N+1問題は親を1回取った後に子を1件ずつN回取る無駄で、JOINやINで解決する
  3. N+1問題はデータの個数を必ず1個に減らすだけの操作のことだとされているものである
  4. N+1問題は画面の明るさを1段階だけ上げる設定のことだとされているものである
データスラ
データスラ 解答・解説

解答は 2 だよー。

N+1問題は、親を1回取ったあとに子を1件ずつN回取る、無駄に回数が多いパターンなのー。本当は1回でまとめて取れるので、JOINやIN句で1回にまとめるのが解決策だよー。

選択肢1の「もっとも速くて良い」、選択肢3の「1個に減らす」、選択肢4の「明るさを上げる」はどれも誤りなのー。

選択肢判定理由
1N+1は無駄に回数が多い
2N回の無駄をJOIN/INでまとめる
3個数を減らす操作ではない
4明るさの設定ではない

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る