Francisco Ferri Pérez

Consultor tecnológico de desarrollo de proyectos informáticos.

Desarrollador de proyectos informáticos, Microsoft Certified IT Professional - Enterprise Administrator

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2010-09-03

Tutorial visitado 32.417 veces Descargar en PDF

SQL Joins explicados de forma gráfica con diagramas Venn

SQL92 Joins, INNER JOIN, FULL OUTER JOIN, LEFT OUTER JOIN como nunca los habías visto.

 

Objetivo del documento:
Presentar de forma fácil y clara el ámbito de registros dada una entidad que cubren cada una de las sentencias JOIN del SQL92.

Autor: Francisco Ferri Pérez
Fecha de publicación 02/09/2010

Lecturas recomendadas:

http://www.w3schools.com/sql




Una simple ayuda

El lenguaje SQL es aveces el gran olvidado por los desarrolladores, cada vez abundan mas los frameworks que abstraen al desarrollador del contacto con el modelo de negocio.

He escrito este documento, basándome en otros similares para ayudar a entender con un diagrama de Vann, los diferentes tipos de Join's que SQL92 soporta.

Existen tecnologías que abstraen completamente del modelo de negocio, para el desarrollador funcionan creando una serie de clases de Dominio que define el modelo, sin importar qué base de datos o de qué fabricante sea esta. Por ejemplo Ruby on Rails, GRails, ... usando un conjunto de tecnologías, como Hibernate configuradas por convención dentro del propio framework.

También es muy extendido el uso de aplicaciones que permiten modelar el negocio de forma gráfica, ERM (como DBSchema), y normalmente después se usa un ORM's que les hacen el trabajo sucio de forma elegante y segura.

Todo vale, pero la realidad de las empresas TIC es que necesitan profesionales serios y conscientes que entiendan y controlen todas las capas para que un sistema funciona como se espera y está diseñado, y no se deje nada al azar.

El desarrollador, muy frecuentemente recurre a activar trazas o aplicaciones de monitorización de actividad que nos desvelen, qué está haciendo nuestro framework con nuestro modelo de negocio. Existen aplicaciones que esnifan directamente de la base de datos esta información para que podamos analizarla, el obsoleto Profile y Analyzer que incluía Microsoft SQL Server es un ejemplo de ellos.

Finalmente cuando tenemos delante la query sucede que hace tanto tiempo que no trabajamos con SQL que no entendemos qué hace exactamente, sobre todo si está trabajando con tablas relacionadas y nos encontramos con una consulta que afecta a varias entidades.

Espero que este documento ayude a reducir el tiempo invertido a descubrir porqué se comporta una SQL de un modo u otro.




Convenciones

Este documento asume que siempre que la "TABLA A" esta a la izquierda y la "TABLA B" a la derecha de las sentencias.

Para los ejemplos vamos a utilizar 2 tablas que van a contener los siguientes datos:

id name | id name
1 Roberto | 1 Alex
2 Juan | 2 Carlos
3 Rubén | 3 Juan
4 Carlos | 4 Saúl



INNER JOIN

SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name

id name | id name
2 Juan | 2 Carlos
4 Carlos | 3 Juan

El resultado son solo el conjunto de registros que coinciden en ambas tablas.


Inner Join

FULL OUTER JOIN

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name

id name | id name
1 Roberto | null null
2 Juan | 3 Juan
3 Rubén | null null
4 Carlos | 2 Carlos
null null | 1 Alex
null null | 4 Saúl

El resultado es el conjunto total de registros de ambas tablas, coincidiendo aquellos registros cuando sea posible. Si no hay conicidencias, se asignan nulos.


Full Outer Join

FULL OUTER JOIN WHERE

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null

id name | id name
1 Roberto | null null
3 Rubén | null null
null null | 1 Alex
null null | 4 Saúl

El resultado es un conjunto de records únicos en la TablaA y en la TablaB, hacemos el Full Outer Join y excluimos los registros que no queremos con el Where


Full Outer Join con Where

LEFT OUTER JOIN

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name

id name | id name
1 Roberto | null null
2 Juan | 3 Juan
3 Rubén | null null
4 Carlos | 2 Carlos

El resultado son todos los registros de la TablaA, y si es posible las coincidencias de la TablaB. Si no hay coincidencias, el lado derecho mostrará nulos.


Left Outer Join

LEFT OUTER JOIN WHERE

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null

id name | id name
1 Roberto | null null
3 Rubén | null null

El resultado es un conjunto de registros que solo están en la TablaA, no en la TablaB. Hacemos lo mismo que en un Left Outer Join, pero eliminamos los registros que no queremos de la TablaB con el Where


Left Outer Join con Where

CROSS JOIN

Existe también la posibilidad de cruzar todos los registros con todos (producto cartesiano), imposible de dibujar con un diagramas Venn

SELECT * FROM TableA CROSS JOIN TableB

Imaginarse el resultado de todos los registros por todos es muy fácil, si tenemos 4 registros en cada tabla 4 x 4 = 16.
Cross Join
¡Ojo al hacer esto en tablas con muchos registros!




Nota del autor

Este documento está escrito con el único fin de informar de forma abierta y gratuita al lector respecto del tema que trata, no está exento de contener imprecisiones o información incorrecta.

Si usted quiere añadir cualquier información al documento porfavor sientase libre de ponerse en contacto con el autor directamente en su correo electrónico franferri@gmail.com. Así todos conseguimos tener la mejor información posible.

Si desea comentar el documento dispone de los comentarios habilitados a continuación del mismo. Estamos encantados de saber que opina o si le ha sido de utilidad.

Muchas gracias por su tiempo, espero que esta lectura le haya sido como mínimo de tanto provecho como para mí fue escribir el documento.

A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |
Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Fecha publicación: 2013-11-19-20:02:34

Autor: TheRanger

Hola! que tal.
Antes que todo, agradecerte el tiempo que inviertes para hacer estos tutoriales. Y bueno para comentarte que según yo, en el resultado que muestras en el primer ejemplo (inner join), aparece de manera errónea la intersección
id name | id name
2 Juan | 2 Carlos
4 Carlos | 3 Juan

debiera ser:

id name | id name
2 Juan | 3 Juan
4 Carlos | 2 Carlos.

Saludos cordiales

Fecha publicación: 2011-01-13-16:04:55

Autor: franferri

A veces lo mas simple es verlo.

Fecha publicación: 2010-09-05-02:57:21

Autor: jcarmonaloeches

Está muy bien explicado, lo que nos da un dibujito en información equivale a 1000 palabras... si es que la mente busca cosas simples y entiende cosas simples.

Me aplico el cuento y muchas gracias porque además trata un concepto técnico muy interesante.

Saludos,

Fecha publicación: 2010-09-05-02:56:58

Autor: jcarmonaloeches

Está muy bien explicado, lo que nos da un dibujito en información equivale a 1000 palabras... si es que la mente busca cosas simples y entiende cosas simples.

Me aplico el cuento y muchas gracias porque además trata un concepto técnico muy interesante.

Saludos,