Explicación visual de los JOINs de SQL

Iniciado por Expermicid, Noviembre 12, 2014, 12:25:33 PM

Tema anterior - Siguiente tema

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

Noviembre 12, 2014, 12:25:33 PM Ultima modificación: Noviembre 12, 2014, 12:29:49 PM por Expermicid
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
id nombre     id  nombre
-- ------     --  ------
1  Homer      1   Marge
2  Bart       2   Homer
3  Marge      3   Spidercerdo
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
SELECT * FROM TablaA 
INNER JOIN TablaB
ON TablaA.nombre = TablaB.nombre


Código: text
id  nombre     id   nombre
--  ------     --   ------
1   Homer      2    Homer
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
SELECT * FROM TablaA
FULL OUTER JOIN TablaB
ON TablaA.nombre = TablaB.nombre


Código: text
id    nombre     id    nombre
--    ------     --    ------
1     Homer      2     Homer
2     Bart       null  null
3     Marge      1     Marge
4     Maggie     null  null
null  null       3     Spidercerdo       
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
SELECT * FROM TablaA
LEFT OUTER JOIN TablaB
ON TablaA.nombre = TablaB.nombre


Código: text
id  nombre     id    nombre
--  ------     --    ------
1   Homer      2     Homer
2   Bart       null  null
3   Marge      1     Marge
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
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TablaB.id IS null


Código: text
id  nombre     id     nombre
--  ------     --     ------
2   Bart       null   null
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
SELECT * FROM TablaA
FULL OUTER JOIN TablaB
ON TableA.nombre = TablaB.nombre
WHERE TablaA.id IS null
OR TablaB.id IS null


Código: text
id    nombre     id    nombre
--    ------     --    ------
2     Bart       null  null
4     Maggie     null  null
null  null       3     Spidercerdo
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

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

Excelente aporte, muy explicativo.

Gracias.

Muy buen tutorial, estoy empezando con sql y fue muy bueno leer este explicativo!

Corto pero conciso, la verdad que es un gran aporte, y ayuda muchisimo. Muchas gracias a mi por lo menos me ha ayudado