C'est le dernier article de la série sur le langage SQL.
- SQL - Notions de base
- SQL - Syntaxe de base - requêtes Séléction
- SQL - Syntaxe des requêtes action
- SQL - Les Jointures
Une jointure est une relation entre deux tables. Lorsque vous créez une requête multitable, il est important de préciser la relation entre les différentes tables.
Reprenons l'exemple de l'ensemble des tables que nous avons utilisé dans le premier article :
Les trois tables sont jointes par des relations entre clé primaire et clé étrangère. Imaginons que - comme dans le premier article - nous voulions faire une requête sélection qui liste les différents vendeurs et le nombre de visites que chaque vendeur a effectué.
Cette fois-ci, au lieu d'avoir un simple numéro de vendeur, on veut afficher son nom et prénom. Pour faire cela, on a besoin de mettre deux tables dans la requête; VISITES_CLIENTS (pour le nombre de visites et l'identifiant du vendeur) et VENDEURS (pour récupérer le nom et le prénom du vendeur qui correspond à l'identifiant). C'est assez simple dans l'interface Access mais comment faire cela en SQL?
On pourrait essayer cela :
SELECT VISITES_CLIENT.ID_VENDEUR, Count(VISITES_CLIENT.ID_VISITE) AS CompteDeID_VISITE, VENDEURS.NOM_VENDEUR, VENDEURS.PRENOM_VENDEUR FROM VISITES_CLIENT, VENDEURS GROUP BY VISITES_CLIENT.ID_VENDEUR
Mais çela ne marchera pas comme on voudra car -même si on a mis les deux tables dans la partie FROM de l'instruction (FROM VISITES_CLIENT, VENDEURS) - il n'y aucun moyen de savoir comment les deux tables sont liées entre elles.
Pour déclarer cette relation ou jointure, on utilise la syntaxe INNER JOIN, comme ceci :
SELECT ... FROM VISITE_CLIENTS INNER JOIN VENDEURS ON VISITE_CLIENTS.ID_VENDEUR = VENDEURS.ID_VENDEUR
Cela l'air compliqué n'est-ce pas mais c'est plus simple que l'on croit! Après FROM, on met la première table à inclure dans la requête, c.a.d VENDEURS. Ensuite on ajoute INNER JOIN et le nom de la deuxième table, VISITE_CLIENTS. Enfin on écrit ON et les deux champs de chaque table qui doivent être égaux, à savoir VENDEURS.ID_VENDEUR (c'est la clé primaire de la table vendeurs) = VISITE_CLIENTS.ID_VENDEUR (la clé étrangère de VENDEURS qui se trouve dans VISITE_CLIENTS).
Désormais, la relation est créé pour cette requête.
Dans une jointure INNER JOIN, il s'affichera seulement les enregistrements où les deux champs sont égaux. Dans l'exemple ci-dessus il ne sera pris en compte que les enregistrements où la valeur de la clé primaire est la même que celle stockée dans la clé étrangère.
Il existe également des LEFT JOIN et des RIGHT JOIN qui peuvent être utiles. Regardez cet exemple :
SELECT entreprises.raison_sociale, Count(commandes.id_commande) AS nb_commandes FROM entreprises LEFT JOIN commandes ON entreprise.id_entreprise = commandes.id_entreprise
Dans le cas de LEFT JOIN, tous les enregistrements de la table de gauche, c'est à dire "entreprise", seront inclus, mais dans la table de droite, "commandes" on ne verra que les commandes qui ont un champ id_entreprise qui correspond à une entreprise dans la table "entreprise".
Cette requête produira une liste de toutes nos entreprises, même celles qui n'auront pas encore commandé, alors qu'avec INNER JOIN, on ne les aurait pas vus.
Ces articles sont loin d'être exhaustifs! Si vous souhaitez approfondir le sujet, il y a plein de ressources sur Internet. Nous vous recommandons les pages suivantes :
Si vous avez une question, n'hésitez pas à laisser un commentaire en bas de la page!