SELECT
MySQL supports the following JOIN
syntaxes for the table_references
part of SELECT
statements and multiple-table DELETE
and UPDATE
statements:
table_reference
, table_reference
table_reference
[INNER | CROSS] JOIN table_reference
[join_condition
]table_reference
STRAIGHT_JOIN table_reference
table_reference
LEFT [OUTER] JOIN table_reference
join_condition
table_reference
NATURAL [LEFT [OUTER]] JOIN table_reference
{ OJ table_reference
LEFT OUTER JOIN table_reference
ON conditional_expr
}table_reference
RIGHT [OUTER] JOIN table_reference
join_condition
table_reference
NATURAL [RIGHT [OUTER]] JOIN table_reference
</PRE>
table_reference
is defined as:
tbl_name
[[AS] alias
] [[USE INDEX (key_list
)] | [IGNORE INDEX (key_list
)] | [FORCE INDEX (key_list
)]]</PRE>
join_condition
is defined as:
conditional_expr
| USING (column_list
)</PRE>
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
<PRE class=programlisting>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;</PRE>
ortbl_name
ASalias_name
tbl_name alias_name
: -
The
ON
conditional is any conditional expression of the form that can be used in aWHERE
clause. -
If there is no matching record for the right table in the
<PRE class=programlisting>mysql> SELECT table1.* FROM table1 -> LEFT JOIN table2 ON table1.id=table2.id -> WHERE table2.id IS NULL;</PRE>ON
orUSING
part in aLEFT JOIN
, a row with all columns set toNULL
is used for the right table. You can use this fact to find records in a table that have no counterpart in another table:This example finds all rows in
table1
with anid
value that is not present intable2
(that is, all rows intable1
with no corresponding row intable2
). This assumes thattable2.id
is declaredNOT NULL
. See Section 7.2.9, “How MySQL OptimizesLEFT JOIN
andRIGHT JOIN
”. -
The
<PRE class=programlisting>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</PRE>USING
(column_list)
clause names a list of columns that must exist in both tables. The following two clauses are semantically identical: -
The
NATURAL [LEFT] JOIN
of two tables is defined to be semantically equivalent to anINNER JOIN
or aLEFT JOIN
with aUSING
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 toLEFT JOIN
. To keep code portable across databases, it's recommended to useLEFT JOIN
instead ofRIGHT JOIN
. -
STRAIGHT_JOIN
is identical toJOIN
, 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:
<PRE class=programlisting>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;</PRE>See Section 7.2.9, “How MySQL Optimizes LEFT JOIN
and RIGHT JOIN
”.
[출처] modestia2004
"쇼핑몰·홈페이지·오픈마켓
블로그·페이스북·이메일 등의 각종 마케팅 글쓰기, 각종 광고, 영업, 판매, 제안서, 전단지 반응율 3배×10배 이상 높이는 마법의 8단계 공식" |
☞자세히보기 |
|
|