Jointures entre Tables
1 Jointures
- Regrouper les données de plusieurs tables
- En utilisant les liens entre ces tables
- Jusqu’à maintenant, on aurait pu tout faire sous excel…
- Faire une jointure est comme créer un gros tableau
Tables utilisées
Dans les exemples ci-dessous, nous allons utiliser ces 2 tables.
Vous pouvez tout à fait faire des jointures avec 3 tables, 4 tables…
Données
id_joueuse | nom | prenom | elo | id_club |
---|---|---|---|---|
1 | Guichard | Pauline | 2357 | 3 |
2 | Daulyte | Deimante | 2371 | 1 |
3 | Navrotescu | Andreea | 2338 | 2 |
4 | Sebag | Marie | 2448 | 2 |
5 | Millet | Sophie | 2366 | 3 |
6 | Skrichempko | Almira | 2361 |
id_club | nom | ville |
---|---|---|
1 | C’Chartres Echecs | Chartres |
2 | Bischwiller | Bischwiller |
3 | Asnieres - le Grand Echiquier | Asnieres |
4 | Tours des Hauts-De-France | Saint-Quentin |
- Des remarques sur ces données ?
- Comment-vous pensez que l’on va faire la jointure ?
2 Jointure interne
L’INNER JOIN renvoie uniquement les lignes qui ont des correspondances dans les deux tables.
Au max, vous avez le nombre de lignes de la table la plus grande
1ere tentative
SELECT nom,
prenom,AS club
nom FROM echecs.joueuse
INNER JOIN echecs.club ON id_club = id_club;
- Nous affichons nom et prenom de la table joueuse
- Nous ajoutons le nom du club
- Nous faisons la jointure entre joueuse et club via la colonne id_club
Des soucis dans cette requête ? 😕
2e tentative
SELECT joueuse.nom,
joueuse.prenom,AS club
club.nom FROM echecs.joueuse
INNER JOIN echecs.club ON club.id_club = joueuse.id_club;
Ça fonctionne !
Mais c’est un peu long d’écrire avant chaque colonne le nom de la table.
Alias
SELECT j.nom, -- signifie colonne nom de la table d'alias j
j.prenom,AS club
c.nom FROM echecs.joueuse j -- déclare j comme alias de la table joueuse
INNER JOIN echecs.club c ON c.id_club = j.id_club;
- L’Alias est comme un surnom pour la table
- Par défaut l’alias de la table est son propre nom (i.e. si vous ne déclarez pas d’alias)
- Généralement on utilise comme alias la 1ere lettre ou les 2 premières lettres
USING
Si votre base de données est bien conçue, les colonnes utilisées pour les jointures portent le même nom dans les deux tables.
Dans ce cas, et uniquement dans ce cas, vous pouvez utiliser le mot clé USING
à la place de ON
.
SELECT j.nom,
j.prenom,AS club
c.nom FROM echecs.joueuse j
INNER JOIN echecs.club c USING (id_club);
Si vos colonnes n’ont pas le même nom, pas possible de faire USING
Au final
SELECT j.nom,
j.prenom,AS club
c.nom FROM echecs.joueuse j
JOIN echecs.club c USING (id_club);
Vous pouvez même enlever le INNER
qui est optionnel.
À ne pas faire
Il est aussi possible de faire une jointure avec NATURAL JOIN
sans préciser aucun nom de colonnes. Cela va joindre les tables via les colonnes ayant le même nom dans les 2 tables.
Cette pratique est déconseillée, car vous ne maitrisez pas les colonnes servant à la jointure et c’est visuellement moins parlant.
SELECT j.nom,
j.prenom,AS club
c.nom FROM echecs.joueuse j,
echecs.club c WHERE j.id_club = c.id_club;
Ancienne écriture encore utilisée par un certain nombre.
Résultat
nom | prenom | club |
---|---|---|
Daulyte | Deimante | C’Chartres Echecs |
Navrotescu | Andreea | Bischwiller |
Sebag | Marie | Bischwiller |
Guichard | Pauline | Asnieres - le Grand Echiquier |
Millet | Sophie | Asnieres - le Grand Echiquier |
Il n’y a pas quelque chose qui vous chagrine ? 😦
A votre avis, pourquoi il manque une joueuse ?
3 Jointure externe
Ce serait pas mal d’afficher toutes les joueuses, même celles qui n’ont pas de club.
Comment faire ? 😐
Idée
- Lister les noms et prénoms des joueuses
- Éventuellement compléter avec le nom du club
SELECT j.nom,
j.prenom,AS club
c.nom FROM echecs.joueuse j
LEFT JOIN echecs.club c USING (id_club);
LEFT JOIN
Utilisons un LEFT JOIN
pour faire une jointure externe :
- nous gardons toutes les données présentes dans les tables avant le LEFT JOIN
- nous complétons si possible avec les données des tables après le LEFT JOIN
À l’inverse, le RIGHT JOIN
garde tout ce qu’il y a après et compléte si possible avec ce qu’il y a avant.
Il est moins utilisé car moins intuitif, mais reste parfois indispensable.
Il y a certains cas particuliers où le RIGHT JOIN est indispensable
Vous verrez parfois LEFT OUTER JOIN
Résultat
nom | prenom | club |
---|---|---|
Daulyte | Deimante | C’Chartres Echecs |
Navrotescu | Andreea | Bischwiller |
Sebag | Marie | Bischwiller |
Guichard | Pauline | Asnieres - le Grand Echiquier |
Millet | Sophie | Asnieres - le Grand Echiquier |
Skrichempko | Almira |
nom | prenom | club |
---|---|---|
Daulyte | Deimante | C’Chartres Echecs |
Navrotescu | Andreea | Bischwiller |
Sebag | Marie | Bischwiller |
Guichard | Pauline | Asnieres - le Grand Echiquier |
Millet | Sophie | Asnieres - le Grand Echiquier |
Tours des Hauts-De-France |
4 Jointure complète
Le FULL JOIN
permet de faire une jointure bilatérale (i.e. un UNION entre les éléments de la LEFT JOIN et de la RIGHT JOIN)
SELECT j.nom,
j.prenom,AS club
c.nom FROM echecs.joueuse j
FULL JOIN echecs.club c USING (id_club);
Résultat
nom | prenom | club |
---|---|---|
Daulyte | Deimante | C’Chartres Echecs |
Navrotescu | Andreea | Bischwiller |
Sebag | Marie | Bischwiller |
Guichard | Pauline | Asnieres - le Grand Echiquier |
Millet | Sophie | Asnieres - le Grand Echiquier |
Skrichempko | Almira | |
Tours des Hauts-De-France |
5 Jointure croisée
CROSS JOIN
renvoie le produit cartésien des deux tables.
nom | prenom | club |
---|---|---|
Daulyte | Deimante | C’Chartres Echecs |
Daulyte | Deimante | Bischwiller |
Daulyte | Deimante | Asnieres - le Grand Echiquier |
Daulyte | Deimante | Tours des Hauts-De-France |
Navrotescu | Andreea | C’Chartres Echecs |
Navrotescu | Andreea | Bischwiller |
Navrotescu | Andreea | Asnieres - le Grand Echiquier |
… | … | … |