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.
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.
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.
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 | [email protected] |
2 | Pedro | Salazar | [email protected] |
3 | Juan | Gonzalez | [email protected] |
4 | Paola | Garcia | [email protected] |
5 | Lina | Sanchez | [email protected] |
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 |
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 | [email protected] | 01/31/2018 | 254 |
Juan | [email protected] | 02/02/2018 | 189 |
Lina | [email protected] | 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.
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 | [email protected] | 01/31/2018 | 254 |
Juan | [email protected] | 02/02/2018 | 189 |
Lina | [email protected] | 02/02/2018 | 125 |
Diego | [email protected] | Null | Null |
Paola | [email protected] | Null | Null |
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 | [email protected] | 01/31/2018 | 254 |
Juan | [email protected] | 02/02/2018 | 189 |
Lina | [email protected] | 02/02/2018 | 125 |
Null | Null | 03/02/2018 | 100 |
Null | Null | 03/02/2018 | 125 |
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 | [email protected] | 01/31/2018 | 254 |
Juan | [email protected] | 02/02/2018 | 189 |
Lina | [email protected] | 02/02/2018 | 125 |
Null | Null | 03/02/2018 | 100 |
Null | Null | 03/02/2018 | 125 |
Diego | [email protected] | Null | Null |
Paola | [email protected] | 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.
Gracias Diego! Al principio no lo entendía, pero saque una captura de las 2 tablas que usaste a modo de ejemplo, y me puse a analizar despacio y ya entiendo un poco mas sobre el uso del comando JOIN. Todavía no lo domino completamente, pero ya es un primer paso.
Un saludo!
Bien explicado
Muy bien Diego me sirvió de complemento para el curso de MySQL y SQL. Gracias
excelente explicacion
Que buena explicacion, mas claro agua.
Una pregunta: que diferencia lógica dentro del motor de BBDD hay entre estas 2 consultas:
Select * from productos as prod, ventas as vta where prod.codprod = vta.codprod
Go
Select * from productos as prod
Inner join ventas as vta
On prod.codprod = vta.codprof
Go
??
La principal diferencia es que con Joins puede ser más fácil leer la query y las tablas que consulta. Dependiendo del motor de base de datos puede haber alguna diferencia de rendimiento en favor del Join.
Gracias, eso mismo era lo que estaba pensando. Pero estaba viendo a ver si teoricamente existe alguna ventaja ya que quisiera poder hacer que en donde estoy actualmente lo implementen, ya que, es horrible leer las juntas con where
Muy bueno el aporte, no había logrado captarlo y tu aporte me ha servido mucho.
Buena explicacion
Excelente explicación, ya me queda todo mucho más claro 😄
Estimado GOLLUM 23
Debes aclarar a los usuarios que OUTER JOIN o FULL OUTER JOIN son la oveja negra en MySQL, ya que no son directamente compatibles, pero sí se puede conseguir un efecto similar uniendos las consultas LEFT JOIN y RIGHT JOIN.
Ejemplo:
SELECT nombre, email, fecha, valor
FROM clientes LEFT JOIN pedidos
ON clientes.cliente_id = pedidos.cliente_id
UNION
SELECT nombre, email, fecha, valor
FROM clientes RIGHT JOIN pedidos
ON clientes.cliente_id = pedidos.cliente_id;
Aclaró que esta explicación es hablando de MySQL, si al dia de hoy intentan realizar el ejercicio con los ejemplos, el FULL JOIN les dara un error.
SELECT nombre, email, fecha, valor
FROM pedidos FULL JOIN clientes
ON clientes.cliente_id = pedidos.cliente_id;
Muchas gracias.
Preguntaaa
¿Qué es más eficaz en términos de rendimiento? ¿Join o Where?