Jointures entre Tables

Ludovic Deneuville

Jointures

Objectifs

  • Regrouper les données de plusieurs tables
  • En utilisant les liens entre ces tables

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…

classDiagram
    class Joueuse {
        id_joueuse PK
        nom
        prenom
        elo
        id_club
    }
    
    class Club {
        id_club PK
        nom
        ville
    }

Données

Jointure interne

L’INNER JOIN renvoie uniquement les lignes qui ont des correspondances dans les deux tables.

1ere tentative

SELECT nom,
       prenom,
       nom AS club
  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,
       club.nom AS club
  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,
       c.nom AS club
  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;

Alias

  • 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

Tip

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,
       c.nom AS club
  FROM echecs.joueuse j
 INNER JOIN echecs.club c USING (id_club);

Au final

SELECT j.nom,
       j.prenom,
       c.nom AS club
  FROM echecs.joueuse j
  JOIN echecs.club c USING (id_club);

Vous pouvez même enlever le INNER qui est optionnel.

À ne pas faire

Caution

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.

Ancienne écriture

SELECT j.nom,
       j.prenom,
       c.nom AS club
  FROM echecs.joueuse j,
       echecs.club c 
 WHERE j.id_club = c.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

Il n’y a pas quelque chose qui vous chagrine ? 😦

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,
       c.nom AS club
  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

RIGHT 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.

Résultat

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,
       c.nom AS club
  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

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