7th Jul 2022 Lectura de 10 minutos Explicación de los tipos de JOIN en SQL Marija Ilic SQL aprender SQL JOIN Índice ¿Qué es un JOIN SQL? Conocer la base de datos Los 4 tipos de JOIN de SQL INNER JOIN JUNTA IZQUIERDA RIGHT JOIN FULL (OUTER) JOIN A continuación: Practicar 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: 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: 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. 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: 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: 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. Tags: SQL aprender SQL JOIN