Hacemos una revisión completa cada una de las noticias en nuestro sitio web con la meta de mostrarte siempre la información veraz y certera.
Solución:
Estoy de acuerdo con Cade sobre las limitaciones de los diagramas de Venn aquí. Una representación visual más apropiada podría ser esta.
Mesas
SELECCIONE A.Color, B.Color DE UNA CRUZ ÚNASE A B SQL Fiddle
La combinación cruzada (o producto cartesiano) produce un resultado con cada combinación de las filas de las dos tablas. Cada tabla tiene 4 filas, por lo que esto produce 16 filas en el resultado.
SELECCIONE A.Color, B.Color DESDE UN INTERIOR ÚNASE B EN A.Color = B.Color SQL Fiddle
La combinación interna devuelve lógicamente todas las filas de la combinación cruzada que coinciden con la condición de combinación. En este caso cinco lo hacen.
SELECCIONE A.Color, B.Color DESDE UN INTERIOR ÚNASE B EN A.Color NO EN (‘Verde’, ‘Azul’) SQL Fiddle
La condición de unión interna no tiene por qué ser necesariamente una condición de igualdad y no necesita hacer referencia a columnas de ambas (o incluso de ninguna) de las tablas. evaluando A.Colour NOT IN ('Green','Blue')
en cada fila de los retornos de unión cruzada.
Una condición de unión interna de 1=1
evaluaría a true para cada fila en la combinación cruzada para que los dos sean equivalentes (SQL Fiddle).
SELECCIONE A.Color, B.Color DESDE UN EXTERIOR IZQUIERDO ÚNASE B EN A.Color = B.Color SQL Fiddle
Las combinaciones externas se evalúan lógicamente de la misma manera que las combinaciones internas, excepto que si una fila de la tabla de la izquierda (para una combinación de la izquierda) no se une con ninguna fila de la tabla de la derecha, se conserva en el resultado con NULL
valores para las columnas de la derecha.
SELECCIONE A.Color, B.Color DESDE UN EXTERIOR IZQUIERDO ÚNASE B EN A.Color = B.Color DONDE B.Color ES NULO SQL Fiddle
Esto simplemente restringe el resultado anterior para devolver solo las filas donde B.Colour IS NULL
. En este caso particular, estas serán las filas que se conservaron porque no coincidían en la tabla de la derecha y la consulta devuelve la única fila roja que no coincide en la tabla. B
. Esto se conoce como unión anti semi.
Es importante seleccionar una columna para el IS NULL
prueba que no es anulable o para la cual la condición de unión garantiza que cualquier NULL
los valores se excluirán para que este patrón funcione correctamente y evitar simplemente traer de vuelta las filas que tienen un NULL
valor para esa columna además de las filas no coincidentes.
SELECCIONE A.Color, B.Color DESDE UN EXTERIOR DERECHO ÚNASE B EN A.Color = B.Color SQL Fiddle
Las uniones externas derechas actúan de manera similar a las uniones externas izquierdas, excepto que conservan las filas que no coinciden de la tabla derecha y null extender las columnas de la izquierda.
SELECCIONE A.Color, B.Color DE UN EXTERIOR COMPLETO ÚNASE B EN A.Color = B.Color SQL Fiddle
Las combinaciones externas completas combinan el comportamiento de las combinaciones izquierda y derecha y conservan las filas que no coinciden de las tablas izquierda y derecha.
Creo que su principal confusión subyacente es que cuando (por ejemplo) solo A
está resaltado en rojo, lo interpretará como “la consulta solo devuelve datos desde A
“, pero en realidad significa “la consulta solo devuelve datos para aquellos casos en que A
tiene un registro“. La consulta aún puede contener datos de B. (Para los casos en los que B
lo hace no tiene un registro, la consulta sustituirá NULL
.)
De manera similar, la imagen a continuación solo incluye datos del círculo B, entonces, ¿por qué se incluye A en la declaración de unión?
Si te refieres a la imagen donde A
es completamente en blanco, y hay una forma de media luna roja para la parte de B
que no se superpone con A
entonces: la razón por la que A
aparece en la consulta es, A
es como encuentra los registros en B
que es necesario excluir. (Si A
no apareció en la consulta, entonces el diagrama de Venn no habría A
solo mostraría B
y no habría forma de distinguir los registros deseados de los no deseados).
La imagen hace que parezca que el círculo B es el foco principal de la instrucción sql, pero la instrucción sql en sí misma, al comenzar con A (seleccione de A, únase a B), me transmite la impresión opuesta, a saber, que A sería el foco de la sentencia sql.
Muy bien. Por esta razón, RIGHT JOIN
s son relativamente poco comunes; aunque una consulta que utiliza un LEFT JOIN
casi siempre se puede volver a pedir para usar un RIGHT JOIN
en cambio (y viceversa), por lo general la gente escribirá sus consultas con LEFT JOIN
y no con RIGHT JOIN
.
Los diagramas de Venn son adecuados para representar operaciones de conjuntos como UNION, INTERSECTS, EXCEPT, etc.
En la medida en que esas operaciones establecidas como EXCEPT se simulen con cosas como LEFT JOIN WHERE rhs.KEY es NULL, este diagrama es preciso.
De lo contrario, es engañoso. Por ejemplo, cualquier combinación puede hacer que las filas se multipliquen si los criterios de combinación no son 1:1. Pero los conjuntos solo pueden contener miembros distintos, por lo que no se pueden representar como operaciones de conjuntos.
Luego está CROSS JOIN o INNER JOIN ON 1 = 1; esto no es análogo a INNER JOIN como se muestra en este diagrama, ni el conjunto que se produce puede ser realmente descrito por un diagrama de Venn. Sin mencionar todas las otras uniones triangulares posibles, auto y anti-uniones como:
lhs INNER JOIN rhs ON rhs.VALUE < lhs.VALUE (triangular)
o
SELF self1
INNER JOIN SELF self2
ON self2.key <> self1.key
AND self1.type = self2.type
(self cross y anti-join para encontrar todos los miembros de la familia similares excepto usted mismo - self1 y self2 son el mismo conjunto y el resultado es un subconjunto adecuado)
Apegarse a las uniones en keys puede estar bien para los primeros minutos de un tutorial, pero esto puede conducir a un mal camino para aprender de qué se tratan las uniones. Creo que esto es lo que has encontrado.
Esta idea de que los diagramas de Venn pueden representar JOIN generalmente de esta manera debe desaparecer.