56

SQL Join en detalle

175626Puntos

hace 6 años

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:

join.jpg

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_idnombreapellidoemail
1DiegoForero[email protected]
2PedroSalazar[email protected]
3JuanGonzalez[email protected]
4PaolaGarcia[email protected]
5LinaSanchez[email protected]

Tabla Pedidos (pedidos)

order_idfechavalorcliente_id
101/31/20182542
202/02/20181255
302/02/20181893
403/02/20181006
503/02/20181259

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:

nombreemailfechavalor
Pedro[email protected]01/31/2018254
Juan[email protected]02/02/2018189
Lina[email protected]02/02/2018125

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í:

nombreemailfechavalor
Pedro[email protected]01/31/2018254
Juan[email protected]02/02/2018189
Lina[email protected]02/02/2018125
Diego[email protected]NullNull
Paola[email protected]NullNull

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.

nombreemailfechavalor
Pedro[email protected]01/31/2018254
Juan[email protected]02/02/2018189
Lina[email protected]02/02/2018125
NullNull03/02/2018100
NullNull03/02/2018125

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.

nombreemailfechavalor
Pedro[email protected]01/31/2018254
Juan[email protected]02/02/2018189
Lina[email protected]02/02/2018125
NullNull03/02/2018100
NullNull03/02/2018125
Diego[email protected]NullNull
Paola[email protected]NullNull

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.

Diego Alexander
Diego Alexander
gollum23

175626Puntos

hace 6 años

Todas sus entradas
Escribe tu comentario
+ 2
Ordenar por:
2
17091Puntos

Que buena explicacion, mas claro agua.

2
3970Puntos

excelente explicacion

2
6536Puntos

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!

2
14225Puntos

Muy bien Diego me sirvió de complemento para el curso de MySQL y SQL. Gracias

1
1831Puntos

Preguntaaa
¿Qué es más eficaz en términos de rendimiento? ¿Join o Where?

1
10235Puntos

Excelente explicación, ya me queda todo mucho más claro 😄

1
2206Puntos

Muy bueno el aporte, no había logrado captarlo y tu aporte me ha servido mucho.

1
315Puntos

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.

1
4280Puntos

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
??

2
175626Puntos
4 años

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.

1
4280Puntos
4 años

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