SQL・クエリ

JOIN(結合) じょいん(けつごう)

INNER JOINLEFT JOINRIGHT JOINFULL JOINテーブル結合SQL
JOIN(結合)について教えて

簡単に言うとこんな感じ!

JOINは「複数のテーブルを横に合体させる」SQLの機能だよ!「注文テーブル」には顧客IDしかないけど、「顧客テーブル」と結合すれば顧客名・住所も一緒に取れる。ベン図みたいな重なりをイメージして、「両方に存在するデータだけ(INNER)」「左側は全部(LEFT)」など種類を選ぶんだ!


JOINとは

JOIN(結合)とは、2つ以上のテーブルを特定の条件(通常は共通のキー)で横に結合し、1つの結果セットとして取得するSQLの機能です。リレーショナルデータベースでは正規化によりデータが複数テーブルに分散しているため、JOINはほぼ必須の機能です。

JOINの結合条件はON句で指定します。「ON orders.customer_id = customers.customer_id」のように、2つのテーブルの関連するカラムを等号で結びます。この「外部キー主キー」の等結合を等値結合(Equi Join)と呼び、最もよく使われます。

JOINには複数の種類があり、「どのレコードを結果に含めるか」が異なります。最も重要なのは**INNER JOIN(内部結合)LEFT JOIN(左外部結合)**の2種類で、まずこの2つを理解すれば実務の大半に対応できます。


JOINの種類

種類含まれるデータ使いどき
INNER JOIN両テーブルに一致するもののみ確実に関連データが存在する場合
LEFT JOIN左テーブル全部+右テーブルに一致するもの左テーブルを主に、右は任意
RIGHT JOIN右テーブル全部+左テーブルに一致するものRIGHT JOINはLEFTで代替可能なので稀
FULL OUTER JOIN両テーブルのすべて(不一致はNULL)差分や突合せの確認
CROSS JOIN全組み合わせ(直積)マトリクス生成・テストデータ作成
SELF JOIN同じテーブル同士を結合階層データ・比較
JOINの種類とベン図 orders のみ 一致 部分 customers のみ INNER JOIN 一致部分のみ LEFT JOIN 左テーブル全部 RIGHT JOIN 右テーブル全部 FULL OUTER 両テーブル全部 コード例:注文と顧客名を一緒に取得(INNER JOIN) SELECT o.order_id, c.name, o.total FROM orders o INNER JOIN customers c ON o.customer_id = c.customer_id

歴史と背景

  • 1970年:E.F.コッドがリレーショナル代数を発表。JOINの数学的基盤
  • 1979年:Oracle DatabaseがSQL JOINを実装。商用RDBに標準搭載
  • 1987年:ISO/IEC SQL標準でJOINが正式規格化
  • 1992年:SQL-92でLEFT/RIGHT/FULL OUTER JOINの構文が標準化
  • 2000年代:実行計画最適化の進化でJOINのパフォーマンス問題が大幅に改善
  • 現在:SQLのJOIN以外にも、グラフDBのパス探索・ドキュメントDBの$lookupなど同等機能が各DBに存在

JOINのパフォーマンス

テクニック説明
インデックスをON条件のカラムに作るJOINのキーカラムにインデックスがないと遅い
小さいテーブルを左に置くネステッドループJOINの外側を小さくする
WHERE でJOIN前に絞り込むフィルタリングを先に行い処理行数を減らす
不要なJOINを排除する使わないテーブルのJOINはパフォーマンス低下の原因

関連する規格・RFC

規格・RFC番号内容
ISO/IEC 9075:1992 (SQL-92)LEFT/RIGHT/FULL OUTER JOINの標準化
ISO/IEC 9075:1999NATURAL JOINの標準化

関連用語