2010-04-24 8 views
8

Siempre pensé en unir en SQL como un tipo de enlace entre dos tablas.En SQL, ¿una unión es en realidad una intersección? ¿Y también es un enlace o una "Unión Sideway"?

Por ejemplo,

select e.name, d.name from employees e, departments d 
    where employees.deptID = departments.deptID 

En este caso, es la vinculación de dos tablas, para mostrar a cada empleado con un nombre de departamento en lugar de un ID de departamento. Y como una especie de "enlace" o "Unión" sideway".

Pero, después de enterarse de combinación interna vs combinación externa, muestra que una unión (combinación interna) es en realidad una intersección.

Por ejemplo , cuando una tabla tiene el ID de 1, 2, 7, 8, mientras que otra tabla tiene el ID 7 y sólo 8, la forma de obtener la intersección es:

select * from t1, t2 where t1.ID = t2.ID 

para obtener los dos registros de "7 y 8" . Por lo tanto, es en realidad una intersección.

así que tenemos la 'intersección' de 2 mesas. Comparar º es con la operación "Unión" en 2 tablas. ¿Se puede pensar en una unión como una "intersección"? Pero, ¿qué pasa con el aspecto de "vinculación" o "unión lateral"?

Respuesta

9

Aquí es una visual explanation of SQL joins de Jeff que puede responder a algunas de sus preguntas.

+2

Esta es una imagen ampliamente engañosa ... Esto es más exacto http://imgur.com/2mlaF1M – Arnon

2

una unión 'links' o erm ... se une a las filas de dos tablas. Creo que eso es lo que quiere decir con 'unión lateral', aunque personalmente creo que es una manera terrible de expresarlo. Pero existen diferentes tipos de combinaciones que hacen cosas ligeramente diferentes:

  • Una unión interna es de hecho una intersección.
  • Una unión externa completa es una unión.

Este page en el blog de Jeff Atwood describe otras posibilidades.

+0

decir, si ambas tablas tienen todos los deptIDs coincidentes, por lo que las dos tablas se fusionaron una al lado de la otra, en ese sentido es como una "unión lateral" –

+1

@Jian Lin: si le resulta más fácil pensar que es una "unión lateral", está bien, pero la unión tiene un significado bien definido en SQL y no es eso. Evitaría usar ese término cuando hable con otras personas. –

5

Estás en el camino correcto; las filas devueltas por INNER JOIN son aquellas que satisfacen las condiciones de unión. Pero esto es como una intersección sólo porque estás usando la igualdad en su condición de unión, aplicada a las columnas de cada tabla.

También tenga en cuenta que INTERSECTION ya es una operación de SQL y tiene otro significado, y no es lo mismo que JOIN.

Un SQL JOIN puede producir un nuevo tipo de fila, que tiene todas las columnas de ambas tablas se unieron. Por ejemplo: col4, COL5 y col6 no existen en la tabla A, pero existen en el resultado de una unión con la tabla B:

SELECT a.col1, a.col2, a.col3, b.col4, b.col5, b.col6 
FROM A INNER JOIN B ON a.col2=b.col5; 

Un SQL INTERSECTION devuelve filas que son comunes a dos mesas separadas , que ya debe tener las mismas columnas.

SELECT col1, col2, col3 FROM A 
INTERSECT 
SELECT col1, col2, col3 FROM B; 

Esto sucede para producir el mismo resultado que se unen a la siguiente:

SELECT a.col1, a.col2, a.col3 
FROM A INNER JOIN B ON a.col1=b.col1 AND a.col2=b.col2 AND a.col3=b.col3; 

No todas las marcas de la base de datos admite el operador INTERSECTION.

0

Un exterior Únase - no está relacionado con - Union o Union All.

Por ejemplo, un 'nulo' no ocurriría como resultado de la operación Union o Union All, pero es el resultado de una unión externa.

0

INNER JOIN considera dos NULL s como dos valores diferentes. Por lo tanto, si se une basándose en una columna que admite valores NULL, y si ambas tablas tienen valores NULL en esa columna, entonces INNER JOIN ignorará esas filas.

Por lo tanto, para recuperar correctamente todas las filas comunes entre dos tablas, se debe utilizar INTERSECT. INTERSECT trata dos NULL s con el mismo valor.

Ejemplo (SQLite):

Crear dos tablas con columnas anulables:

CREATE TABLE Table1 (id INT, firstName TEXT); 
CREATE TABLE Table2 (id INT, firstName TEXT); 

Insertar NULL valores:

INSERT INTO Table1 VALUES (1, NULL); 
INSERT INTO Table2 VALUES (1, NULL); 

recuperar filas comunes usando INNER JOIN (Esto no muestra salida):

SELECT * FROM Table1 INNER JOIN Table2 ON 
    Table1.id=Table2.id AND Table1.firstName=Table2.firstName; 

recuperar filas comunes usando INTERSECT (Esto muestra correctamente la fila común):

SELECT * FROM Table1 INTERSECT SELECT * FROM Table2; 

Conclusión:

A pesar de que, muchas veces tanto INTERSECT y INNER JOIN se pueden utilizar para obtener el same results , no son lo mismo y deben elegirse según la situación.

Cuestiones relacionadas