Opération JOINTURE (équi-jointure)

En SQL, il est possible d'enchaîner plusieurs jointures dans la même instruction SELECT.

SELECT * FROM table1, table2, table3 , ... 
WHERE
table1.attribut1=table2.attribut1 AND table2.attribut2=table3.attribut2 AND ...;

Exemple :

SELECT * FROM Produit, Détail_Commande
WHERE Produit.CodePrd=Détail_Commande.CodePrd ;

ou en utilisant des alias pour les noms des tables :

SELECT * FROM Produit A, Détail_Commande B
WHERE A.CodePrd=B.CodePrd ;

SELECT *
FROM table1 INNER JOIN table2 ON table1.attribut1=table2.attribut1 INNER JOIN table3 ON table2.attribut2=table3.attribut3... ;

Le mot clé INNER est facultatif sur la plupart des SGBDR (sauf MS Access).

Cette notation rend plus lisible la requête en distinguant clairement les conditions de jointures, derrière  ON, et les éventuelles conditions de sélection ou restriction, derrière WHERE.
De plus, l'oubli d'un ON (et donc de la condition de jointure) empêchera l'exécution de la requête, alors qu'avec l'ancienne notation, l'oubli d'une condition de jointure derrière WHERE, n'empêche pas l'exécution de la requête, produisant alors un bien coûteux produit cartésien entre les tables !

Le même exemple que précédemment en utilisant aussi les alias :

SELECT *
FROM Produit A INNER JOIN Détail_Commande B ON A.CodePrd=B.CodePrd ;

La norme SQL2 définit aussi l' équi-jointure naturelle, joignant les 2 tables sur l'ensemble des attributs qu'elles ont en commun, mais en ne gardant qu'une seule colonne pour chaque attribut joint, contrairement aux 2 expressions précédentes :

SELECT *
FROM table1 NATURAL JOIN table2  ;

Il est aussi possible de restreindre (ou préciser) le ou les attributs de jointure avec USING  :

SELECT *
FROM table1 INNER JOIN table2 USING (attribut1) ;

NATURAL JOIN et USING ne sont pas supportés par tous les SGBDR.

On retiendra notamment les jointures externes Gauche (LEFT OUTER JOIN) et Droite ( RIGHT OUTER JOIN ).

Dans le cas d'une jointure externe gauche A->B, toute les lignes de la table A sont incluses même s'il ne leur correspond pas de ligne dans la table B.

Sur l'exemple précédent :

SELECT *
FROM Produit A LEFT OUTER JOIN Détail_Commande B ON A.CodePrd=B.CodePrd ;

Le résultat renvoyé est le suivant :

A.CodePrd Libellé Prix unitaire N°cde B.CodePrd quantité
590A HD 1,6 Go 1615 97001 590A 2
588J Scanner HP 1700 NULL NULL NULL
515J LBP 660 1820 97002 515J 1
515J LBP 660 1820 97003 515J 3

Tous les produits apparaissent même si certains n'ont pas fait l'objet de commande (exemple : 588J). Les colonnes manquantes sont alors complétées par des valeurs NULL.