08-02-2007, 01:26 PM
(Modification du message : 18-04-2007, 02:12 PM par Sephi-Chan.)
Tutorial : Les jointures avec MySQL
Nous allons, dans ce tutorial, parler des jointures, un outil très puissant de MySQL.
I. Introduction aux bases de données relationnelles.
Qu’est ce qu’une base de données ?
Une base de données est une collection d’information regroupée de manière logique dans ce qu’on appelle des tables.
On utilise les bases de données tous les jours, sans parfois même s’en rendre compte.
Prenons le cas du répertoire d’un téléphone portable. On peut dire que c’est une base de données possédant une table que l’on pourrait nommer repertoire et représenter de cette manière.
Avec les colonnes :
Nous allons maintenant pouvoir introduire la notion de base de données relationnelle.
Qu’est ce qu’une base de données relationnelle ?
La base de données relationnelle est une base de donnée structurée en plusieurs tables possédant une ou plusieurs colonnes communes : les clés.
Cette subtilité qui peut paraître infime est en réalité très importante puisque c’est sur l’usage des clés que repose l’intérêt de ces bases de données.
Imaginons par exemple cette table type :
Avec les colonnes :
Nous nous servirons de ces tables dans les prochains chapitres.
II. Qu’est ce qu’une jointure et à quoi sert-elle.
Une jointure est un lien qui combine les enregistrements de deux tables possédant des colonnes communes. En pratique, c’est une extension de l’instruction SELECT.
Il existe plusieurs types de jointures,
Je ne traiterai ici que des jointures internes pour la simple raison que je n’ai encore jamais eu besoin des autres.
En voici la syntaxe générale :
SELECT <colonnes sélectionnés>
FROM <table principale>
INNER JOIN <table annexe> ON <condition de jointure>
La jointure interne est la jointure par défaut. On peut ainsi se permettre d’omettre le terme INNER sans modifier le résultat de la requête.
III. Comment mettre en place les jointures.
Appliquons la syntaxe à nos deux tables pour effectuer une requête :
SELECT repertoire.id, repertoire.nom, repertoire.numero, repertoire.type, type.id, type.nom, type.description
FROM repertoire
INNER JOIN type ON type.id = repertoire.type
Puisque nous piochons dans plusieurs tables, il est important de préciser quelle colonne sera issue de quelle table. Dans le cas d’une colonne qui n’existe que dans une table, comme la colonne numero dans notre exemple, il est inutile de préciser le nom de la table. Toutefois nous le ferons quand même par précaution.
Nous utilisons la syntaxe suivante pour préciser l’appartenance d’une colonne à une table :
<nom de la table> . <nom de la colonne>
Cette instruction nous renverra le tableau suivant :
Notez les doublons que génère l’affichage des conditions de jointure, ici les colonnes repertoire.type et type.id qui sont les clés communes aux deux tables.
Si vous ne comptez pas vous servir de ces chiffres, vous pouvez retirer ces deux colonnes de la liste de colonnes sélectionnées pour ne garder que :
SELECT repertoire.id, repertoire.nom, repertoire.numero, type.nom, type.description
Ainsi votre requête sera plus légère.
Si vous souhaitez réutiliser ces chiffres, vous pouvez laisser l’une des colonnes (puisqu’ils sont identiques) dans la liste de sélection. Préférez en ce cas garder celui de la table secondaire, pour moins solliciter la table principale souvent plus chargée. Je suivrais cette recommandation dans nos exemples à venir en utilisant la liste de colonnes suivante :
SELECT repertoire.id, repertoire.nom, repertoire.numero, type.id, type.nom, type.description
Vous noterez également que même en retirant des champs, nous avons là deux colonnes portant le même nom, les colonnes nom. Ceux qui peut poser problème pour une utilisation avec PHP par exemple.
Il existe heureusement une méthode permettant de pallier à ce souci, l’utilisation d’alias de colonne, qui utilise l’opérateur AS dont voici la syntaxe.
SELECT repertoire.id, repertoire.nom, repertoire.numero, type.id AS id_type, type.nom AS nom_type, type.description
Cet opérateur est très pratique pour éviter les doublons, mais également pour donner des noms plus évocateurs aux colonnes.
Il est important de savoir que vous ne pouvez utiliser le nom crée grâce à cet opérateur dans les conditions de jointures.
Quelques astuces pour limiter la saisie de texte
Nous allons nous livrer à un court aparté pour expliquer les manières de limiter la saisie de texte qui vous permettra de gagner du temps, et aussi limiter le risque de faute de frappe.
Vous pouvez utiliser les alias de tables (que certains appellent surnoms), comme suit :
SELECT r.id, r.nom, r.numero, t.id AS id_type, t.nom AS nom_type, t.description
FROM repertoire r
INNER JOIN type t ON t.id = r.type
Et qui renvoi le tableau suivant :
On indique dans les deux dernières lignes qu’on parlera respectivement des tables repertoire et type par la lettre r et t. J’ai choisi ces lettres car elles sont les initiales des tables, vous pouvez mettre le mot que vous souhaitez.
Vous pouvez également utiliser l’opérateur étoile *. Il permet de récupérer toutes les colonnes de la table précisée dans la clause FROM ou JOIN.
Ainsi, si on souhaite ne récupérer que certaines colonnes de la table repertoire mais toutes celles de la table type, on utilisera l’instruction suivante.
SELECT r.id, r.nom, r.numero, t.*
FROM repertoire r
INNER JOIN type t ON t.id = r.type
Cet exemple vous montre également pourquoi je vous ai recommandé de sélectionner la colonne commune aux deux tables de la table secondaire plutôt que celui de la table principale. Cela s’explique par le fait qu’on aura plus souvent tendance à utiliser la totalité des colonnes de la table secondaire.
Il est en revanche impossible de donner un alias de colonne quand on la sélectionne grâce à l’opérateur étoile. Il faut donc cette fois si donner un alias aux colonnes listées normalement.
Nous allons, dans ce tutorial, parler des jointures, un outil très puissant de MySQL.
- Introduction aux bases de données relationnelles
- Qu’est ce qu’une jointure et à quoi sert-elle.
- Comment mettre en place les jointures.
- Des exemples concrets.
I. Introduction aux bases de données relationnelles.
Qu’est ce qu’une base de données ?
Une base de données est une collection d’information regroupée de manière logique dans ce qu’on appelle des tables.
On utilise les bases de données tous les jours, sans parfois même s’en rendre compte.
Prenons le cas du répertoire d’un téléphone portable. On peut dire que c’est une base de données possédant une table que l’on pourrait nommer repertoire et représenter de cette manière.
Avec les colonnes :
- id, de type smallint (contenant un nombre pouvant aller jusqu'à 65 535, qui devrait largement suffire ). Le champ est doté d’une clé primaire (dont nous verrons l’utilité plus tard) auto incrémenté, de manière à garantir l’unicité des enregistrements.
- nom, de type varchar et limité à 20 caractères.
- numero, de type varchar et limité à 12 caractères (pour qu’on puisse remplacer le 0 initial par le préfixe international (+33 pour la France par exemple).
- type, de type tinyint (dont la valeur peut aller jusqu'à 255) qui permettra de signaler sur le numéro est à usage professionnel, s’il s’agit du numéro d’un domicile ou encore d’un portable.
Nous allons maintenant pouvoir introduire la notion de base de données relationnelle.
Qu’est ce qu’une base de données relationnelle ?
La base de données relationnelle est une base de donnée structurée en plusieurs tables possédant une ou plusieurs colonnes communes : les clés.
Cette subtilité qui peut paraître infime est en réalité très importante puisque c’est sur l’usage des clés que repose l’intérêt de ces bases de données.
Imaginons par exemple cette table type :
Avec les colonnes :
- id, de type tinyint, est une clé. Elle lie la table type à la table repertoire grâce à la colonne type de la table du même nom.
- nom, de type varchar.
- description, de type text.
Nous nous servirons de ces tables dans les prochains chapitres.
II. Qu’est ce qu’une jointure et à quoi sert-elle.
Une jointure est un lien qui combine les enregistrements de deux tables possédant des colonnes communes. En pratique, c’est une extension de l’instruction SELECT.
Il existe plusieurs types de jointures,
- Jointure interne
- Jointure externe
- Jointure naturelle
- Jointure croisée
- Jointure d’union
Je ne traiterai ici que des jointures internes pour la simple raison que je n’ai encore jamais eu besoin des autres.
En voici la syntaxe générale :
SELECT <colonnes sélectionnés>
FROM <table principale>
INNER JOIN <table annexe> ON <condition de jointure>
La jointure interne est la jointure par défaut. On peut ainsi se permettre d’omettre le terme INNER sans modifier le résultat de la requête.
III. Comment mettre en place les jointures.
Appliquons la syntaxe à nos deux tables pour effectuer une requête :
SELECT repertoire.id, repertoire.nom, repertoire.numero, repertoire.type, type.id, type.nom, type.description
FROM repertoire
INNER JOIN type ON type.id = repertoire.type
Puisque nous piochons dans plusieurs tables, il est important de préciser quelle colonne sera issue de quelle table. Dans le cas d’une colonne qui n’existe que dans une table, comme la colonne numero dans notre exemple, il est inutile de préciser le nom de la table. Toutefois nous le ferons quand même par précaution.
Nous utilisons la syntaxe suivante pour préciser l’appartenance d’une colonne à une table :
<nom de la table> . <nom de la colonne>
Cette instruction nous renverra le tableau suivant :
Notez les doublons que génère l’affichage des conditions de jointure, ici les colonnes repertoire.type et type.id qui sont les clés communes aux deux tables.
Si vous ne comptez pas vous servir de ces chiffres, vous pouvez retirer ces deux colonnes de la liste de colonnes sélectionnées pour ne garder que :
SELECT repertoire.id, repertoire.nom, repertoire.numero, type.nom, type.description
Ainsi votre requête sera plus légère.
Si vous souhaitez réutiliser ces chiffres, vous pouvez laisser l’une des colonnes (puisqu’ils sont identiques) dans la liste de sélection. Préférez en ce cas garder celui de la table secondaire, pour moins solliciter la table principale souvent plus chargée. Je suivrais cette recommandation dans nos exemples à venir en utilisant la liste de colonnes suivante :
SELECT repertoire.id, repertoire.nom, repertoire.numero, type.id, type.nom, type.description
Vous noterez également que même en retirant des champs, nous avons là deux colonnes portant le même nom, les colonnes nom. Ceux qui peut poser problème pour une utilisation avec PHP par exemple.
Il existe heureusement une méthode permettant de pallier à ce souci, l’utilisation d’alias de colonne, qui utilise l’opérateur AS dont voici la syntaxe.
SELECT repertoire.id, repertoire.nom, repertoire.numero, type.id AS id_type, type.nom AS nom_type, type.description
Cet opérateur est très pratique pour éviter les doublons, mais également pour donner des noms plus évocateurs aux colonnes.
Il est important de savoir que vous ne pouvez utiliser le nom crée grâce à cet opérateur dans les conditions de jointures.
Quelques astuces pour limiter la saisie de texte
Nous allons nous livrer à un court aparté pour expliquer les manières de limiter la saisie de texte qui vous permettra de gagner du temps, et aussi limiter le risque de faute de frappe.
Vous pouvez utiliser les alias de tables (que certains appellent surnoms), comme suit :
SELECT r.id, r.nom, r.numero, t.id AS id_type, t.nom AS nom_type, t.description
FROM repertoire r
INNER JOIN type t ON t.id = r.type
Et qui renvoi le tableau suivant :
On indique dans les deux dernières lignes qu’on parlera respectivement des tables repertoire et type par la lettre r et t. J’ai choisi ces lettres car elles sont les initiales des tables, vous pouvez mettre le mot que vous souhaitez.
Vous pouvez également utiliser l’opérateur étoile *. Il permet de récupérer toutes les colonnes de la table précisée dans la clause FROM ou JOIN.
Ainsi, si on souhaite ne récupérer que certaines colonnes de la table repertoire mais toutes celles de la table type, on utilisera l’instruction suivante.
SELECT r.id, r.nom, r.numero, t.*
FROM repertoire r
INNER JOIN type t ON t.id = r.type
Cet exemple vous montre également pourquoi je vous ai recommandé de sélectionner la colonne commune aux deux tables de la table secondaire plutôt que celui de la table principale. Cela s’explique par le fait qu’on aura plus souvent tendance à utiliser la totalité des colonnes de la table secondaire.
Il est en revanche impossible de donner un alias de colonne quand on la sélectionne grâce à l’opérateur étoile. Il faut donc cette fois si donner un alias aux colonnes listées normalement.
********************
Cet article touche à sa fin.
Seront bientôt ajoutés quelques exemples pratiques utilisant des jointures sur plus de deux tables.
J’espère que la lecture de ces lignes vous aura servi, ou, à défaut, vous servira.
Je suis à l’écoute de tous conseils ou commentaires, en particulier s’ils visent à améliorer l’article.
Sephi-Chan