Exemples de jointure

(Adaptation d'un document produit par Yves Marcoux, 2007)

Remarque

Les tables utilisées sont disponibles en téléchargement [ZIP]. Vous pouvez les récupérer pour les importer dans votre compte individuel sur phpMyAdmin et expérimenter vous-même avec les jointures.

Supposons que les tables PERSONNE (table des personnes) et LOCALITE (table faisant la correspondance entre les codes postaux et les villes associées) soient structurées comme suit :

Structure de la table PERSONNE

Champ

Type

Taille

NO

Numérique

2

NOM

Caractère

30

TEL

Caractère

12

CP

Caractère

7

Structure de la table LOCALITE

Champ

Type

Taille

CP

Caractère

7

VILLE

Caractère

20

et qu'elles aient, à un moment donné, les contenus suivants :

Contenu de la table PERSONNE

NO

NOM

TEL

CP

1

Bissonnette, Lise

514-432-3514

H2J 1C4

2

Valjean, Jean

514-123-2292

H3V 2E5

3

Smith, Luc

514-778-7167

H3V 2E5

Contenu de la table LOCALITE

CP

VILLE

H2J 1C4

Ville St-Laurent

H2J 3A8

Ville St-Laurent

H3V 2E5

Montréal

Supposons que l'on veuille obtenir le nom et le numéro de téléphone des personnes habitant Montréal. Les quatre premiers exemples ci-dessous correspondent à la construction par étape d'une requête SQL permettant d'obtenir l'information désirée.

Jointure sans condition

Une jointure en SQL est un énoncé SELECT dans lequel le mot-clé FROM est suivi d'au moins deux noms de table. Lorsqu'il n'y a aucune condition de sélection (clause WHERE), la jointure donne comme résultat une table qui contient toutes les combinaisons possibles des lignes provenant des tables jointes.

1
SELECT *
2
FROM PERSONNE, LOCALITE;
Table des résultats

NO

NOM

TEL

PERSONNE.CP

LOCALITE.CP

VILLE

1

Bissonnette, Lise

514-432-3514

H2J 1C4

H2J 1C4

Ville St-Laurent

2

Valjean, Jean

514-123-2292

H3V 2E5

H2J 1C4

Ville St-Laurent

3

Smith, Luc

514-778-7167

H3V 2E5

H2J 1C4

Ville St-Laurent

1

Bissonnette, Lise

514-432-3514

H2J 1C4

H3V 2E5

Montréal

2

Valjean, Jean

514-123-2292

H3V 2E5

H3V 2E5

Montréal

3

Smith, Luc

514-778-7167

H3V 2E5

H3V 2E5

Montréal

1

Bissonnette, Lise

514-432-3514

H2J 1C4

H2J 3A8

Ville St-Laurent

2

Valjean, Jean

514-123-2292

H3V 2E5

H2J 3A8

Ville St-Laurent

3

Smith, Luc

514-778-7167

H3V 2E5

H2J 3A8

Ville St-Laurent

Remarquez ainsi que les champs CP des tables PERSONNE et LOCALITE n'ont pas toujours la même valeur, comme toutes les combinaisons possibles sont effectuées.

Sélection avec condition

L'ajout d'une condition (clause WHERE) permet, comme dans la sélection sans jointure (c'est-à-dire sur une seule table), de ne retenir que certaines lignes. On peut ainsi ne garder que les lignes pour lesquelles les champs CP des deux tables sont égaux.

1
SELECT *
2
FROM PERSONNE, LOCALITE
3
WHERE PERSONNE.CP = LOCALITE.CP;
Table des résultats

NO

NOM

TEL

PERSONNE.CP

LOCALITE.CP

VILLE

1

Bissonnette, Lise

514-432-3514

H2J 1C4

H2J 1C4

Ville St-Laurent

2

Valjean, Jean

514-123-2292

H3V 2E5

H3V 2E5

Montréal

3

Smith, Luc

514-778-7167

H3V 2E5

H3V 2E5

Montréal

Condition additionnelle

Il est possible d'inclure plus d'une condition dans la clause WHERE pour « raffiner » la sélection, par exemple en liant les conditions avec un ET logique (AND) et ainsi ne conserver que les lignes correspondant à Montréal comme localité.

1
SELECT *
2
FROM PERSONNE, LOCALITE
3
WHERE PERSONNE.CP = LOCALITE.CP
4
AND LOCALITE = 'Montréal';
Table des résultats

NO

NOM

TEL

PERSONNE.CP

LOCALITE.CP

VILLE

2

Valjean, Jean

514-123-2292

H3V 2E5

H3V 2E5

Montréal

3

Smith, Luc

514-778-7167

H3V 2E5

H3V 2E5

Montréal

Sélection des colonnes désirées

Finalement, on peut préciser les champs que l'on veut voir apparaître dans la table des résultats simplement en remplaçant l'astérisque (*) en début de requête (qui signifie d'afficher tous les champs) par les noms des champs désirés séparés par une virgule.

1
SELECT NO, NOM, TEL
2
FROM PERSONNE, LOCALITE
3
WHERE PERSONNE.CP = LOCALITE.CP
4
AND LOCALITE = 'Montréal';
Table des résultats

NO

NOM

TEL

2

Valjean, Jean

514-123-2292

3

Smith, Luc

514-778-7167

C'est le résultat désiré. Notons qu'aucune colonne de la table LOCALITE n'est sélectionnée pour affichage, bien que cette table soit utilisée (et nécessaire) dans la jointure. C'est là une situation tout à fait courante. Remarquez aussi que l'on a pris soin d'inclure, dans les champs affichés, la clé primaire de la table (NO) qui permettra, s'il y a deux homonymes demeurant à Montréal, de les distinguer.

Élimination des répétitions

Lorsqu'une requête peut entraîner une réponse qui contient des répétitions (c'est-à-dire plusieurs lignes identiques dans une table), on peut faire éliminer ces répétitions avec la clause DISTINCT (prédicat) placée tout de suite après SELECT.

Remarquez, par exemple, que la requête suivante qui permet d'extraire les codes postaux génère une table avec des lignes qui se répètent comme deux personnes possèdent le même code postal.

1
SELECT CP
2
FROM PERSONNE;
Table des résultats

CP

H2J 1C4

H3V 2E5

H3V 2E5

Si vous ajoutez DISTINCT devant le champ à afficher, les répétitions seront de ce fait éliminées.

1
SELECT DISTINCT CP
2
FROM PERSONNE;
Table des résultats

CP

H2J 1C4

H3V 2E5

Deux fois la même table dans une jointure

On peut utiliser deux fois la même table dans une jointure. On fait alors suivre chacune des deux occurrences par un alias (c'est-à-dire une chaîne de caractères qui représente de manière unique chacune des occurrences par exemple P1 pour la première instance de la table PERSONNE et P2, pour la deuxième instance). On utilise alors les alias au lieu du nom de la table ailleurs dans l'énoncé SELECT. La requête ci-dessous permet d'identifier les codes postaux communs à deux personnes distinctes. C'est la condition P1.NO <> P2.NO qui permet de s'assurer qu'il s'agit de deux personnes distinctes.

1
SELECT DISTINCT P1.CP
2
FROM PERSONNE AS P1, PERSONNE AS P2
3
WHERE P1.CP = P2.CP
4
AND P1.NO <> P2.NO;
Table des résultats

P1CP

H3V 2E5