¡Hola! Me parece que andas usando un bloqueador de anuncios =( ¿Nos desbloqueas? ¿Por qué?
F13

Funcion 13

Explicación visual de los JOINs de SQL

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 join

SELECT * FROM TablaA  
INNER JOIN TablaB  
ON TablaA.nombre = TablaB.nombre

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

SELECT * 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  

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

SELECT * 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  

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  

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  

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

Si el artículo te pareció interesante, útil o incluso equivocado, por favor considera el dejar un comentario. ¡Lo apreciaré mucho!

Programador Front-end en First + Third y Potato. Trabajando con JavaScript y HTML5 desde el corazón de Sevilla.

Comentarios ¡Únete a la conversación!