Una de las acciones más frecuentes a la hora de trabajar con bases de datos es hacer consultas. Si nuestra base de datos está correctamente normalizada para evitar la redundancia de datos, vamos a tener que hacer uso de consultas que permitan traer información de más de una tabla de la base de datos.
Existen dos formas de hacerlo: la primera, usar la cláusula WHERE para igualar dos campos de tablas y traer solo los registros que tienen coincidencia. La otra es usar JOINS. Esa es la que aprenderemos a usar hoy.
Conociendo la estructura de un consulta
Primero que todo, vamos a ver la estructura de una consulta usando JOIN y lo que significa cada parte.
SELECT * nombre, email, fecha, valor /*Selecciona los campos a mostrar en el resultado de la consulta*/
FROM clientes /*Tabla base para traer los registros (LEFT)*/
(INNER|LEFT|RIGHT|FULL) JOIN pedidos /* Tipo de JOIN y tabla con la cual se hace el JOIN (RIGHT)*/
ON clientes.cliente_id = pedidos.cliente_id /*Comparación entre columnas.*/
A esta consulta le podemos agregar cláusulas WHERE, ORDER BY, entre otras, para obtener resultados más precisos como definir un rango de fechas, por ejemplo.
Tipos de JOINS
Ya vimos cómo se construye una consulta usando JOINS. Ahora veamos los tipos de JOINS que existen:

INNER JOIN => Trae los resultados de las tablas que cumplen con la condición de comparación entre columnas.
LEFT JOIN => Trae todos los resultados de las tablas que cumplen con la condición de comparación entre columnas y, adicionalmente, trae todos los datos de la tabla de la izquierda.
RIGHT JOIN => Similar a la anterior pero con la tabla de la derecha.
FULL JOIN => Trae los resultados de las tablas que cumplen con la condición de comparación entre columnas, además de los resultados de las o registros de las tablas de la derecha y la izquierda.
Practicando consultas con JOINS
Vamos a ver esto con ejemplos prácticos para entenderlo mejor.
Suponiendo que tenemos dos tablas, una llamada clientes y la otra pedidos, vamos a ver los diferentes resultados.
Tabla Clientes (clientes)
cliente_id | nombre | apellido | |
---|---|---|---|
1 | Diego | Forero | df@gmail.com |
2 | Pedro | Salazar | ps@gmail.com |
3 | Juan | Gonzalez | jg@gmail.com |
4 | Paola | Garcia | pg@gmail.com |
5 | Lina | Sanchez | ls@gmail.com |
Tabla Pedidos (pedidos)
order_id | fecha | valor | cliente_id |
---|---|---|---|
1 | 01/31/2018 | 254 | 2 |
2 | 02/02/2018 | 125 | 5 |
3 | 02/02/2018 | 189 | 3 |
4 | 03/02/2018 | 100 | 6 |
5 | 03/02/2018 | 125 | 9 |
INNER JOIN
SELECT * nombre, email, fecha, valor FROM clientes INNER JOIN pedidos ON clientes.cliente_id = pedidos.cliente_id
Esta consulta nos como resultado esto:
nombre | fecha | valor | |
---|---|---|---|
Pedro | ps@gmail.com | 01/31/2018 | 254 |
Juan | jg@gmail.com | 02/02/2018 | 189 |
Lina | ls@gmail.com | 02/02/2018 | 125 |
Como podemos ver, solo trae los registros de los clientes que tienen pedidos y los pedidos de los clientes que están en la tabla, ya que son los que cumplen la condición.
LEFT JOIN
SELECT * nombre, email, fecha, valor FROM clientes LEFT JOIN pedidos ON clientes.cliente_id = pedidos.cliente_id
Aquí es importante notar cuál es la tabla de la izquierda, en nuestro caso es la tabla clientes; esta nos va a traer todos los resultados que coinciden con la condición clientes.cliente_id = pedidos.cliente_id más todos los resultados de la tabla clientes, quedando así:
nombre | fecha | valor | |
---|---|---|---|
Pedro | ps@gmail.com | 01/31/2018 | 254 |
Juan | jg@gmail.com | 02/02/2018 | 189 |
Lina | ls@gmail.com | 02/02/2018 | 125 |
Diego | df@gmail.com | Null | Null |
Paola | pg@gmail.com | Null | Null |
RIGHT JOIN
SELECT * nombre, email, fecha, valor FROM clientes RIGHT JOIN pedidos ON clientes.cliente_id = pedidos.cliente_id
A diferencia de la consulta usando LEFT JOIN, esta consulta nos debe arrojar los pedidos que no tienen clientes, además de los resultados que coinciden con la condición.
nombre | fecha | valor | |
---|---|---|---|
Pedro | ps@gmail.com | 01/31/2018 | 254 |
Juan | jg@gmail.com | 02/02/2018 | 189 |
Lina | ls@gmail.com | 02/02/2018 | 125 |
Null | Null | 03/02/2018 | 100 |
Null | Null | 03/02/2018 | 125 |
FULL JOIN
SELECT * nombre, email, fecha, valor FROM clientes FULL JOIN pedidos ON clientes.cliente_id = pedidos.cliente_id
Esta consulta trae todos los resultados de las dos tablas, trae los registros que coinciden con la condición y, además, los registros de las tablas de la izquierda y derecha.
nombre | fecha | valor | |
---|---|---|---|
Pedro | ps@gmail.com | 01/31/2018 | 254 |
Juan | jg@gmail.com | 02/02/2018 | 189 |
Lina | ls@gmail.com | 02/02/2018 | 125 |
Null | Null | 03/02/2018 | 100 |
Null | Null | 03/02/2018 | 125 |
Diego | df@gmail.com | Null | Null |
Paola | pg@gmail.com | Null | Null |
Como podemos ver, el uso de JOIN nos da muchas posibilidades para nuestras consultas, además de ser bastantes rápidas y sencillas de usar, una vez entiendes cómo funcionan.
Si quieres aprender más de consultas usando SQL puedes ver el curso de Fundamentos de Bases de Datos y el curso de SQL y MySQL.
Curso de SQL y MySQL 2018