SQL Join - explicacion para novatos
Pensé que el post de Ligaya Turmelle sobre SQL joins era una genial introducción para los desarrolladores primerizos. Dado que los SQL joins están basados fundamentalmente en conjuntos relacionados, el uso de diagramas de Venn para explicarlo parece lo más 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.
Aún 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 sólo produce los registros que coinciden en las dos tablas A y B.
SELECT * FROM TablaA INNER JOIN TablaB ON TablaA.nombre = TablaB.nombre

Resultado de Inner Join Join Inner
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.
SELECT * FROM TablaA FULL OUTER JOIN TablaB ON TablaA.nombre = TablaB.nombre

Resultado de Full Outer Join Join Cartesian
Left outer join produce el conjunto completo de registros de la tabla A, con los registros coincidentes (si están disponibles) en la tabla B. Si no hay coincidencia, el lado derecho contendrá null.
SELECT * FROM TablaA LEFT OUTER JOIN TablaB ON TablaA.nombre = TablaB.nombre
Resultado de Left Outer Join Join Left
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 cláusula Where.
1.
SELECT * FROM TablaA
2.
LEFT OUTER JOIN TablaB
3.
ON TablaA.nombre = TablaB.nombre
4.
WHERE TablaB.id IS NULL
Resultado de Left Outer Join con exclusión Join Left Outer
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 cláusula Where.
1.
SELECT * FROM TablaA
2.
FULL OUTER JOIN TablaB
3.
ON TablaA.nombre = TablaB.nombre
4.
WHERE TablaA.id IS NULL
5.
OR TablaB.id IS NULL
Resultado de Full Outer Join con exclusión Join Outer
También hay un cross join, el cuál 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 más de las que teníamos en los conjuntos originales. Si haces unos simples cálculos, puedes ver por qué es un Join muy peligroso de ejecutar en tablas grandes.
Fuente: http://boozox.net/mysql/explicacion-visual-de-los-sql-join-unir-tablas-con-sql/
Aún 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 sólo produce los registros que coinciden en las dos tablas A y B.
SELECT * FROM TablaA INNER JOIN TablaB ON TablaA.nombre = TablaB.nombre

Resultado de Inner Join Join Inner
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.
SELECT * FROM TablaA FULL OUTER JOIN TablaB ON TablaA.nombre = TablaB.nombre

Resultado de Full Outer Join Join Cartesian
Left outer join produce el conjunto completo de registros de la tabla A, con los registros coincidentes (si están disponibles) en la tabla B. Si no hay coincidencia, el lado derecho contendrá null.
SELECT * FROM TablaA LEFT OUTER JOIN TablaB ON TablaA.nombre = TablaB.nombre
Resultado de Left Outer Join Join Left
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 cláusula Where.
1.
SELECT * FROM TablaA
2.
LEFT OUTER JOIN TablaB
3.
ON TablaA.nombre = TablaB.nombre
4.
WHERE TablaB.id IS NULL
Resultado de Left Outer Join con exclusión Join Left Outer
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 cláusula Where.
1.
SELECT * FROM TablaA
2.
FULL OUTER JOIN TablaB
3.
ON TablaA.nombre = TablaB.nombre
4.
WHERE TablaA.id IS NULL
5.
OR TablaB.id IS NULL
Resultado de Full Outer Join con exclusión Join Outer
También hay un cross join, el cuál 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 más de las que teníamos en los conjuntos originales. Si haces unos simples cálculos, puedes ver por qué es un Join muy peligroso de ejecutar en tablas grandes.
Fuente: http://boozox.net/mysql/explicacion-visual-de-los-sql-join-unir-tablas-con-sql/
Comentarios
Publicar un comentario