MySQL は次のように
を実装します。
A
LEFT JOIN B
join_condition
テーブル
B
は、テーブルA
とA
が依存するすべてのテーブルに依存して設定されます。テーブル
A
は、LEFT JOIN
条件で使用されるすべてのテーブル (B
を除く) に依存して設定されます。LEFT JOIN
条件は、テーブルB
からの行の取得方法を決定するために使用されます。(言い換えると、WHERE
句内のすべての条件が使用されません)。テーブルは常にそれが依存するすべてのテーブルのあとに読み取られることを除き、すべての標準の結合最適化が実行されます。循環依存関係がある場合、MySQL はエラーを発行します。
すべての標準
WHERE
最適化が実行されます。A
にWHERE
句に一致する行があるが、B
にON
条件に一致する行がない場合、すべてのカラムがNULL
に設定された追加のB
行が生成されます。LEFT JOIN
を使用して、一部のテーブルに存在しない行を検索し、WHERE
部分の
のテストを実行した場合 (ここでcol_name
IS NULLcol_name
はNOT NULL
と宣言されているカラム)、MySQL はLEFT JOIN
条件に一致する 1 つの行が見つかったあとに、それ以上の行 (の特定のキーの組み合わせ) の検索を停止します。
RIGHT JOIN
の実装は、テーブルの役割が逆の LEFT JOIN
の場合と類似しています。
結合オプティマイザは、テーブルを結合すべき順序を計算します。LEFT JOIN
または STRAIGHT_JOIN
によって強制されるテーブル読み取り順序は、確認するテーブル配列が少なくなるため、結合オプティマイザがはるかに高速にその作業を実行するのに役立ちます。これは、次のような種類のクエリーを実行する場合、LEFT JOIN
によって d
の前に b
を読み取るように強制されるため、MySQL がその完全スキャンを実行することを意味します。
SELECT *
FROM a JOIN b LEFT JOIN c ON (c.key=a.key)
LEFT JOIN d ON (d.key=a.key)
WHERE b.key=d.key;
この例の修正は、a
と b
が FROM
句内に示される順序を逆にすることです。
SELECT *
FROM b JOIN a LEFT JOIN c ON (c.key=a.key)
LEFT JOIN d ON (d.key=a.key)
WHERE b.key=d.key;
LEFT JOIN
では、生成された NULL
行に対して、WHERE
条件が常に false である場合、LEFT JOIN
は通常の結合に変更されます。たとえば、t2.column1
が NULL
であった場合、次のクエリーの WHERE
句は false になります。
SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;
そのため、クエリーを通常の結合に変換しても問題ありません。
SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;
これにより、テーブル t1
の前にテーブル t2
を使用することがより適切なクエリー計画になる場合に、MySQL はそれを実行できるため、高速化できます。テーブルの結合順序についてヒントを提供するには、STRAIGHT_JOIN
を使用します。(セクション13.2.9「SELECT 構文」を参照してください。)