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:
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 joinSELECT * FROM TablaA
INNER JOIN TablaB
ON TablaA.nombre = TablaB.nombre
id nombre id nombre
-- ------ -- ------
1 Homer 2 Homer
3 Marge 1 Marge
(http://i.imgur.com/Ixzr5du.png)
Un inner join produce únicamente el conjunto de registros que están tanto en la Tabla A como en la Tabla B.
Full outer joinSELECT * FROM TablaA
FULL OUTER JOIN TablaB
ON TablaA.nombre = TablaB.nombre
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
(http://i.imgur.com/bhJj03S.png)
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 joinSELECT * FROM TablaA
LEFT OUTER JOIN TablaB
ON TablaA.nombre = TablaB.nombre
id nombre id nombre
-- ------ -- ------
1 Homer 2 Homer
2 Bart null null
3 Marge 1 Marge
4 Maggie null null
(http://i.imgur.com/c1ObEmL.png)
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.
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TablaB.id IS null
id nombre id nombre
-- ------ -- ------
2 Bart null null
4 Maggie null null
(http://i.imgur.com/byaOvbL.png)
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.
SELECT * FROM TablaA
FULL OUTER JOIN TablaB
ON TableA.nombre = TablaB.nombre
WHERE TablaA.id IS null
OR TablaB.id IS null
id nombre id nombre
-- ------ -- ------
2 Bart null null
4 Maggie null null
null null 3 Spidercerdo
null null 4 Moe
(http://i.imgur.com/0xGyyhu.png)
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
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