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.
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 :
Saisissons quelques enregistrements, voici le contenu de notre table dictionnaire
Notre deuxième table, Categorie comporte les champs suivants :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.
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).
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.
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.
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.
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.
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 :