【いんなーじょいん】

INNER JOIN とは?

最終更新:
💡 条件に合う行の組を取り出す

結合条件が真になる行の組を、テーブルから取り出して組み合わせるSQLの内部結合。一致しない行は残さず、一つの行に複数の相手が一致すれば、その組の数だけ結果ができる。

📌 このページのポイント
INNER JOIN:行の組を作る 注文 1:商品A 2:商品B 3:商品X 商品 A:りんご B:みかん C:バナナ 条件:商品IDが等しい 結果:条件に合う行の組 1 | A | りんご 2 | B | みかん Xの注文とCの商品は結果に含まれない
商品IDが等しいという条件の架空例。商品表の各IDは一意なので結果は2行。一致する相手が複数あれば、その数だけ行の組ができる。線は一致する組と結果への流れを表す。
ひよこ ひよこ
INNER JOINって何をするものなの?
ペンギン先生 ペンギン先生
条件に合う行の組を、テーブルから取り出すよ。例えば注文の商品IDと商品表のIDが等しい、という条件なら、注文に商品名を付けられる。列名が同じことだけで自動的に結合するわけではないんだ。
ひよこ ひよこ
商品表に相手がない注文はどうなる?
ペンギン先生 ペンギン先生
その注文は結果に含まれないよ。注文1の商品A、注文2の商品Bに対応する商品があれば、それぞれ商品名を付けた行になる。注文3の商品Xに相手がなければ出てこない。一致しない注文も残すならLEFT JOINなどを検討するんだ。
ひよこ ひよこ
一つの注文は、必ず一行になる?
ペンギン先生 ペンギン先生
相手の表に一致する行が一つなら一行だけれど、二つあれば二つの組になるよ。結合先のIDが一意か、意図した一対多の関係かを確かめよう。INNER JOINだけでは重複を取り除かないんだ。
ひよこ ひよこ
JOINと書くだけでも同じ?
ペンギン先生 ペンギン先生
通常の条件付き結合ではINNERを省略できるよ。例えばPostgreSQLのJOIN products ON orders.product_id = products.idはINNER JOINと同じ。ONには等しいという条件だけでなく、範囲などの条件も書けるんだ。
ひよこ ひよこ
インデックスを付ければ速くなる?
ペンギン先生 ペンギン先生
役立つ場合はあるけれど、必ず速くなるわけではないよ。DBはデータ量や統計、条件に応じ、ハッシュ結合やマージ結合なども選ぶ。インデックスがないと必ず全組を総当たりする、という説明は正確ではない。実行計画と必要な結果を確認しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「INNER JOIN」って出てきたら「条件に合う行の組だけを結合するSQL操作」と思えばだいたいOK!
📖 おまけ:英語の意味
「Inner Join」 = 内部結合
💬 一致しない行も残す外部結合に対し、条件に合う行の組だけを返す結合だよ。行の組を作るので、元の行そのものの積集合とは異なるんだ。

参考資料

← 用語集にもどる