Il y au moins deux type de jointures : laxiste (left) et stricte (right). Le type de jointure par défaut dépend souvent de l'implémentation, il est donc recommandé de préciser ce que tu veux.
Dans les exemples, j'utilise volontairement une notation indépendante de SQL, un peu plus mathématique. C'est pour épurer la démonstration des détails d'implémentation des bases SQL.
(a 0 1) signifie « ensemble 'a', ligne '0' colonne '1' ». C'est l'identifiant (les coordonnées) d'une donnée, ce n'est pas la donnée en elle-même.
Une jointure, c'est multiplier deux ensembles (produit cartésien):
Ensemble a:
(a 0 0) (a 0 1) (a 0 2)
(a 1 0) (a 1 1) (a 1 2)
(a 2 0) (a 2 1) (a 2 2)
Ensemble b:
(b 0 0) (b 0 1) (b 0 2)
(b 1 0) (b 1 1) (b 1 2)
Ensemble a×b
(a 0 0) (a 0 1) (a 0 2) (b 0 0) (b 0 1) (b 0 2)
(a 0 0) (a 0 1) (a 0 2) (b 1 0) (b 1 1) (b 1 2)
(a 1 0) (a 1 1) (a 1 2) (b 0 0) (b 0 1) (b 0 2)
(a 1 0) (a 1 1) (a 1 2) (b 1 0) (b 1 1) (b 1 2)
(a 2 0) (a 2 1) (a 2 2) (b 0 0) (b 0 1) (b 0 2)
(a 2 0) (a 2 1) (a 2 2) (b 1 0) (b 1 1) (b 1 2)
Comme tu peux le constater, tu dupliques chaque tuple (une ligne dans un ensemble de données) du premier ensemble autant de fois qu'il y a de tuples dans l'ensemble à joindre, et tu associe à chaque copie un tuple du second ensemble.
En SQL, ce serait l'équivalent de :
Les jointures, c'est un produit cartésien avec une condition de jonction.
Par exemple, tu peux dire que la colonne a.0 doit être égale à a.1 pour que les tuples puissent être associés. C'est là que tu auras une différence entre la jointure laxiste et la jointure stricte : dans le premier cas, si le critère n'est pas respecté, le tuple de l'ensemble associé sera nullifié ; dans le second cas, la ligne d'association sera retirée de l'ensemble résultant de la jointure.
Dans l'exemple, on considère que (a 0 0) égal (b 0 0).
Ensemble a×b si (a 0) égal (b 0) sinon null
(a 0 0) (a 0 1) (a 0 2) (b 0 0) (b 0 1) (b 0 2)
(a 1 0) (a 1 1) (a 1 2) ( null) ( null) ( null)
(a 2 0) (a 2 1) (a 2 2) ( null) ( null) ( null)
Ce qui équivaut à :
select * from a left join b on a.0 = b.0;
Ensemble a×b si (a 0) égal (b 0)
(a 0 0) (a 0 1) (a 0 2) (b 0 0) (b 0 1) (b 0 2)
Ce qui équivaut à :
select * from a right join b on a.0 = b.0;
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.