MySQL supports the following JOIN syntax for the table_references part
of SELECT statements and multiple-table DELETE and UPDATE statements:

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] ...

A table reference is also known as a join expression.

A table reference (when it refers to a partitioned table) may contain a
PARTITION clause, including a list of comma-separated partitions,
subpartitions, or both. This option follows the name of the table and
precedes any alias declaration. The effect of this option is that rows
are selected only from the listed partitions or subpartitions. Any
partitions or subpartitions not named in the list are ignored. For more
information and examples, see
https://dev.mysql.com/doc/refman/8.4/en/partitioning-selection.html.

The syntax of table_factor is extended in MySQL in comparison with
standard SQL. The standard accepts only table_reference, not a list of
them inside a pair of parentheses.

This is a conservative extension if each comma in a list of
table_reference items is considered as equivalent to an inner join. For
example:

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

is equivalent to:

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)

In MySQL, JOIN, CROSS JOIN, and INNER JOIN are syntactic equivalents
(they can replace each other). In standard SQL, they are not
equivalent. INNER JOIN is used with an ON clause, CROSS JOIN is used
otherwise.

In general, parentheses can be ignored in join expressions containing
only inner join operations. MySQL also supports nested joins. See
https://dev.mysql.com/doc/refman/8.4/en/nested-join-optimization.html.

Index hints can be specified to affect how the MySQL optimizer makes
use of indexes. For more information, see
https://dev.mysql.com/doc/refman/8.4/en/index-hints.html. Optimizer
hints and the optimizer_switch system variable are other ways to
influence optimizer use of indexes. See
https://dev.mysql.com/doc/refman/8.4/en/optimizer-hints.html, and
https://dev.mysql.com/doc/refman/8.4/en/switchable-optimizations.html.

URL: https://dev.mysql.com/doc/refman/8.4/en/join.html

