MySQL - ¿Qué tipo de combinación elegir?

Noviembre 2016


Este artículo está dirigido a los que recien se inician en MySQL y se han propuesto abordar las combinaciones, pero tienen problemas con los INNER y los OUTER.

Preliminares


Una combinación en MySQL permite obtener información proveniente de varias tablas. Estas tablas deben estar relacionadas por al menos una columna (un apellido, un ID, un número de teléfono, lo que desees, pero estas dos tablas deben tener una columna en comun). Es lo que llamamos un criterio de combinación.

INNER JOIN: intersección de tablas


El INNER JOIN (combinación interna) debe ser utilizado cuando se tiene 2 tablas, y solo se desea obtener la información presente en las 2 tablas.

Ejemplo: se tiene una tabla "personas" conteniendo un gran número de personas con información general (persona_id, apellido, nombre, dirección...). Al lado, se tiene una tabla "ingenieros" conteniendo información propia a los ingenieros (id_ingeniero, persona_id, nombre de la empresa, universidad...). Admitiendo que la base está limpia y todos los ingenieros se encuentran en la tabla "personas". Se desea obtener toda la información de los ingenieros, incluyendo sus direcciones, apellidos, nombres...por lo tanto se necesita la información almacenada en las dos tablas.
Aquí nuestro criterio de combinación es el "id_persona" presente en las dos tablas, y único en cada una de las tablas.
Haremos:
SELECT *
FROM persona p
     INNER JOIN ingenieros i ON i.persona_id = p.persona_id;


Con esto obtendremos toda la información de las personas presentes en las dos tablas.

OUTER JOIN: unión de tablas


El OUTER JOIN (combinación externa) es util si deseamos obtener la información de ambas tablas. En el ejemplo de arriba, solo obtuvimos una parte de la tabla "personas" (las que tienen una linea en la tabla ingenieros).

Aquí especificaremos que deseamos conservar la tabla "personas" completa: tendremos los datos "ingenieros" para los ingenieros, y valores vacios para las personas que no se encuentren en la tabla ingenieros.
Para esto, utilizamos un OUTER JOIN.

LEFT OUTER JOIN


El LEFT OUTER JOIN especifica que la primera tabla nombrada debe permanecer completa.
En nuestro ejemplo:
SELECT * 
FROM persona p
     LEFT OUTER JOIN ingenieros i ON i.persona_id = p.persona_id;


Con esto se obtiene toda la tabla "personas" completada con los datos de la tabla "ingenieros" si existieran.

RIGHT OUTER JOIN


Es lo mismo que el LEFT pero aquí es la segunda tabla que será conservada completa. Eres libre de elegir entre un LEFT o un RIGHT, pero te darás cuenta que en algunos casos de combianciones en cascada, puede ser más práctico.

Nuestra petición sería:
SELECT * 
FROM ingenieros i 
     RIGHT OUTER JOIN persona p ON p.persona_id = i.persona_id;


En nuestro ejemplo, ya que todos los ingenieros están presentes en la tabla "personas", el INNER JOIN es exactamente identico a un OUTER JOIN realizado sobre la tabla ingenieros. En los dos casos ésta sería obtenida completamente.

FULL OUTER JOIN


Igualmente útil, el FULL OUTER JOIN permite extraer la totalidad de los datos de las dos tablas. Habrán bastantes columnas vacias para una u otra de las tablas.

Aquí tendriamos:
SELECT * 
FROM persona p
     FULL OUTER JOIN ingenieros i ON i.persona_id = p.persona_id;


Esto sería equivalente al RIGHT y al LEFT JOIN realizados anteriormente ya que la tabla ingenieros ya está extraida en su totalidad.

Consulta también :
El documento «MySQL - ¿Qué tipo de combinación elegir?» de CCM (es.ccm.net) se encuentra disponible bajo una licencia Creative Commons. Puedes copiarlo o modificarlo siempre y cuando respetes las condiciones de dicha licencia y des crédito a CCM.