MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

13.2.10.2 JOIN 句

MySQL では、SELECT ステートメントおよび複数テーブルの DELETE ステートメントと UPDATE ステートメントの table_references 部分について、次の JOIN 構文がサポートされています:

table_references:
    escaped_table_reference [, escaped_table_reference] ...

escaped_table_reference: {
    table_reference
  | { OJ table_reference }
}

table_reference: {
    table_factor
  | joined_table
}

table_factor: {
    tbl_name [PARTITION (partition_names)]
        [[AS] alias] [index_hint_list]
  | [LATERAL] table_subquery [AS] alias [(col_list)]
  | ( table_references )
}

joined_table: {
    table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
  | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
  | table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
}

join_specification: {
    ON search_condition
  | USING (join_column_list)
}

join_column_list:
    column_name [, column_name] ...

index_hint_list:
    index_hint [, index_hint] ...

index_hint: {
    USE {INDEX|KEY}
      [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
  | {IGNORE|FORCE} {INDEX|KEY}
      [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
}

index_list:
    index_name [, index_name] ...

テーブル参照は、結合式とも呼ばれます。

テーブル参照 (パーティションテーブルを参照する場合) には、カンマ区切りのパーティションまたはサブパーティション (あるいはその両方) のリストを含む PARTITION オプションを含めることができます。 このオプションはテーブルの名前のあとで、かつエイリアス宣言 (存在する場合) の前に指定されます。 このオプションの効果は、リストされたパーティションまたはサブパーティションからのみ行が選択されることです。 リストに指定されていないパーティションまたはサブパーティションは無視されます。 詳細および例については、セクション24.5「パーティション選択」を参照してください。

table_factor の構文は、標準 SQL と比較して MySQL で拡張されています。 標準では、table_reference のみを受け入れ、カッコのペア内のリストは受け入れません。

table_reference アイテムのリスト内の各カンマが内部結合と同等とみなされる場合、これは保守的な拡張機能です。 例:

SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                 ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)

次と同等です。

SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                 ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)

MySQL では、JOINCROSS JOIN、および INNER JOIN は構文上同等です (互いに置き換えることができます)。 標準 SQL では、それらは同等ではありません。 INNER JOINON 句とともに使用され、CROSS JOIN はそれ以外のときに使用されます。

一般に、内部結合操作のみを含む結合式内のかっこは無視できます。 MySQL では、ネストした結合もサポートされています。 セクション8.2.1.8「ネストした結合の最適化」を参照してください。

インデックスヒントを指定すると、MySQL オプティマイザによるインデックスの使用方法に影響を与えることができます。 詳細は、セクション8.9.4「インデックスヒント」を参照してください。 オプティマイザヒントおよび optimizer_switch システム変数は、オプティマイザによるインデックスの使用に影響を与える他の方法です。 セクション8.9.3「オプティマイザヒント」およびセクション8.9.2「切り替え可能な最適化」を参照してください。

次のリストでは、結合の書込み時に考慮する一般的な要因について説明します:

結合のいくつかの例:

SELECT * FROM table1, table2;

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;

SELECT * FROM table1 LEFT JOIN table2 USING (id);

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
  LEFT JOIN table3 ON table2.id = table3.id;

外部結合バリアントを含む USING との自然結合および結合は、SQL:2003 標準に従って処理されます: