7.15 JOIN
syntax
MySQL supports the following JOIN
syntaxes for use in SELECT
statements:
table_reference, table_reference table_reference [CROSS] JOIN table_reference table_reference INNER JOIN table_reference join_condition table_reference STRAIGHT_JOIN table_reference table_reference LEFT [OUTER] JOIN table_reference join_condition table_reference LEFT [OUTER] JOIN table_reference table_reference NATURAL [LEFT [OUTER]] JOIN table_reference { oj table_reference LEFT OUTER JOIN table_reference ON conditional_expr }
Where table_reference
is defined as
table_name [[AS] alias] [USE INDEX (key_list)] [IGNORE INDEX (key_list)]
and join_condition
is defined as
ON conditional_expr | USING (column_list)
Note that in version before 3.23.16 the INNER JOIN
didn't take a join condition!
The last LEFT OUTER JOIN
syntax shown above exists only for compatibility with ODBC.
tbl_name AS alias_name
or tbl_name alias_name
. mysql> select t1.name, t2.salary from employee AS t1, info AS t2 where t1.name = t2.name;
INNER JOIN
and ,
(comma) are semantically equivalent. Both do a full join between the tables used. Normally, you specify how the tables should be linked in the WHERE
condition. ON
conditional is any conditional of the form that may be used in a WHERE
clause. ON
or USING
part in a LEFT JOIN
, a row with all columns set to NULL
is used for the right table. You can use this fact to find records in a table that have no counterpart in another table: mysql> select table1.* from table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id is NULL;This example finds all rows in
table1
with an id
value that is not present in table2
(i.e., all rows in table1
with no corresponding row in table2
). This assumes that table2.id
is declared NOT NULL
, of course. USING
(column_list)
clause names a list of columns that must exist in both tables. A USING
clause such as: A LEFT JOIN B USING (C1,C2,C3,...)is defined to be semantically identical to an
ON
expression like this: A.C1=B.C1 AND A.C2=B.C2 AND A.C3=B.C3,...
NATURAL [LEFT] JOIN
of two tables is defined to be semantically equivalent to a INNER JOIN
or a LEFT JOIN
with a USING
clause that names all columns that exist in both tables. STRAIGHT_JOIN
is identical to JOIN
, except that the left table is always read before the right table. This can be used for those (few) cases where the join optimizer puts the tables in the wrong order. EXPLAIN
shows that MySQL is using the wrong index. By specifying USE INDEX (key_list)
, you can tell MySQL to use only one of the specified indexes to find rows in the table. The alternative syntax IGNORE INDEX (key_list)
can be used to tell MySQL to not use some particular index. Some examples:
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;
See section 12.5.4 How MySQL optimizes LEFT JOIN
.