MySQL soporta las siguientes sintaxis para JOIN para ser usadas como la parte de referencia de tabla en sentencias SELECT y sentecias DELETE y UPDATE multitabla:
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
Donde table_reference se define como:
tbl_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | [FORCE INDEX (key_list)]]
Y join_condition se define como:
ON conditional_expr | USING (column_list)
Generalmente no será necesario especificar condiciones en la parte ON para restringir qué filas se quieren en el conjunto de resultados, pero es mejor especificar esas condiciones en la cláusula WHERE. Hay algunas excepciones a esta regla.
Hay que tener en cuenta que la sintaxis INNER JOIN permite una join_condition sólo a partir de MySQL 3.23.17. Para JOIN y CROSS JOIN sólo se permite a partir de MySQL 4.0.11.
La sintaxis { OJ ... LEFT OUTER JOIN ...} mostrada anteriormente sólo existe por compatibilidad con ODBC.
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;
mysql> SELECT table1.* FROM table1 -> LEFT JOIN table2 ON table1.id=table2.id -> WHERE table2.id IS NULL;Este ejemplo encuentra todas las filas en table1 con un valor de id que no esté presente en table2 (esto es, todas las filas en table1 sin correspondencia en table2). Se asume que table2.id está declarado como NOT NULL.
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
Desde MySQL 3.23.12, se pueden obtener pistas sobre cuáles son los índices que debe usar MySQL cuando recupere información desde una tabla. Mediante la especificación de USE INDEX (key_list), se puede indicar a MySQL que use sólo uno de los índices posibles para encontrar filas en una tabla. La sintaxis alternativa IGNORE INDEX (key_list) se puede usar para indicar a MySQL que no use algún índice particular. Estas pistas son aconsejable si EXPLAIN muestra que MySQL está usando el índice equivocado de una lista de posibles índices.
A partir de MySQL 4.0.9, se puede usar FORCE INDEX. Esto funciona como USE INDEX (key_list) pero con el añadido de que se asumirá que un recorrido secuencial de la tabla será demasiado costoso. En otras palabras, se usará un un recorrido secuencial sólo si no hay modo de usar uno de los índices dados para encontrar filas en la tabla.
USE KEY, IGNORE KEY y FORCE KEY son sinónimos de USE INDEX, IGNORE INDEX y FORCE INDEX.
Nota: USE INDEX, IGNORE INDEX y FORCE INDEX sólo afectan a aquellos índices usados cuando MySQL decide el modo de encontrar filas en la tabla y cómo hacer la reunión. No afectan a si un índice será usado cuando se resuelva una cláusula ORDER BY o GROUP BY.
Algunos ejemplos de reunión:
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;
(4.1.1)
© Abril de 2005 Salvador Pozo, salvador@conclase.net