<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Salvador HM</title>
    <description>The latest articles on DEV Community by Salvador HM (@salvadorhm).</description>
    <link>https://dev.to/salvadorhm</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1056559%2F1988ae7a-72f2-4468-b2d6-fda022554032.jpeg</url>
      <title>DEV Community: Salvador HM</title>
      <link>https://dev.to/salvadorhm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/salvadorhm"/>
    <language>en</language>
    <item>
      <title>Unir tablas en SQL con JOIN</title>
      <dc:creator>Salvador HM</dc:creator>
      <pubDate>Mon, 19 Jun 2023 15:35:58 +0000</pubDate>
      <link>https://dev.to/salvadorhm/unir-tablas-en-sql-con-join-36o7</link>
      <guid>https://dev.to/salvadorhm/unir-tablas-en-sql-con-join-36o7</guid>
      <description>&lt;p&gt;El concepto de &lt;strong&gt;“JOIN”&lt;/strong&gt; en &lt;strong&gt;SQL&lt;/strong&gt; se utiliza para combinar registros de dos o más tablas en función de una condición relacionada entre ellas. El resultado es una nueva tabla que contiene columnas de ambas tablas, seleccionadas según la condición de unión especificada. Esto permite relacionar y vincular datos de diferentes tablas, lo que es fundamental para realizar consultas complejas y obtener información completa.&lt;/p&gt;

&lt;p&gt;Para comprender mejor el funcionamiento de &lt;strong&gt;“JOIN”&lt;/strong&gt;, es útil entender la &lt;em&gt;teoría de conjuntos&lt;/em&gt; en la que se basa.&lt;/p&gt;

&lt;p&gt;La teoría de conjuntos se refiere a operaciones como unión, intersección y diferencia que se pueden aplicar a conjuntos de elementos.&lt;/p&gt;

&lt;p&gt;Estos conceptos se aplican en el contexto de las tablas de bases de datos relacionales. A continuación, se explican los diferentes tipos de &lt;strong&gt;“JOIN”&lt;/strong&gt; junto con ejemplos y su relación con la teoría de conjuntos:&lt;/p&gt;

&lt;p&gt;Para realizar los ejemplos se tomará como base las siguientes tablas:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Tabla Clientes
&lt;/h2&gt;

&lt;p&gt;Se crea una tabla de clientes con 3 campos id_cliente, nombre y email.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;id_cliente&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="n"&gt;AUTOINCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;nombre&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Tabla ventas
&lt;/h2&gt;

&lt;p&gt;Se crea una tabla de ventas con los campos id_venta, id_cliente y fecha, además de una relación con la tabla de clientes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;ventas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;id_venta&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="n"&gt;AUTOINCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;id_cliente&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;fecha&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Insertar registros en la tabla Clientes
&lt;/h2&gt;

&lt;p&gt;Para las pruebas se anexan 3 clientes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Dejah'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'dejah@email.com'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'John'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'john@email.com'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Carthoris'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'carthoris@email.com'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Insertar registros en la tabla ventas
&lt;/h2&gt;

&lt;p&gt;Para las pruebas se anexan 5 registros, se puede notar que el cliente Carthoris no ha realizado ninguna compra en la tienda (venta).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;ventas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id_cliente&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;fecha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;"6/6/2023"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;"7/6/2023"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;"8/6/2023"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;"9/6/2023"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;"9/6/2023"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;"9/6/2023"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Si se tiene un diseño correcto de base de datos y se hubiera agregado la restricción &lt;strong&gt;REFERENCES&lt;/strong&gt; entre las tablas clientes y ventas, para evitar hacer ventas a clientes que no están registrados no sería posible agregar la venta al cliente 4, pero en este caso no se agrego la restricción con fines de ejemplificar los JOIN.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. INNER JOIN (JOIN):
&lt;/h2&gt;

&lt;p&gt;El &lt;strong&gt;“INNER JOIN”&lt;/strong&gt; combina registros de ambas tablas que tienen una coincidencia en la columna de unión especificada. Esta unión devuelve solo los registros que cumplen con la condición de igualdad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; Se quieren obtener todas las ventas realizadas junto con los nombres de los clientes correspondientes. Para esta consulta se puede usar un “INNER JOIN” de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;ventas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nombre&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;ventas&lt;/span&gt;
&lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;ventas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id_cliente&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id_cliente&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta consulta combina los registros de la tabla &lt;strong&gt;“ventas”&lt;/strong&gt; con los registros de la tabla &lt;strong&gt;“clientes”&lt;/strong&gt; donde los valores de la columna “id_cliente” coinciden en ambas tablas como se muestra en la Imagen 1. &lt;/p&gt;

