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 :
Champ | Type | Taille |
---|---|---|
NO | Numérique | 2 |
NOM | Caractère | 30 |
TEL | Caractère | 12 |
CP | Caractère | 7 |
Champ | Type | Taille |
---|---|---|
CP | Caractère | 7 |
VILLE | Caractère | 20 |
et qu'elles aient, à un moment donné, les contenus suivants :
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 |
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.
SELECT *
FROM PERSONNE, LOCALITE;
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.
SELECT *
FROM PERSONNE, LOCALITE
WHERE PERSONNE.CP = LOCALITE.CP;
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é.
SELECT *
FROM PERSONNE, LOCALITE
WHERE PERSONNE.CP = LOCALITE.CP
AND LOCALITE = 'Montréal';
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.
SELECT NO, NOM, TEL
FROM PERSONNE, LOCALITE
WHERE PERSONNE.CP = LOCALITE.CP
AND LOCALITE = 'Montréal';
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.
SELECT CP
FROM PERSONNE;
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.
SELECT DISTINCT CP
FROM PERSONNE;
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.
SELECT DISTINCT P1.CP
FROM PERSONNE AS P1, PERSONNE AS P2
WHERE P1.CP = P2.CP
AND P1.NO <> P2.NO;
P1CP |
---|
H3V 2E5 |