6.

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 カラム
FROM テーブル1
[INNER | LEFT | RIGHT | FULL] JOIN テーブル2
  ON テーブル1.キー = テーブル2.キー;

INNER JOIN の例

-- 注文と顧客を結合
SELECT o.order_id, c.name, o.amount
  FROM orders o
 INNER JOIN customers c
    ON o.customer_id = c.id;

LEFT JOIN の例

-- 顧客全員と、注文がある場合のみその情報
SELECT c.name, o.order_id
  FROM customers c
  LEFT JOIN orders o
    ON c.id = o.customer_id;

3つ以上のテーブルの結合

SELECT o.order_id, c.name, p.product_name
  FROM orders o
 INNER JOIN customers c ON o.customer_id = c.id
 INNER JOIN products  p ON o.product_id  = p.id;

JOINで結果が変わるパターン

JOIN種別左に存在し右になし右に存在し左になし両方一致
INNER除外除外含む
LEFT含む(NULL)除外含む
RIGHT除外含む(NULL)含む
FULL含む(NULL)含む(NULL)含む
CROSSすべての組合せ(ONなし)すべての組合せすべての組合せ

古い書き方(カンマ結合)

古いSQLでは FROM 句にカンマで並べ、WHERE で結合条件を書く書き方がありました。可読性が低く非推奨。

-- 古い(非推奨)
SELECT o.order_id, c.name
  FROM orders o, customers c
 WHERE o.customer_id = c.id;

-- 推奨
SELECT o.order_id, c.name
  FROM orders o
 INNER JOIN customers c ON o.customer_id = c.id;

パフォーマンスの基本

  • 結合キーにインデックスを張る(主キー・外部キー)
  • 結合件数を意識: 多対多になると結果が爆発する
  • WHERE で先に絞り込む: 結合前にデータを減らすと速い(オプティマイザが最適化することも多い)
  • EXPLAIN PLAN で実行計画を確認

注意点

  • カンマ結合とJOINを混在させない(暗黙のCROSS JOINが入ると結果が膨れる)
  • 結合キーがNULL を含む列だと、結合条件で NULL = NULL は false になり一致しない
  • FULL JOINはMySQLでは非対応(UNIONで代替)
  • OUTER JOINでWHERE で右表の条件を書くと実質INNER扱いになることがある(NULL が除外される)

関連

  • 親カテゴリ: DML (Oracle SQL)
  • 類似テーマ: SQL (MySQL/MariaDB)
  • WHERE句: WHERE句
  • HAVING句: HAVING句
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. SELECT文
  2. INSERT文
  3. UPDATE文
  4. DELETE文
  5. WHERE句
  6. JOIN句
  7. 集合演算子
  8. インラインビュー
  9. 副問い合わせ