Skip to main content

¿Cómo utilizar los diferentes tipos de JOINS y cuáles son sus casos de uso?

La sentencia JOIN nos permite combinar registros de diferentes tablas, mediante una condición de combinación que determinará cómo se relacionarán las tablas involucradas en la consulta. La posición que tiende a ocupar dentro de una consulta es después de la cláusula FROM, quedando algo como lo siguiente:

SELECT campo_1, campo_2, f… FROM tabla_a JOIN tabla_b ON tabla_a.campo = tabla_b.campo

En este caso, los registros de la tabla A se relacionarán con los registros de la tabla B, mediante el campo especificado en la cláusula ON de la consulta.

Existen diversos tipos de JOINS dependiendo del tipo de relación que se desea realizar. A continuación explicaremos tres de los más utilizados.

INNER JOIN

Un INNER JOIN devolverá sólo aquellos registros que cumplan con la condición especificada. Es decir, aquellas filas que tengan coincidencias en ambas tablas a través del campo utilizado para realizar la intersección.

A modo de ejemplo, situémonos en el caso en que tenemos dos tablas, una de personas y otra de vehículos, en donde una persona puede ser o no ser dueña de un vehículo. Además, la tabla vehículo contendrá una llave foránea para hacer referencia a la persona que es dueña de dicho vehículo. Si lo graficamos sería algo como esto:

Si realizamos una INNER JOIN mediante el campo id de la tabla personas, podremos encontrar dos coincidencias en ambas tablas, dejando a la persona con id 3 fuera de los resultados.

La consulta quedaría así:

SELECT p.id, p.nombre, p.apellido, v.marca, v.color FROM personas as p INNER JOIN vehiculos as v ON p.id = v.id_persona

Entregando el siguiente resultado:

LEFT JOIN

Un LEFT JOIN devolverá todos los registros presentes en la tabla declarada a la izquierda de la consulta y, de la tabla declarada a la derecha, solo devolverá aquellos registros en donde exista coincidencia mediante el campo utilizado para la unión.

Para graficar la consulta, utilizemos un ejemplo similar al presentado en el caso anterior :

SELECT p.id, p.nombre, p.apellido, v.marca, v.color FROM personas as p LEFT JOIN vehiculos as v ON p.id = v.id_persona

Al realizar la consulta, obtendríamos un resultado como este:

Dado que la tabla personas se encuentra a la izquierda de la consulta, se mostrarán todos los registros de esta tabla, sin importar si existe o no coincidencia dentro de la tabla vehículo. En los casos en que no exista coincidencia, los campos se mostraran como null.

RIGHT JOIN

El comportamiento de un RIGHT JOIN es muy similar al LEFT JOIN, pero invirtiendo la posición, es decir, devolverá todos los registros presentes en la tabla declarada a la derecha de la consulta y, de la tabla declarada a la izquierda, solo devolverá aquellos registros en donde exista coincidencia.

A modo de ejemplo, podemos utilizar el mismo caso aplicado anteriormente e invertir la posición de las tablas, es decir, la consulta quedaría así:

SELECT p.id, p.nombre, p.apellido, v.marca, v.color FROM vehiculos as v RIGHT JOIN personas as p ON p.id = v.id_persona

Su resultado sería idéntico al presentado anteriormente:

Dado que esta vez la tabla personas se encuentra derecha de la consulta, y la tabla vehículos a la izquierda, al aplicar el RIGHT JOIN, obtendríamos todos los registros de personas, y solo aquellos registros que coincidan con el campo utilizado para la intersección de la tabla vehículos.

¡Pruebalo tu mismo!

Te dejamos el código necesario para que realices los ejemplos presentes en este artículo*.

CREATE TABLE personas (
    id INT PRIMARY KEY,
    nombre VARCHAR(50),
    apellido VARCHAR(50),
    edad INT
  );
  
CREATE TABLE vehiculos (
    id INT PRIMARY KEY,
    marca VARCHAR(50),
    color VARCHAR(50),
    id_persona INT,
    FOREIGN KEY (id_persona) REFERENCES personas(id)
);
  
INSERT INTO personas (id, nombre, apellido, edad) VALUES
  (1, 'Julio', 'González', 38),
  (2, 'Roberto', 'Toro', 25),
  (3, 'Catalina', 'Perez', 19);
  
INSERT INTO vehiculos (id, marca, color, id_persona) VALUES
  (1, 'Chevrolet', 'Rojo', 1),
  (2, 'Kia', 'Blanco', 2);

* Los ejempos han sido probados con MySQL 8.0.33. Es posible que con otro motor de base de datos sea necesario una leve adaptación.

<solutionops-team> Autor: Jonathan Urrutia </solutionops-team>

× ¿En qué podemos ayudarte?