タイトル: JOIN句
OracleのSQLのJOIN句の記事です。複数のテーブルを共通カラムで結合して1つの結果セットとして取得するための構文。RDBMSでは最も頻繁に使う処理の1つです。
JOINの種類
| 種類 | 意味 |
|---|---|
| INNER JOIN(内部結合) | 両方に存在する行のみ |
| LEFT (OUTER) JOIN | 左表は全件、右表は一致するもの。なければNULL |
| RIGHT (OUTER) JOIN | 右表が全件、左表は一致するもの |
| FULL (OUTER) JOIN | 両表のすべて。一致しないところはNULL |
| CROSS JOIN | 直積(全組合せ) |
| SELF JOIN | 同じテーブルを自分自身と結合 |
基本構文
|
SELECT カラム |
INNER JOIN の例
|
-- 注文と顧客を結合 |
LEFT JOIN の例
|
-- 顧客全員と、注文がある場合のみその情報 |
3つ以上のテーブルの結合
|
SELECT o.order_id, c.name, p.product_name |
JOINで結果が変わるパターン
| JOIN種別 | 左に存在し右になし | 右に存在し左になし | 両方一致 |
|---|---|---|---|
| INNER | 除外 | 除外 | 含む |
| LEFT | 含む(NULL) | 除外 | 含む |
| RIGHT | 除外 | 含む(NULL) | 含む |
| FULL | 含む(NULL) | 含む(NULL) | 含む |
| CROSS | すべての組合せ(ONなし) | すべての組合せ | すべての組合せ |
古い書き方(カンマ結合)
古いSQLでは FROM 句にカンマで並べ、WHERE で結合条件を書く書き方がありました。可読性が低く非推奨。
|
-- 古い(非推奨) |
パフォーマンスの基本
- 結合キーにインデックスを張る(主キー・外部キー)
- 結合件数を意識: 多対多になると結果が爆発する
- WHERE で先に絞り込む: 結合前にデータを減らすと速い(オプティマイザが最適化することも多い)
- EXPLAIN PLAN で実行計画を確認
注意点
- カンマ結合とJOINを混在させない(暗黙のCROSS JOINが入ると結果が膨れる)
- 結合キーがNULL を含む列だと、結合条件で NULL = NULL は false になり一致しない
- FULL JOINはMySQLでは非対応(UNIONで代替)
- OUTER JOINでWHERE で右表の条件を書くと実質INNER扱いになることがある(NULL が除外される)