Image ventilateur qui tourne fond du ventilateur Circuit imprimé (image de titrage diode verte diode rouge
Administration
Pour voir une image
en plus haute résolution
dans un autre onglet,
cliquez sur elle !

Jointure

INFORMATIQUE > BASES DE DONNÉES

Les jointures permettent l'extraction de données contenues dans plusieurs tables.

Le plus souvent, on effectue une jointure en imposant l'égalité des valeurs d'une colonne d'une table avec une colonne d'une autre table. On parle dans ce cas très fréquent de jointure naturelle ou équi-jointure.

Plus rarement on peut rencontrer des jointures d'une table sur elle-même, on parle alors d'auto-jointure.

Il arrive aussi que l'on souhaite joindre une table à une autre même si la valeur de liaison est absente dans une table ou l'autre, on parle alors de jointure externe.

Enfin, on utilise parfois des jointures dans lesquelles on remplace le critère d'égalité par un critère d'inégalité ou de différence, on parle alors de jointures hétérogènes.

Nous présentons ci-dessous les principales jointures à l'aide d'exemples.

Un exemple

Nous allons d'abord constuire un exemple

Nous supposons que nous enregistrons des mots, comme dans Ma petite encyclopédie et des catégories auxquelles peuvent appartenir ces mots.,

Nous construisons d'abord la table Dictionnaire.

Elle comprend les champs suivants :

  • dic_id : identifiant
  • dic_item : mot défini.
  • dic_def : définition, sa valeur par défaut est définie à NULL.
  • dic_cat : catégorie de l'item. c'est une clé étrangère, clé primaire de notre deuxième table Categorie.

Saisissons quelques enregistrements, voici le contenu de notre table dictionnaire

Notre deuxième table, Categorie comporte les champs suivants :
  • cat_id : clé primaire.
  • cat_nom : nom de la catégorie.
  • cat-def : définition de la catégorie.
  • Voici son contenu :

Volontairement, nous n'avons pas déclaré de clés étrangères pour ne pas modifier le résultat des requêtes et nous intéresser seulement aux jointures.

INNER JOIN (jointure interne)

C'est la jointure la plus fréquente. Elle retourne les données des deux tables quand un enregistrement de la première table est relié à un enregistrement de la seconde table.

SELECT * FROM `Dictionnaire` 
INNER JOIN `Categorie` 
ON dic_cat = cat_id

On notera que le mot INNER est facultatif. Par défaut une jointure est interne.

Le résultat de cette requête est le suivant :

Cette requête nous permet de récupérer tous les items qui ont une catégorie avec les informations correspondantes. Elle permettra, par exemple, d'afficher une liste des items qui ont une catégorie avec leur définition et la définition de la catégorie à laquelle ils appartiennent.

Autrement dit, on s'intéresse ici à l'intersection des deux tables (voir schéma ci-dessous).

LEFT JOIN (jointure externe)


SELECT * FROM `Dictionnaire`
LEFT JOIN `Categorie`
ON dic_cat = cat_id

Le résultat de cette requête est le suivant :

LEFT JOIN retourne le même résultat qu'INNER JOIN mais en ajoutant les lignes de la première table (celle de gauche) qui n'ont pas de correspondance dans la deuxième table (voir schéma ci-dessous).

Dans notre exemple, on récupère les items qui ont une catégorie avec les informations de ces items et des catégories correspondantes mais aussi les items qui n'ont pas de catégorie.

On récupère donc toutes les lignes de la première table (Dictionnaire) avec les informations correspondantes de la seconde si une correspondance existe, sinon les champs de la deuxième table (Catégorie) sont mis à NULL.

Ce LEFT JOIN donne le même résultat qu'un INNER JOIN si on gère correctement l'intégrité référentielle. En effet dans ce cas, le champ dic_cat ne peut être nul mais conceptuellement, on ne fait pas la même chose avec ces deux jointures.

RIGHT JOIN (jointure externe)


SELECT * FROM `Dictionnaire`
RIGHT JOIN `Categorie`
ON dic_cat = cat_id

Le résultat de cette requête est le suivant :

RIGHT JOIN retourne le même résultat qu'INNER JOIN mais en ajoutant les lignes de la deuxième table (celle de droite) qui n'ont pas de correspondance dans la première table (voir schéma ci-dessous).

Dans notre exemple, on récupère les items qui ont une catégorie avec les informations de ces items et des catégories correspondantes mais aussi les catégories qui n'ont pas d'items.

On récupère donc toutes les lignes de la deuxième table (Catégorie) avec les informations correspondantes de la première si une correspondance existe, sinon les champs de la première table (Dictionnaire) sont mis à NULL.

LEFT JOIN (sans correspondance)


SELECT * FROM `Dictionnaire` 
LEFT JOIN `Categorie` 
ON dic_cat = cat_id 
WHERE cat_id IS NULL 

Le résultat de cette requête est le suivant :

On utilise ici une condition WHERE supplémentaire pour obtenir toutes les lignes de la première table qui n'ont aucune correspondance dans la deuxième table.

Dans notre exemple il s'agit des items du dictionnaire qui ne sont classés dans aucune catégorie.

RIGHT JOIN (sans correspondance)


SELECT * FROM `Dictionnaire` 
RIGHT JOIN `Categorie` 
ON dic_cat = cat_id 
WHERE dic_id IS NULL 

Le résultat de cette requête est le suivant :

On utilise ici une condition WHERE supplémentaire pour obtenir toutes les lignes de la deuxième table qui n'ont aucune correspondance dans la première table.

Dans notre exemple il s'agit des catégories dans lesquelles ne sont classés auxun item.

FULL OUTER JOIN

Cette jointure s'écrit normalement en SQL :


SELECT * FROM Dictionnaire 
FULL OUTER JOIN Categorie
ON dic_cat = cat_id 

Cette jointure n'existe pas en MySQL. Il est cependant possible d'obtenir le même résultat de la manière suivante (union d'une jointure droite et d'une jointure gauche) :


SELECT * FROM Dictionnaire 
LEFT JOIN Categorie 
ON dic_cat = cat_id 
UNION 
SELECT * FROM Dictionnaire 
RIGHT JOIN Categorie 
ON dic_cat = cat_id

Le résultat de cette requête est le suivant :

(Source : Wikimedia Commons, auteur : Arbeck, licence : Creative Commons Attribution - Partage dans les Mêmes Conditions 3.0 (non transposée)).