2010-04-24 11 views
8

J'ai toujours pensé à une jointure en SQL comme une sorte de lien entre deux tables.En SQL, une jointure est-elle réellement une intersection? Et c'est aussi un lien ou une "Sideway Union"?

Par exemple,

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

Dans ce cas, il relie deux tables, pour montrer à chaque employé un nom de service au lieu d'un numéro de service. Et un peu comme un « lien » ou « Union » sideway ».

Mais, après avoir appris jointure interne vs jointure externe, il montre qu'une inscription (jointure interne) est en fait une intersection.

Par exemple , quand une table a l'ID 1, 2, 7, 8, tandis qu'une autre table a l'ID 7 et 8 seulement, la façon dont nous obtenons l'intersection est la suivante:

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

pour obtenir les deux dossiers de « 7 et 8 "Donc, il est en fait une intersection

Nous avons donc le" Intersection "de 2 tables. est avec l'opération "Union" sur 2 tables. Est-ce qu'une jointure peut être considérée comme une «intersection»? Mais qu'en est-il de l'aspect «lien» ou «union latérale» de celui-ci?

Répondre

9

Voici un visual explanation of SQL joins de Jeff qui pourra répondre à toutes vos questions.

+2

Ceci est une image largement trompeuse ... Ceci est plus précis http://imgur.com/2mlaF1M – Arnon

2

Une jointure 'liens' ou erm ... joint les lignes de deux tables. Je pense que c'est ce que vous entendez par «union latérale» bien que je pense personnellement que c'est une façon terrible de l'exprimer. Mais il existe différents types de jointures qui font des choses légèrement différentes:

  • Une jointure interne est en effet une intersection.
  • Une jointure externe complète est une union.

Ce page sur le blog de Jeff Atwood décrit d'autres possibilités.

+0

dire, si les deux tables ont tous les appariements correspondants, de sorte que les deux tables fusionnées côte à côte, dans ce sens, il est comme une «union de côté» –

+1

@Jian Lin: Si cela vous facilite la tâche de penser à une «union de côté», alors bien, mais l'union a une signification bien définie dans SQL et ce n'est pas ça. J'éviterais d'utiliser ce terme lorsque je parlerai à d'autres personnes. –

5

Vous êtes sur la bonne voie; les lignes renvoyées par un INNER JOIN sont celles qui satisfont les conditions de jointure. Mais cela ressemble à une intersection uniquement parce que vous utilisez l'égalité dans votre condition de jointure, appliquée aux colonnes de chaque table.

Sachez également que INTERSECTION est déjà une opération SQL et qu'elle a une autre signification - et ce n'est pas la même chose que JOIN.

Un SQL JOIN peut produire un nouveau type de ligne, qui contient toutes les colonnes des deux tables jointes. Par exemple: col4, Col5 et col6 n'existent pas dans le tableau A, mais ils existent dans le résultat d'une jointure avec table 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 retourne des lignes qui sont communes à deux tables séparées , qui doit déjà avoir les mêmes colonnes.

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

Cela arrive à produire le même résultat que la jointure suivante:

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; 

Non toutes les marques de base de données prend en charge l'opérateur INTERSECTION.

0

Une jointure externe - n'est pas liée à - Union ou Union Tous. Par exemple, un 'null' ne se produirait pas à la suite d'une opération Union ou Union All, mais il résulte d'une jointure externe.

0

INNER JOIN traite deux NULL s comme deux valeurs différentes. Donc, si vous vous joignez en fonction d'une colonne nullable, et si les deux tables ont des valeurs NULL dans cette colonne, alors INNER JOIN ignorera ces lignes.

Par conséquent, pour récupérer correctement toutes les lignes communes entre deux tables, INTERSECT doit être utilisé. INTERSECT traite deux NULL s comme ayant la même valeur.

Exemple (SQLite):

Créer deux tables avec des colonnes nullable:

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

Insérer NULL valeurs:

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

Récupérer des lignes communes utilisant INNER JOIN (Cela montre pas de sortie):

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

Extrayez des lignes communes utilisant INTERSECT (Cette correctement montre la ligne commune):

SELECT * FROM Table1 INTERSECT SELECT * FROM Table2; 

Conclusion:

Même si, à plusieurs reprises à la fois INTERSECT et INNER JOIN peuvent être utilisés pour obtenir le same results , ils ne sont pas les mêmes et devraient être choisis en fonction de la situation.