Volver a la lista de artículos Artículos
Lectura de 10 minutos

Explicación de los tipos de JOIN en SQL

¿Cuál es la diferencia entre INNER JOIN, LEFT JOIN, RIGHT JOIN y FULL JOIN en SQL? ¿Cuándo se debe utilizar cada una de ellas? Aquí tenemos las respuestas.

Quiere combinar datos de dos o más tablas diferentes, pero no está seguro de cómo hacerlo en SQL. No te preocupes. En este artículo, te mostraré cómo utilizar la cláusula SQL JOIN para combinar datos de dos tablas. Hay diferentes tipos de SQL JOIN que puedes utilizar para obtener diferentes resultados. Si quieres aprender las diferencias entre INNER JOIN, LEFT JOIN, RIGHT JOIN, y FULL JOIN, sigue leyendo. Este artículo es para ti.

Primero, comencemos con lo básico: ¿qué es una sentencia JOIN y cómo funciona?

¿Qué es un JOIN SQL?

Una cláusula JOIN se utiliza cuando se necesita combinar datos de dos o más tablas en un conjunto de datos. Los registros de ambas tablas se comparan en función de una condición (también denominada predicado JOIN ) que se especifica en la cláusula JOIN. Si la condición se cumple, los registros se incluyen en la salida.

En este artículo, explicaré el concepto de SQL JOIN y los diferentes tipos de JOIN mediante ejemplos. Así que, antes de seguir adelante, echemos un vistazo a las tablas que vamos a utilizar en este artículo.

Conocer la base de datos

Vamos a utilizar tablas de una base de datos bancaria ficticia. La primera tabla es called account y contiene datos relacionados con las cuentas bancarias de los clientes:

account_idoverdraft_amtcustomer_idtype_idsegment
25568891200042RET
1323598795155011RET
2225546500052RET
5516229600045RET
5356222750055RET
2221889540012RET
245568812500502CORP
13224886562500511CORP
13235987953100521CORP
13231115951220531CORP

tabla de cuentas

Esta tabla contiene 10 registros (10 cuentas) y cinco columnas:

  • account_id - Identifica de forma única cada cuenta.
  • overdraft_amount - El límite de sobregiro de cada cuenta.
  • customer_id - Identifica de forma única a cada cliente.
  • type_id - Identifica el tipo de esa cuenta.
  • segment - Contiene los valores "RET" (para clientes minoristas) y "CORP" (para clientes corporativos).

La segunda tabla se llama customer y contiene datos relacionados con los clientes:

customer_idnamelastnamegendermarital_status
1MARCTESCOMY
2ANNAMARTINFN
3EMMAJOHNSONFY
4DARIOPENTALMN
5ELENASIMSONFN
6TIMROBITHMN
7MILAMORRISFN
8JENNYDWARTHFY

tabla de clientes

Esta tabla contiene ocho registros y cinco columnas:

  • customer_id - Identifica de forma exclusiva cada cuenta.
  • name - El nombre del cliente.
  • lastname - Apellido del cliente.
  • gender- El sexo del cliente (M o F).
  • marital_status - Si el cliente está casado (S o N).

Ahora que tenemos estas dos tablas, podemos combinarlas para mostrar resultados adicionales relacionados con los datos del cliente o de la cuenta. JOIN puede ayudarnos a obtener respuestas a preguntas como:

  • ¿A quién pertenece cada cuenta de la tabla account tabla?
  • ¿Cuántas cuentas tiene Marc Tesco?
  • ¿Cuántas cuentas tiene una clienta?
  • ¿Cuál es el importe total de los descubiertos de todas las cuentas de Emma Johnson?

Para responder a cada una de estas preguntas, tenemos que combinar dos tablas (account y customer) utilizando una columna que aparece en ambas tablas (en este caso, customer_id). Una vez que combinemos las dos tablas, tendremos la información de la cuenta y del cliente en una sola salida.

Hay que tener en cuenta que en la tabla account tenemos algunos clientes que no se encuentran en la tabla customer tabla. (La información sobre los clientes corporativos se almacena en otro lugar). Además, tenga en cuenta que algunos ID de clientes no están presentes en la account tabla; algunos clientes no tienen cuentas.

