mysql.h


JOIN

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.

  • Se puede definir un alias para una referencia de tabla usando tbl_name AS alias_name o tbl_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;
  • El condicional ON es cualquier expresión condicional de la forma que puede usarse en una cláusula WHERE.
  • Si no hay ninguna fila coincidente en la tabla derecha en la parte ON o USING en un LEFT JOIN, se usa una fila con un valor NULL para todas las columnas para la tabla derecha. Se puede usar este comportamiento para encontrar registros en una tabla que no tengan contraparte en otra tabla:
    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.
  • La cláusula USING (column_list) nombra una lista de columnas que deben existir en ambas tablas. Las dos cláusulas siguientes son idénticas semánticamente:
    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
  • La reunión NATURAL [LEFT] JOIN de dos tablas se define para que sea equivalente semánticamente a un INNER JOIN o a un LEFT JOIN con una cláusula USING que nombre todas las columnas que existan en ambas tablas.
  • INNER JOIN y , (coma) son equivalentes semánticamente en ausencia de una condición de reunión: ambas producirán un producto cartesiano entre las tablas especificadas (esto es, todas y cada una de las filas en la primera tabla se reunirán con todas las de las segunda tabla).
  • RIGHT JOIN trabaja de forma análoga a LEFT JOIN. Para mantener el código portable a través de las bases de datos, se recomienda usar LEFT JOIN en lugar de RIGHT JOIN.
  • STRAIGHT_JOIN es idéntico a JOIN, excepto que la tabla izquierda siempre es leída antes que la tabla derecha. Esto se puede usar para aquellos (pocos) casos para los cuales el optimizador de join coloca las tablas en el orden equivocado.

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;