:: DEVELOPER ZONE
MySQL supports the following JOIN syntaxes for
the table_references part of
SELECT statements and multiple-table
DELETE and UPDATE statements:
table_reference,table_referencetable_reference[INNER | CROSS] JOINtable_reference[join_condition]table_referenceSTRAIGHT_JOINtable_referencetable_referenceLEFT [OUTER] JOINtable_referencejoin_conditiontable_referenceNATURAL [LEFT [OUTER]] JOINtable_reference{ ONtable_referenceLEFT OUTER JOINtable_referenceONconditional_expr}table_referenceRIGHT [OUTER] JOINtable_referencejoin_conditiontable_referenceNATURAL [RIGHT [OUTER]] JOINtable_reference
table_reference is defined as:
tbl_name[[AS]alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | [FORCE INDEX (key_list)]]
join_condition is defined as:
ONconditional_expr| USING (column_list)
You should generally not have any conditions in the
ON part that are used to restrict which rows you
want in the result set, but rather specify these conditions in the
WHERE clause. There are exceptions to this rule.
Note that INNER JOIN syntax allows a
join_condition only from MySQL 3.23.17 on. The
same is true for JOIN and CROSS
JOIN only as of MySQL 4.0.11.
The { OJ ... LEFT OUTER JOIN ...} syntax shown
in the preceding list exists only for compatibility with ODBC.
A table reference can be aliased using
or
tbl_name AS
alias_nametbl_name alias_name:
mysql> SELECT t1.name, t2.salary FROM employee AS t1, info AS t2
-> WHERE t1.name = t2.name;
mysql> SELECT t1.name, t2.salary FROM employee t1, info t2
-> WHERE t1.name = t2.name;
The ON conditional is any conditional
expression of the form that can be used in a
WHERE clause.
If there is no matching record for the right table in the
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 (that is, all rows in
table1 with no corresponding row in
table2). This assumes that
table2.id is declared NOT
NULL. See Section 7.2.9, “How MySQL Optimizes LEFT JOIN and RIGHT JOIN”.
The USING (column_list)
clause names a list of columns that must exist in both tables. The
following two clauses are semantically identical:
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
The NATURAL [LEFT] JOIN of two tables is
defined to be semantically equivalent to an INNER
JOIN or a LEFT JOIN with a
USING clause that names all columns that exist
in both tables.
INNER JOIN and , (comma) are
semantically equivalent in the absence of a join condition: both
produce a Cartesian product between the specified tables (that is,
each and every row in the first table are joined to all rows in
the second table).
RIGHT JOIN works analogously to LEFT
JOIN. To keep code portable across databases, it's
recommended to use LEFT JOIN instead of
RIGHT JOIN.
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 for
which the join optimizer puts the tables in the wrong order.
As of MySQL 3.23.12, you can give hints about which index MySQL
should use when retrieving information from a table. By specifying
USE INDEX (key_list), you can tell MySQL to use
only one of the possible 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. These hints
are useful if EXPLAIN shows that MySQL is using
the wrong index from the list of possible indexes.
From MySQL 4.0.9 on, you can also use FORCE
INDEX. This acts likes USE INDEX
(key_list) but with the addition that a table scan is
assumed to be very expensive. In other words,
a table scan is only used if there is no way to use one of the
given indexes to find rows in the table.
USE KEY, IGNORE KEY, and
FORCE KEY are synonyms for USE
INDEX, IGNORE INDEX, and
FORCE INDEX.
Note: USE
INDEX, IGNORE INDEX, and
FORCE INDEX only affect which indexes are used
when MySQL decides how to find rows in the table and how to do the
join. They do not affect whether an index is used when resolving an
ORDER BY or GROUP BY.
Some join 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 7.2.9, “How MySQL Optimizes LEFT JOIN and RIGHT JOIN”.
© 1995-2005 MySQL AB. All rights reserved.

User Comments
Warning: query failed: Unknown column 'user.firstname' in 'field list' in /data0/sites/live/web-main/lib/mysql-cxn.php on line 69
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /data0/sites/live/web-main/lib/docbook.php on line 245
Add your own comment.