|
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
table_reference STRAIGHT_JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference ON conditional_expr
table_reference LEFT [OUTER] JOIN table_reference USING (column_list)
table_reference NATURAL LEFT [OUTER] JOIN table_reference
{ oj table_reference LEFT OUTER JOIN table_reference ON conditional_expr }
The last LEFT OUTER JOIN syntax shown above exists only for
compatibility with ODBC.
-
A table reference may be aliased using
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.
-
The
ON conditional is any conditional of the form that may be used in
a WHERE clause.
-
If there is no matching record for the right table 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.
-
The
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,...
-
The
NATURAL LEFT JOIN of two tables is defined to be semantically
equivalent to 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.
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;
LEFT JOIN optimization.
|