Hay varias formas de combinar dos tablas. O, dicho de otro modo, podemos decir que hay varios tipos diferentes de SQL JOIN.

Los 4 tipos de JOIN de SQL

Los tipos de SQL JOIN incluyen:

  • INNER JOIN (también conocido como "simple" JOIN). Este es el tipo más común de JOIN.
  • LEFT JOIN (o LEFT OUTER JOIN)
  • RIGHT JOIN (o RIGHT OUTER JOIN)
  • FULL JOIN (o FULL OUTER JOIN)
  • Las autouniones y las uniones cruzadas también son posibles en SQL, pero no hablaremos de ellas en este artículo. Para más información, consulta la Guía Ilustrada de la Autounión SQL y la Guía Ilustrada de la Unión Cruzada SQL.

Vamos a profundizar en los cuatro primeros tipos de SQL JOIN. Usaré un ejemplo para explicar la lógica y la sintaxis de cada tipo. A veces la gente usa diagramas de Venn cuando explica los tipos de JOIN de SQL. No voy a usarlos aquí, pero si eso es lo tuyo entonces revisa el artículo Cómo aprender Tipos de JOIN en SQL.

INNER JOIN

INNER JOIN se utiliza para mostrar registros coincidentes de ambas tablas. También se denomina JOIN simple; si omite la palabra clave INNER (o cualquier otra palabra clave, como LEFT, RIGHT, o FULL) y sólo utiliza JOIN, este es el tipo de unión que obtendrá por defecto.

Normalmente hay dos (o más) tablas en una sentencia join. Las llamamos tablas izquierda y derecha. La tabla izquierda se encuentra en la cláusula FROM y, por tanto, a la izquierda de la palabra clave JOIN. La tabla derecha se encuentra entre las palabras clave JOIN y ON, o a la derecha de la palabra clave JOIN.

Si la condición JOIN se cumple en un INNER JOIN, ese registro se incluye en el conjunto de datos. Puede ser de cualquiera de las dos tablas. Si el registro no cumple los criterios, no se incluye. La imagen siguiente muestra lo que ocurriría si el color azul fuera el criterio de unión de las tablas izquierda y derecha:

INNER JOIN

Veamos cómo funciona INNER JOIN en nuestro ejemplo. Voy a hacer un simple JOIN en la cuenta y el cliente para mostrar account y customer información en una salida:

SELECT account.*,
      customer.name,
      customer.lastname,
      customer.gender,
      customer.marital_status
FROM account 
JOIN customer 
ON account.customer_id=customer.customer_id;

A continuación se explica brevemente lo que ocurre:

  • Estoy usando JOIN porque estamos fusionando los atributos account y customer tablas.
  • El predicado JOIN está definido por la igualdad:

account.customer_id = customer.customer_id

En otras palabras, los registros se comparan por los valores de la columna customer_id:

