MySQL では、SELECT
ステートメントでの以下の JOIN
構文の使用をサポートしています。
table_reference, table_reference table_reference [INNER | CROSS] JOIN table_reference [join_condition] table_reference STRAIGHT_JOIN table_reference table_reference LEFT [OUTER] JOIN table_reference [join_condition] table_reference NATURAL [LEFT [OUTER]] JOIN table_reference { OJ table_reference LEFT OUTER JOIN table_reference ON conditional_expr } table_reference RIGHT [OUTER] JOIN table_reference [join_condition] table_reference NATURAL [RIGHT [OUTER]] JOIN table_reference
table_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | [FORCE INDEX (key_list)]]
join_condition
は次のように定義します。
ON conditional_expr | USING (column_list)
結果セットに含めるレコードを制限するために使用する
ON
部分には、通常、条件は何も指定しません。それらの条件は
WHERE
節で指定します。ただし、この規則には例外があります。
注意:INNER JOIN
構文で
join_condition
を使用できるのは、MySQL 3.23.17
以降に限られます。同様に、JOIN
と CROSS JOIN
に関しても、MySQL
4.0.11 以降でのみ条件を指定できます。
上の構文リストの最後に挙げた LEFT OUTER
JOIN
構文は、単に ODBC
との互換性を確保するためのものです。
テーブル参照では、tbl_name AS
alias_name
または tbl_name
alias_name
を使用してエイリアスを指定することができる。
mysql>SELECT t1.name, t2.salary FROM employee AS t1, info AS t2
->WHERE t1.name = t2.name;
ON
条件句には、WHERE
節で使用できる形式の任意の条件を指定できる。
LEFT JOIN
の ON
または USING
部分に右側のテーブルにマッチするレコードがない場合、すべてのカラムを
NULL
に設定した 1
つのレコードが右側のテーブルとして使用される。この規則に基づいて、対応するレコードが別のテーブルに存在しないレコードをテーブル内で検索することができる。
mysql>SELECT table1.* FROM table1
->LEFT JOIN table2 ON table1.id=table2.id
->WHERE table2.id IS NULL;
この例では、table2
に存在しない id
値を持つすべてのレコード(table2
に対応するレコードがないすべてのレコード)が
table1
で検索される。当然、この場合、table2.id
が NOT NULL
として宣言されていることが前提となる。
See 項5.2.7. 「MySQL による LEFT JOIN
と RIGHT
JOIN
の最適化」。
USING
(column_list)
節に指定するカラムリスト内のカラムは、両方のテーブルに存在しなければならない。次の
2 つの節は同じことを意味する。
a LEFT JOIN b USING (c1,c2,c3) a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3
2 つのテーブルの NATURAL [LEFT]
JOIN
の定義は、両方のテーブルに存在するすべてのカラムを指定した
USING
節を持つ INNER
JOIN
または LEFT JOIN
と同じ意味になる。
INNER JOIN
と
,
(カンマ)は、結合条件が指定されていない場合、同じ意味になり、どちらについても、指定されたテーブル間でデカルト積が生成される(つまり、最初のテーブルの各レコードが
2
番目のテーブルのすべてのレコードに結合される)。
RIGHT JOIN
は LEFT
JOIN
の類似機能。コードをデータベース間で移植可能にするには、RIGHT
JOIN
ではなく LEFT JOIN
を使用するようにする。
STRAIGHT_JOIN
は
JOIN
と同様のものだが、異なる点として、STRAIGHT_JOIN
では常に右側のテーブルの前に左側のテーブルが読み取られる。この構文は、結合オプティマイザによってテーブルが誤った順序で並べられるといった(まれな)事態に対処するために使用できる。
MySQL バージョン 3.23.12
以降では、テーブルからのデータの取り出し時に、どのインデックスを使用すべきか
MySQL
に知らせるためのヒントを指定することができる。これは、EXPLAIN
で MySQL
が使用可能なインデックスのリストの中から誤ったインデックスを使用していることが明らかになったときに役立つ。USE
INDEX (key_list)
と指定することによって、使用可能なインデックスの中から特定のインデックスを使ってテーブル内のレコードを検索するよう
MySQL に指示できる。もう 1 つの IGNORE
INDEX (key_list)
構文は、特定のインデックスを使用しないよう
MySQL に指示するときに使用する。
MySQL 4.0.9 では、FORCE INDEX
も使用できる。これは USE INDEX
(key_list)
と同じように動作するが、異なる点として、この構文の場合、テーブルのスキャンは非常にコストがかかるといいう前提に立つ。つまり、テーブルのスキャンが実行されるのは、どのインデックスを使用してもテーブル内のレコードを検索できない場合に限られる。
USE/IGNORE KEY
は USE/IGNORE
INDEX
のシノニム。
注意:
USE/IGNORE/FORCE INDEX
は、MySQL
でテーブル内のレコードの検索方法と結合の実行方法を決めるときにどのインデックスを使用するか、という点にのみに影響します。ORDER
BY
や GROUP BY
の解決時にインデックスを使用するかどうかには影響しません。
以下に、例をいくつか示します。
mysql>SELECT * FROM table1,table2 WHERE table1.id=table2.id;
mysql>SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id;
mysql>SELECT * FROM table1 LEFT JOIN table2 USING (id);
mysql>SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id
->LEFT JOIN table3 ON table2.id=table3.id;
mysql>SELECT * FROM table1 USE INDEX (key1,key2)
->WHERE key1=1 AND key2=2 AND key3=3;
mysql>SELECT * FROM table1 IGNORE INDEX (key3)
->WHERE key1=1 AND key2=2 AND key3=3;
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.