&lt;p&gt;El resultado será una nueva tabla que contiene los detalles de las ventas junto con los nombres de los clientes correspondientes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LeKpSeDs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i6jv2mem8jivuzoceh33.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LeKpSeDs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i6jv2mem8jivuzoceh33.png" alt="Imagen 1: Resultado de INNER JOIN." width="782" height="318"&gt;&lt;/a&gt;&lt;br&gt;
Imagen 1: Resultado de INNER JOIN.&lt;/p&gt;
&lt;h2&gt;
  
  
  6. LEFT JOIN (LEFT OUTER JOIN):
&lt;/h2&gt;

&lt;p&gt;El &lt;strong&gt;“LEFT JOIN”&lt;/strong&gt; combina todos los registros de la tabla izquierda (primera tabla en la cláusula JOIN) con los registros coincidentes de la tabla derecha (segunda tabla en la cláusula JOIN).&lt;/p&gt;

&lt;p&gt;Si no hay coincidencias en la tabla derecha, se devolverán &lt;strong&gt;NULL&lt;/strong&gt; en las columnas de la tabla derecha.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; Se desea obtener todos los clientes junto con las ventas realizadas por cada uno (si existen), se puede utilizar un “LEFT JOIN” de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ventas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fecha&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;ventas&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id_cliente&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ventas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id_cliente&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta consulta combina todos los registros de la tabla &lt;strong&gt;“clientes”&lt;/strong&gt; con los registros coincidentes de la tabla &lt;strong&gt;“ventas”&lt;/strong&gt; en función de la igualdad de los valores en la columna &lt;strong&gt;“id_cliente”&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Incluso si un cliente no tiene ventas registradas, se devolverá su información junto con NULL en las columnas relacionadas de la tabla &lt;strong&gt;“ventas”&lt;/strong&gt; tal como se muestra en la Imagen 2.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6LDZj0-j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p1sapg5e8e6426e0iq43.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6LDZj0-j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p1sapg5e8e6426e0iq43.png" alt="Imagen 2: Resultado de LEFT JOIN." width="800" height="282"&gt;&lt;/a&gt;&lt;br&gt;
Imagen 2: Resultado de LEFT JOIN.&lt;/p&gt;
&lt;h2&gt;
  
  
  7. RIGHT JOIN (RIGHT OUTER JOIN)
&lt;/h2&gt;

&lt;p&gt;El &lt;strong&gt;“RIGHT JOIN”&lt;/strong&gt; combina todos los registros de la tabla derecha con los registros coincidentes de la tabla izquierda. Si no hay coincidencias en la tabla izquierda, se devolverán NULL en las columnas de la tabla izquierda.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; Si se quieren obtener todas las ventas junto con la información de los clientes correspondientes (si existe), se puede utilizar un “RIGHT JOIN” de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;ventas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nombre&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;
&lt;span class="k"&gt;RIGHT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;ventas&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;ventas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id_cliente&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id_cliente&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta consulta combina todos los registros de la tabla &lt;strong&gt;“ventas”&lt;/strong&gt; con los registros coincidentes de la tabla &lt;strong&gt;“clientes”&lt;/strong&gt; basados en la igualdad de los valores en la columna &lt;strong&gt;“id_cliente”&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Incluso si una venta no está asociada con un cliente, se devolverá su información junto con NULL en las columnas relacionadas de la tabla “clientes” tal como se muestra en la Imagen 3.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NTksZxb7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a6s0llfdehurfyud5ici.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NTksZxb7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a6s0llfdehurfyud5ici.png" alt="Imagen 3: Resultado RIGTH JOIN." width="786" height="360"&gt;&lt;/a&gt;&lt;br&gt;
Imagen 3: Resultado RIGTH JOIN.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Resumen
&lt;/h2&gt;

&lt;p&gt;En resumen, el concepto de &lt;strong&gt;“JOIN”&lt;/strong&gt; en &lt;strong&gt;SQL&lt;/strong&gt; permite combinar registros de diferentes tablas en función de condiciones de igualdad.&lt;/p&gt;

&lt;p&gt;Los diferentes tipos de &lt;strong&gt;“JOIN”&lt;/strong&gt; (INNER, LEFT y RIGHT) ofrecen flexibilidad para obtener información específica de acuerdo con las relaciones entre las tablas.&lt;/p&gt;

&lt;p&gt;Estos tipos de &lt;strong&gt;“JOIN”&lt;/strong&gt; se basan en la teoría de conjuntos para combinar conjuntos de datos y proporcionar resultados más completos y relacionados.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>join</category>
      <category>sqlite3</category>
    </item>
  </channel>
</rss>