JOIN
  • Los registros que comparten el mismo valor de ID de cliente se emparejan. (Los registros que no coinciden en ninguna de las dos tablas (mostrados en gris) no se incluyen en el conjunto de resultados.
  • Para los registros que tienen una coincidencia, todos los atributos de la tabla account se muestran en el conjunto de resultados. Los atributos de nombre, apellido, sexo y estado civil de la tabla customer de la tabla.

Después de ejecutar este código, SQL devuelve lo siguiente:

account_idoverdraft_amountcustomer_idtype_idsegmentnamelastnamegendermarital_status
25568891200042RETDARIOPENTALMN
1323598795155011RETMARCTESCOMY
2225546500052RETELENASIMSONFN
5516229600045RETDARIOPENTALMN
5356222750055RETELENASIMSONFN
2221889540012RETMARCTESCOMY

INNER JOIN resultado

Como mencionamos anteriormente, sólo se devuelven los registros de color (coincidentes); todos los demás se descartan. En términos comerciales, mostramos todas las cuentas minoristas con información detallada sobre sus propietarios. Las cuentas no minoristas no se muestran porque la información de sus clientes no se almacena en la tabla customer tabla.

JUNTA IZQUIERDA

A veces necesitará mantener todos los registros de la tabla izquierda, incluso si algunos no tienen una coincidencia en la tabla derecha. En el último ejemplo, las filas grises no aparecen en la salida. Se trata de cuentas corporativas. En algunos casos, es posible que desee tenerlas en el conjunto de datos, aunque sus datos de cliente se dejen vacíos. Si queremos devolver los registros no emparejados de la tabla de la izquierda, entonces debemos escribir un LEFT JOIN. A continuación, puede ver que el LEFT JOIN devuelve todo lo que hay en la tabla de la izquierda y las filas que coinciden en la tabla de la derecha.

JOIN IZQUIERDO

Así es como quedaría la consulta anterior si utilizáramos LEFT JOIN en lugar de INNER JOIN:

SELECT account.*,
      customer.name,
      customer.lastname,
      customer.gender,
      customer.marital_status
FROM account 
LEFT JOIN customer 
ON account.customer_id=customer.customer_id;

La sintaxis es idéntica. El resultado, sin embargo, no es el mismo... Ahora podemos ver las cuentas de la empresa (registros grises) en los resultados:

account_idoverdraft_amountcustomer_idtype_idsegmentnamelastnamegendermarital_status
25568891200042RETDARIOPENTALMN
1323598795155011RETMARCTESCOMY
2225546500052RETELENASIMSONFN
5516229600045RETDARIOPENTALMN
5356222750055RETELENASIMSONFN
2221889540012RETMARCTESCOMY
245568812500502CORPNULLNULLNULLNULL
13224886562500511CORPNULLNULLNULLNULL
13235987953100521CORPNULLNULLNULLNULL
13231115951220531CORPNULLNULLNULLNULL

Left join - cuenta con cliente

Observe cómo atributos como el nombre, el apellido, el sexo y el estado civil en las últimas cuatro filas están rellenados con NULLs. Esto se debe a que estas filas grises no tienen coincidencias en la tabla customer tabla (es decir, los valores customer_id de 50, 51 ,52 , y 53 no están presentes en la customer tabla). Por lo tanto, esos atributos se han dejado NULL en este resultado.

RIGHT JOIN

De forma similar a LEFT JOIN, RIGHT JOIN mantiene todos los registros de la tabla derecha (incluso si no hay ningún registro coincidente en la tabla izquierda). Aquí está la conocida imagen para mostrarle cómo funciona:

JOIN DERECHO

Una vez más, utilizamos el mismo ejemplo. Sin embargo, hemos sustituido LEFT JOIN por RIGHT JOIN:

SELECT account.account_id,
      account.overdraft_amount,
      account.type_id,
      account.segment,
      account.customer_id,
      customer.customer_id
      customer.name,
      customer.lastname,
      customer.gender,
      customer.marital_status
FROM account 
RIGHT JOIN customer 
ON account.customer_id=customer.customer_id;

La sintaxis es prácticamente la misma. He hecho un pequeño cambio más: Además de account.customer_id, también he añadido la columna customer.customer_id al conjunto de resultados. Lo he hecho para mostrar lo que ocurre con los registros de la tabla customer que no tienen una coincidencia en la tabla izquierda (account) de la tabla.

Este es el resultado:

account_idoverdraft_amounttype_idsegmentcustomer_idcustomer_idnamelastnamegendermarital_status
132359879515501RET11MARCTESCOMY
222188954002RET11MARCTESCOMY
NULLNULLNULLNULLNULL2ANNAMARTINFN
NULLNULLNULLNULLNULL3EMMAJOHNSONFY
2556889120002RET44DARIOPENTALMN
551622960005RET44DARIOPENTALMN
222554650002RET55ELENASIMSONFN
535622275005RET55ELENASIMSONFN
NULLNULLNULLNULLNULL6TIMROBITHMN
NULLNULLNULLNULLNULL7MILAMORRISFN
NULLNULLNULLNULLNULL8JENNYDWARTHFY

Resultado del RIGHT JOIN

Como puede ver, todos los registros de la tabla derecha se han incluido en el conjunto de resultados. Tenga en cuenta que

  • Los ID de cliente no coincidentes de la tabla derecha (números 2,3, 6,7 y 8, mostrados en gris) tienen sus atributos de cuenta establecidos en NULL en este conjunto de resultados. Se trata de clientes minoristas que no tienen una cuenta bancaria y, por lo tanto, no hay registros en la tabla account tabla.
  • Es de esperar que la tabla resultante tenga ocho registros porque ese es el número total de registros de la tabla. customer tabla. Sin embargo, este no es el caso. Tenemos 11 registros porque los ID de cliente 1, 4 y 5 tienen dos cuentas cada uno en la tabla. account tabla. Se muestran todas las posibles coincidencias.

FULL (OUTER) JOIN

Le he mostrado cómo mantener todos los registros de las tablas izquierda o derecha. Pero, ¿qué ocurre si quiere conservar todos los registros de ambas tablas? En nuestro caso, querría mostrar todos los registros coincidentes más todas las cuentas corporativas más todos los clientes sin cuentas. Para ello, puede utilizar FULL OUTER JOIN. Este tipo de JOIN emparejará todas las columnas coincidentes y también mostrará todas las columnas no coincidentes de ambas tablas. Los atributos no coincidentes se rellenarán con NULLs. Observe la siguiente imagen:

FULL (OUTER) JOIN

Esta es la sintaxis completa de OUTER JOIN:

SELECT account.*,
      CASE WHEN customer.customer_id IS NULL
                 THEN account.customer_id 
                 ELSE customer.customer_id 
       END customer_id
      customer.name,
      customer.lastname,
      customer.gender,
      customer.marital_status
FROM account 
FULL JOIN customer 

ON account.customer_id=customer.customer_id;

Ahora el resultado se ve así:

account_idoverdraft_amountcustomer_idtype_idsegmentnamelastnamegendermarital_status
25568891200042RETDARIOPENTALMN
1323598795155011RETMARCTESCOMY
2225546500052RETELENASIMSONFN
5516229600045RETDARIOPENTALMN
5356222750055RETELENASIMSONFN
2221889540012RETMARCTESCOMY
245568812500502CORPNULLNULLNULLNULL
13224886562500511CORPNULLNULLNULLNULL
13235987953100521CORPNULLNULLNULLNULL
13231115951220531CORPNULLNULLNULLNULL
NULLNULL2NULLNULLANNAMARTINFN
NULLNULL3NULLNULLEMMAJOHNSONFY
NULLNULL6NULLNULLTIMROBITHMN
NULLNULL7NULLNULLMILAMORRISFN
NULLNULL8NULLNULLJENNYDWARTHFY

Resultado de la unión externa completa

Observe cómo las últimas cinco filas tienen atributos de cuenta rellenados con NULLs. Esto se debe a que estos clientes no tienen registros en la tabla account tabla. Observe también que los clientes 50, 51, 52 y 53 tienen nombres o apellidos y otros atributos de la tabla customer con NULLs. Esto se debe a que no existen en la tabla customer tabla. Aquí, customer_id en la tabla de resultados nunca es NULL porque definimos customer_id con una sentencia CASE WHEN:

CASE WHEN customer.customer_id IS NULL
                 THEN account.customer_id 
                 ELSE customer.customer_id END customer_id

Esto significa que customer_id en la tabla de resultados es una combinación de account.customer_id y customer.customer_id (es decir, cuando una es NULL, se utiliza la otra). También podríamos mostrar ambas columnas en la salida, pero esta sentencia CASE WHEN es más conveniente.

No pasa nada si estás confundido por todos los diferentes Tipos de JOIN en SQL y lo que hacen. Simplemente sigue con ello. Le recomiendo que vea nuestra hoja de trucos de SQL JOIN. Manténgala cerca de usted; es muy útil al codificar. También es útil revisar nuestro artículo sobre la práctica de Tipos de JOIN en SQL. Cuanto más aprendas y practiques, más claro será Tipos de JOIN en SQL.

A continuación: Practicar Tipos de JOIN en SQL

En este artículo, hemos introducido diferentes tipos de SQL JOIN. Las uniones internas, izquierdas, derechas y completas devuelven resultados diferentes. Ahora debe poner en práctica estos conocimientos. En LearnSQL.espuedes encontrar más ejemplos para practicar. Nuestros cursos interactivos de consultas SQL y Tipos de JOIN en SQL cubren temas de JOIN, así que te animo a que los pruebes.