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回(少ない回数)にまとめるのが解決策なのー。
なお、つなぐ条件を書くときのONとWHEREは、外部結合(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とは)
JOINに関する次の記述のうち、正しいものはどれか。
- JOINは1つの表を必ず複数の表にバラバラに分割するだけの操作だとされているものである
- JOINは画面に2つのボタンを並べて表示するだけの機能のことだとされているものである
- JOINは複数の表を共通の列をたよりにつなげて、1つの結果の表にするSQLの操作である
- JOINはデータをすべて消去する操作のことで、表のつなぎ合わせとは無関係だとされている
解答は 3 だよー。
JOINは、複数の表を共通の列をたよりにつなげて、1つの結果の表にするSQLの操作なのー。社員名簿と部署名簿を部署番号でつなぐ感じだよー。
選択肢1の「分割するだけ」、選択肢2の「ボタンを並べる」、選択肢4の「すべて消去」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 分割ではなくつなげる |
| 2 | ✗ | ボタン表示ではない |
| 3 | ✓ | 共通の列でつなげ1つの結果に |
| 4 | ✗ | 消去する操作ではない |
オリジナル問題2(自己結合)
自己結合に関する次の記述のうち、正しいものはどれか。
- 自己結合は同じ表を別名で2つあるように扱ってつなぐ方法で、上司と部下の関係に使う
- 自己結合はまったく別々になっている2つの表をつなぐことだけを指すものだとされている
- 自己結合は表を1行も使わずに結果を作る方法のことだとされているものである
- 自己結合は画面を2分割して表示する機能のことで、表の結合とは無関係だとされている
解答は 1 だよー。
自己結合は、同じ表を別名で2つあるように扱ってつなぐ方法なのー。社員表の中の「その人の上司(上司も同じ社員表にいる)」を引くときなどに使うよー。
選択肢2の「別々の2つの表」、選択肢3の「1行も使わない」、選択肢4の「画面を2分割」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | 同じ表を別名でつなぐ |
| 2 | ✗ | 別々の表ではなく同じ表 |
| 3 | ✗ | 行を使わないわけではない |
| 4 | ✗ | 画面分割の機能ではない |
オリジナル問題3(N+1問題)
N+1問題に関する次の記述のうち、正しいものはどれか。
- N+1問題は1回でまとめて取得するので、もっとも速くて良いやり方だとされているものだ
- N+1問題は親を1回取った後に子を1件ずつN回取る無駄で、JOINやINで解決する
- N+1問題はデータの個数を必ず1個に減らすだけの操作のことだとされているものである
- N+1問題は画面の明るさを1段階だけ上げる設定のことだとされているものである
解答は 2 だよー。
N+1問題は、親を1回取ったあとに子を1件ずつN回取る、無駄に回数が多いパターンなのー。本当は1回でまとめて取れるので、JOINやIN句で1回にまとめるのが解決策だよー。
選択肢1の「もっとも速くて良い」、選択肢3の「1個に減らす」、選択肢4の「明るさを上げる」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | N+1は無駄に回数が多い |
| 2 | ✓ | N回の無駄をJOIN/INでまとめる |
| 3 | ✗ | 個数を減らす操作ではない |
| 4 | ✗ | 明るさの設定ではない |
まとめ
押さえどころ
- 🔴 JOINと自己結合 = JOINは複数の表を共通の列でつなげる。自己結合は同じ表を別名でつなぐ(上司-部下など)。
- 🔴 N+1問題 = 1回で取れるものをN回に分ける無駄。JOINやIN句で1回にまとめて解決。
- 🟡 ONとWHEREの違い = つなぐ条件のONと絞り込みのWHEREは役割が違う。外部結合では結果が変わることも。
次に学ぶ
執筆: SikakuQuest編集部