Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Explicación visual de los JOINs de SQL

  • 4 Respuestas
  • 5506 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Expermicid

  • *
  • Underc0der
  • Mensajes: 457
  • Actividad:
    0%
  • Reputación 0
  • _-Expermicid-_
    • Ver Perfil
  • Skype: expermicid.xd
« en: Noviembre 12, 2014, 12:25:33 pm »
Comparto este post porque me parecio bastante buena la ayuda que puede ser tener los digramas de Venn para entender los joins

--------------------------------------------------------------------------------

Hace ya algún tiempo, mientras aprendía a hacer consultas avanzadas a SQL a marchas forzadas, empecé a buscar información que me explicara mejor cómo funcionaban los JOINs de SQL. ¡Hay tantos! La verdad es que al principio, cuesta entenderlos bastante.

Pero entonces me topé con un artículo que el bueno de Jeff Atwood (creador de Stackoverflow) escribió allá por el 2007. Jeff, utiliza diagramas de Venn para explicar de manera muy concisa cada JOIN. Soy consciente de que mucha gente no busca en inglés por lo que me dije, ¿por qué no lo traducimos?

Si has intentado comprender cómo funcionan los JOINs y no acabas de entenderlos y, lo que es peor, dudas sobre qué JOIN usar, tan solo debes tener una imagen en mente. Con estos sencillos ejemplos, pretendo solo que te hagas a la idea de lo que un JOIN en concreto te devolverá.

Tengamos estas dos tablas como ejemplos:

Código: Text
  1. id nombre     id  nombre
  2. -- ------     --  ------
  3. 1  Homer      1   Marge
  4. 2  Bart       2   Homer
  5. 3  Marge      3   Spidercerdo
  6. 4  Maggie     4   Moe

Vamos a unir las tablas por el campo del nombre de distintas formas y vamos a ver cómo resultan.

Inner join

Código: MySQL
  1. SELECT * FROM TablaA
  2. INNER JOIN TablaB
  3. ON TablaA.nombre = TablaB.nombre

Código: Text
  1. id  nombre     id   nombre
  2. --  ------     --   ------
  3. 1   Homer      2    Homer
  4. 3   Marge      1    Marge


Un inner join produce únicamente el conjunto de registros que están tanto en la Tabla A como en la Tabla B.

Full outer join

Código: MySQL
  1. SELECT * FROM TablaA
  2. FULL OUTER JOIN TablaB
  3. ON TablaA.nombre = TablaB.nombre

Código: Text
  1. id    nombre     id    nombre
  2. --    ------     --    ------
  3. 1     Homer      2     Homer
  4. 2     Bart       null  null
  5. 3     Marge      1     Marge
  6. 4     Maggie     null  null
  7. null  null       3     Spidercerdo      
  8. null  null       4     Moe


Full outer join produce el conjunto de todos los recursos de la Tabla A y de la Tabla B, haciendo coincidir los registros de ambos lados si están disponibles. Si no hay coincidencias, el lado que falte, contendrá null.

Left outer join

Código: MySQL
  1. SELECT * FROM TablaA
  2. LEFT OUTER JOIN TablaB
  3. ON TablaA.nombre = TablaB.nombre

Código: Text
  1. id  nombre     id    nombre
  2. --  ------     --    ------
  3. 1   Homer      2     Homer
  4. 2   Bart       null  null
  5. 3   Marge      1     Marge
  6. 4   Maggie     null  null


Left outer join reproduce todos los registros de la Tabla A, con los registros completos (donde se pueda), de la Tabla B. Si no hay coincidencias en el registro, el lado derecho contendrá null.

Estas son las operaciones básicas que podemos hacer con JOIN. No obstante, vamos a ver algunos trucos para obtener otras partes de las tablas que nos puedan interesar.

Código: MySQL
  1. SELECT * FROM TableA
  2. LEFT OUTER JOIN TableB
  3. ON TableA.name = TableB.name
  4. WHERE TablaB.id IS null

Código: Text
  1. id  nombre     id     nombre
  2. --  ------     --     ------
  3. 2   Bart       null   null
  4. 4   Maggie     null   null


Para obtener los registros que solo estén en la Tabla A, pero no en la Tabla B, realizaremos el mismo left outer join, y excluimos los registros de la derecha que no queremos, con where.

Código: MySQL
  1. SELECT * FROM TablaA
  2. FULL OUTER JOIN TablaB
  3. ON TableA.nombre = TablaB.nombre
  4. WHERE TablaA.id IS null
  5. OR TablaB.id IS null

Código: Text
  1. id    nombre     id    nombre
  2. --    ------     --    ------
  3. 2     Bart       null  null
  4. 4     Maggie     null  null
  5. null  null       3     Spidercerdo
  6. null  null       4     Moe


En este caso, obtendremos los registros únicos de la Tabla A y de la Tabla B. Para lograrlo, ejecutamos el mismo full outer join, y luego excluimos los resultados indeseados de ambos lados con where.

Ten en cuenta que, aunque no están aquí incluidos por parecerme redundante, podemos cambiar LEFT por RIGHT si queremos darle la vuelta al gráfico, operando así con la tabla derecha como principal, en vez de la izquierda

Fuente: funcion13
Autor: Antonio Laguna

Saludos
« Última modificación: Noviembre 12, 2014, 12:29:49 pm por Expermicid »

Desconectado facufangio

  • *
  • Underc0der
  • Mensajes: 201
  • Actividad:
    0%
  • Reputación 3
  • < SE SIEMPRE EL MEJOR, PERO NO TE LO CREAS />
    • Ver Perfil
« Respuesta #1 en: Noviembre 12, 2014, 10:05:14 pm »
Muy buen material!!!!!


La verdad es que esta muy bien explicado utilizando los diagramas de Venn.

Utilizare este método para cuando me toque explicar estos temas en DB!!


Saludos

Desconectado Y3K

  • *
  • Underc0der
  • Mensajes: 173
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #2 en: Noviembre 12, 2014, 10:28:17 pm »
Excelente aporte, muy explicativo.

Gracias.

Desconectado Eckonet

  • *
  • Underc0der
  • Mensajes: 11
  • Actividad:
    0%
  • Reputación 0
  • Hello Eck0!
    • Ver Perfil
« Respuesta #3 en: Agosto 14, 2015, 08:02:30 pm »
Muy buen tutorial, estoy empezando con sql y fue muy bueno leer este explicativo!

Desconectado macodlim

  • *
  • Underc0der
  • Mensajes: 10
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
    • Email
« Respuesta #4 en: Marzo 31, 2016, 03:21:47 am »
Corto pero conciso, la verdad que es un gran aporte, y ayuda muchisimo. Muchas gracias a mi por lo menos me ha ayudado

 

¿Te gustó el post? COMPARTILO!



Visual Studio Lightswitch y MySQL

Iniciado por FrostBite

Respuestas: 0
Vistas: 2888
Último mensaje Noviembre 08, 2011, 12:55:25 pm
por FrostBite