Consultor tecnológico de desarrollo de proyectos informáticos.
Desarrollador de proyectos informáticos, Microsoft Certified IT Professional - Enterprise Administrator
Fecha de publicación del tutorial: 2010-09-03
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:
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.
ConvencionesEste 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:
|
|||||||||||||||||||||||||||||||||||||
INNER JOINSELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
El resultado son solo el conjunto de registros que coinciden en ambas tablas. |
![]() |
||||||||||||||||||||||||||||||||||||
FULL OUTER JOINSELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
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 WHERESELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null
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 |
![]() |
||||||||||||||||||||||||||||||||||||
LEFT OUTER JOINSELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
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 WHERESELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS 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 |
![]() |
||||||||||||||||||||||||||||||||||||
CROSS JOINExiste también la posibilidad de cruzar todos los registros con todos (producto cartesiano), imposible de dibujar con un diagramas VennSELECT * 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. |
![]() ¡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:
Fecha publicación: 2011-01-13-16:04:55
Autor: franferri
Fecha publicación: 2010-09-05-02:57:21
Autor: jcarmonaloeches
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
Me aplico el cuento y muchas gracias porque además trata un concepto técnico muy interesante.
Saludos,
Esta obra está licenciada bajo licencia Creative Commons de
Reconocimiento-No comercial-Sin obras derivadas 2.5

















