MySQL は次のように A LEFT JOIN B join_condition を実装します。

  • テーブル B は、テーブル AA が依存するすべてのテーブルに依存して設定されます。

  • テーブル A は、LEFT JOIN 条件で使用されるすべてのテーブル (B を除く) に依存して設定されます。

  • LEFT JOIN 条件は、テーブル B からの行の取得方法を決定するために使用されます。(言い換えると、WHERE 句内のすべての条件が使用されません)。

  • テーブルは常にそれが依存するすべてのテーブルのあとに読み取られることを除き、すべての標準の結合最適化が実行されます。循環依存関係がある場合、MySQL はエラーを発行します。

  • すべての標準 WHERE 最適化が実行されます。

  • AWHERE 句に一致する行があるが、BON 条件に一致する行がない場合、すべてのカラムが NULL に設定された追加の B 行が生成されます。

  • LEFT JOIN を使用して、一部のテーブルに存在しない行を検索し、WHERE 部分の col_name IS NULL のテストを実行した場合 (ここで col_nameNOT NULL と宣言されているカラム)、MySQL は LEFT JOIN 条件に一致する 1 つの行が見つかったあとに、それ以上の行 (の特定のキーの組み合わせ) の検索を停止します。

RIGHT JOIN の実装は、テーブルの役割が逆の LEFT JOIN の場合と類似しています。

結合オプティマイザは、テーブルを結合すべき順序を計算します。LEFT JOIN または STRAIGHT_JOIN によって強制されるテーブル読み取り順序は、確認するテーブル配列が少なくなるため、結合オプティマイザがはるかに高速にその作業を実行するのに役立ちます。これは、次のような種類のクエリーを実行する場合、LEFT JOIN によって d の前に b を読み取るように強制されるため、MySQL がその完全スキャンを実行することを意味します。

  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;

この例の修正は、abFROM 句内に示される順序を逆にすることです。

  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.column1NULL であった場合、次のクエリーの 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 構文」を参照してください。)

Download this Manual
EPUB - 7.5Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb
User Comments
  Posted by Peter Warnock on January 12, 2005
When using more than one left join, the first occurrence of NULL will cause latter fields to be reported NULL with the USING(field) clause.

instead of :

t1 LEFT JOIN t2 ON (t1.id = t2.id) LEFT JOIN t3 ON (t1.id=t3.id)

  Posted by Mark Malakanov on May 9, 2006
Outer joins can work inefficiently when joining columns are in different character sets.

In my case query worked very slow when "the outer" table had utf8 joining columns, and a second table had latin1 ones.
Though, query worked fast when the outer table had latin1 joining columns, and a second table had utf8 ones.

Join was efficient in any direction when columns that tables outer joined were the same character set, ether both latin1, or both utf8.

  Posted by Ilan Hazan on July 6, 2011
It is a common mistake to think that there is no difference putting the conditions in the ON clause and the WHERE clause.
well, there is a big difference. The following post explains it with examples:

  Posted by Nicolas LESCURE on December 6, 2011
got the same pb as Mark Malakanov and the same solution - extremely slow query during a left outer join...it happens that the join was done on one column defined with CHARACTER SET utf8 COLLATE utf8_bin and the other one without character set specification ( even if by default it was utf-8 ) - changing column definition solved the problem
  Posted by Amit Thakur on July 1, 2013
Left Join - Left Join is used to retrieve data from one table independent from the availability of data in another table.
Ex - We have a table student(id, name) values (1, 'Ram'),( 2, 'Shyam');
another table marks(id,marks,semester) values(1,400,'First');
We have to list all students from table student and marks of those student which are in marks table
If we write a query without join - "select A.*,B.marks from student as A, marks as B where A.id=B.marks"
Result is - 1,Ram,400 it give only one student which is available in both table.
If we have to list all student from the student table then we should use join. our query will be -
"select A.*, B.marks from student as A left join marks as B on A.id=B.id"
Result is :
id Name Marks
1 Ram 400
2 Shyam Null
it list all records from table student independent of table B
Sign Up Login You must be logged in to post a comment.