Está en la página 1de 3

Explicacin visual de los SQL Join Unir tablas con SQL

Jeff Atwood, 11/10/07 (traducido por Alex Barros)

Pens que el post de Ligaya Turmelle sobre SQL joins era una genial introduccin para los desarrolladores primerizos. Dado que los SQL joins estn basados fundamentalmente en conjuntos relacionados, el uso de diagramas de Venn para explicarlo parece lo ms acertado. De todas formas, igual que los comentaristas de su post, opino que sus diagramas de Venn no encajaban con la sintaxis de SQL join en mis pruebas. An as me encanta el concepto, as que veamos si podemos hacerlo funcionar. Supongamos que tenemos las dos siguientes tablas. La tabla A est a la izquierda, y la tabla B est a la derecha. Las rellenaremos con cuatro registros cada una.

Ahora unamos estas dos tablas por el campo nombre de algunas formas distintas, y veamos si podemos obtener unas representaciones conceptuales con los ingeniosos diagramas de Venn.

Inner join
Slo produce los registros que coinciden en las dos tablas A y B. 1. SELECT * FROM TablaA 2. INNER JOIN TablaB 3. ON TablaA.nombre = TablaB.nombre

Full outer join


Produce el conjunto de todos los registros en las tablas A y B, con registros coincidentes en ambos lados cuando sea posible. Si no hay coincidencia, el lado que falta contendr null. 1. SELECT * FROM TablaA 2. FULL OUTER JOIN TablaB 3. ON TablaA.nombre = TablaB.nombre

Left outer join


Produce el conjunto completo de registros de la tabla A, con los registros coincidentes (si estn disponibles) en la tabla B. Si no hay coincidencia, el lado derecho contendr null. 1. SELECT * FROM TablaA 2. LEFT OUTER JOIN TablaB 3. ON TablaA.nombre = TablaB.nombre

Para producir el conjunto de registros en la tabla A, pero no en la tabla B, usamos el mismo Left Outer Join, y luego excluimos los registros que no queremos del lado derecho mediante una clusula Where. 1. 2. 3. 4. SELECT * FROM TablaA LEFT OUTER JOIN TablaB ON TablaA.nombre = TablaB.nombre WHERE TablaB.id IS NULL

Para producir el conjunto de registros nicos de la tabla A y la tabla B, usamos el mismo Full Outer Join, y luego excluimos los registros que no queremos de los dos lados mediante una clusula Where. 1. 2. 3. 4. 5. SELECT * FROM TablaA FULL OUTER JOIN TablaB ON TablaA.nombre = TablaB.nombre WHERE TablaA.id IS NULL OR TablaB.id IS NULL

Tambin hay un cross join, el cul no puede ser expresado con un diagrama de Venn: 1. SELECT * FROM TablaA 2. CROSS JOIN TablaB Esto une todo con todo, dando como resultado 4 x 4 = 16 filas, muchas ms de las que tenamos en los conjuntos originales. Si haces unos simples clculos, puedes ver por qu es un Join muy peligroso de ejecutar en tablas grandes.

También podría gustarte