Les jointures

La jointure est une opération permettant de combiner des informations venant de plusieurs tables. Les exemples suivants se limiteront à deux tables, mais on peut joindre jusqu'à 256 tables. Une jointure se formule simplement en spécifiant plusieurs tables derrière le FROM de la façon suivante :

SELECT ...
FROM  nom_table1, nom_table2...
WHERE predicat;

Si on ne précise pas de condition de sélection, le résultat obtenu sera le produit cartésien des tables présentes derrière le FROM (résultat non souhaité en général). Il n'existe pas d'associations implicites ou explicites entre les tables dans SQL. Les associations entre les tables sont définies dynamiquement lors des interrogations, ce qui contribue à la grande souplesse du langage sql et rend possible toute association même si elle n'a pas été prévue lors de la définition et du chargement de la base.

Equi-jointure

Le rapprochement de chaque ligne de la table emp avec la ligne de la table dept ayant même numéro de département permet d'obtenir la liste des employés avec la localité dans laquelle ils travaillent. Ce rapprochement entre deux colonnes appartenant à deux tables différentes mais ayant le même sens (ici le numéro de département) et venant vraisemblablement d'une relation 1-n lors de la conception (ici 1 entité département pour n entités employés) est assez naturel. C'est pourquoi ce type de jointure porte le nom de jointure naturelle ou d'équi-jointure.

Exemple : Donner pour chaque employé son nom et son lieu de travail.

Le fait que la colonne contenant le numéro de département ait le même nom dans les deux tables a rendu nécessaire le préfixage par le nom de table dans le critère de jointure (clause WHERE). Le nom de colonne nom a lui aussi besoin d'être préfixé car il appartient aux deux tables (nom de la personne dans l'une et nom du département dans l'autre). Par contre le nom de colonne lieu n'a pas besoin d'être préfixé car il n'y a pas d'ambiguïté sur la table à laquelle cette colonne appartient.

Jointure d'une table à elle-même

Il peut être utile de rassembler des informations venant d'une ligne d'une table avec des informations venant d'une autre ligne de la même table.

Exemple : Donner pour chaque employé le nom de son supérieur hiérarchique.

Remarque : Dans ce cas, il faut impérativement renommer au moins l'une des deux occurences de la table (ici emp) en lui donnant un synonyme, afin de pouvoir préfixer sans ambiguité chaque nom de colonne.

Autres jointures

Le critère d'égalité est le critère de jointure le plus naturel. Mais on peut utiliser d'autres types de comparaisons comme critères de jointures.

Exemple : Quels sont les employés gagnant plus que SIMON?

Jointure externe

Lorsqu'une ligne d'une table figurant dans une jointure n'a pas de correspondant dans les autres tables, elle ne satisfait pas au critère d'équi-jointure et donc ne figure pas dans le résultat de la jointure.
Une option permet de faire figurer dans le résultat les lignes satisfaisant la condition d'équi-jointure plus celles n'ayant pas de correspondant. Cette option s'obtient en accolant (+) au nom de colonne de la table dans laquelle manquent des éléments, dans la condition d'équi-jointure.

Exemple : Le département 40 ne figurait pas dans le résultat du SELECT précédent. Par contre, il figurera dans le résultat du SELECT suivant.

Le (+) peut s'interpréter comme l'ajout d'une ligne fictive dont toutes les colonnes ont la valeur NULL, et qui réalise la correspondance avec les lignes de l'autre table qui n'ont pas de correspondant réel. Dans l'exemple ci-dessus, la valeur de nom associée au département 40 est la valeur NULL.

Exemple : Retrouver les départements n'ayant aucun employé.