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 | 同じテーブル同士を結合 | 階層データ・比較 |
歴史と背景
- 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:1999 | NATURAL JOINの標準化 |