Lolokai – Supervision, systèmes, réseaux, base de données…

1

Les jointures SQL

Said ASSOUMANI 17 septembre 2012

Introduction

Jusqu’à maintenant nos requêtes ne concernait qu’une seule table. Dans la vie de tous les jours, pour ceux qui sont amenés à utiliser le langage SQL, il est très rare d’utiliser une seule table dans les requêtes. En effet, la puissance des bases de données relationnelles réside dans le fait de pouvoir extraire des données provenant de plusieurs tables. Ces tables ont entre elles des relations (sujet que l’on verra dans un autre article). Aujourd’hui nous allons voir ensemble les différents types de jointures et quelques exemples d’utilisations.

Le script

 create table job (

 job_id number(3) CONSTRAINT pk_id_job PRIMARY KEY,

 job_name varchar2(30),

 job_salary number(6) ) ;

insert into job values (10 , 'DBA ORACLE' , 50000) ;

 insert into job values (20 , 'Building Engineer' , 50000) ;

 insert into job values (30 , 'Doctor' , 100000) ;

 insert into job values (40 , 'Physicist' , 150000) ;

 insert into job values (50 , 'Footballer' , 200000) ;

 insert into job values (60 ,NULL , 0) ;

 commit ;

create table friend (

 friend_id number(3) CONSTRAINT pk_id_friend PRIMARY KEY,

 lastname varchar2(30),

 firstname varchar2(30),

 age number(3),

 city varchar2(30) ,

 job_id number(3),

 CONSTRAINT fk_job_id_friend FOREIGN KEY(job_id) REFERENCES job (job_id) ) ;

insert into friend values (1 , 'Assoumani' , 'Said', 20 , 'Le Port', 10);

 insert into friend values (2 , 'Gaspard' , 'Marine', 20 , 'Possession', 10);

 insert into friend values (3 , 'Chamsidine' , 'Raissa', 21 , 'Lyon', 20);

 insert into friend values (4 , 'Thazar' , 'Murielle', 21 , 'Saint-Etienne', 20);

 insert into friend values (5 , 'Ouloube' , 'Afdal', 22 , 'Paris', 30);

 insert into friend values (6 , 'Abdallah' , 'Nasmah', 22 , 'Paris', 30);

 insert into friend values (7 , 'Libelle' , 'Chloe', 23 , 'Saint-Pierre', 40);

 insert into friend values (8 , 'Soriano' , 'Luigy', 23 , 'Madrid', 50);

 insert into friend values (9 , 'Unknown' , 'People',25, 'Bratislava', NULL) ;

 commit ;

Les jointures internes

Une jointure c’est lorsqu’on sélectionne plusieurs enregistrements à partir de plusieurs tables en utilisant des valeurs communes. La jointure de deux voir plusieurs tables se fait grâce à des colonnes communes [appelées aussi clé (primaire | étrangère)].

Pour éviter des ambiguïtés et ainsi faciliter le travail dans notre base de données, lorsque deux tables possèdent plusieurs colonnes avec des noms identiques, il va falloir rajouter une référence au nom de nos colonnes dans nos requêtes. Ces références correspondent au nom de notre table ou un alias.

Il faut savoir qu’il existe plusieurs façons de faire des jointures, nous allons les voir à travers un exemple et expliquer les avantages ou inconvénients.

Exemple 1: NATURAL JOIN

SELECT lastname , firstname , job_name FROM friend NATURAL JOIN job ;

Cette façon de faire marche si et seulement si les colonnes communes portent les exactement le même nom ET on le même type de donnée.

Exemple 2 : avec la clause USING

SELECT lastname , firstname , job_name FROM friend JOIN job USING(job_id);

Ici contrairement au NATURAL JOIN, il suffit d’avoir le même nom pour les colonnes communes (possibilité d’avoir des types de données différents).

Exemple3 : avec la clause ON

SELECT f.lastname , f.firstname , j.job_name FROM friend f JOIN job j ON(f.job_id = j.job_id);

Ici la clause ON nous permet d’aller plus loin. Avec cette façon de faire, on va pouvoir relier des colonnes qui n’ont ni leurs noms identiques ni le type de données. Si on retrouve des données identiques dans les deux colonnes, alors les informations demandées dans la requête seront retournées.

Dans notre cas les trois exemples précédents retournent le résultat suivant :

Les jointures externes

Vous l’aurez remarqué, les jointures internes retournent que les lignes pour lesquelles il existe une correspondance dans les deux tables misent en jeu.

Avec les jointures externes on a la possibilité de retourner les résultats d’une table sans qu’il y est de correspondance avec la table jointe.

Dans ma table friend , j’ai un ami ‘Unknown People’ qui ne travaille pas pour l’instant et dans ma table job , j’ai le métier ‘Writer’ . Dans ma liste d’amis personne est ‘Writer’.

Il y a trois types de jointures externes :

  • LEFT OUTER JOIN :  Va nous permettre de retourner toutes les données de la table de gauche (position dans la requête)
  • RIGHT OUTER JOIN : Va nous permettre de retourner toutes les données de la table de droite (position dans la requête)
  • FULL OUTER JOIN :  Va nous permettre de retourner toutes les données (droite + gauche)

Exemple : RIGHT OUTER JOIN

SELECT f.lastname , f.firstname , j.job_id, j.job_name
FROM friend f RIGHT OUTER JOIN job j
ON(f.job_id = j.job_id);

Ici on voit bien que les données de la table job (table à droite dans la requête) sont toutes présentes, malgré le fait qu’il n’y est pas de correspondance avec la table friend.

Exemple : LEFT OUTER JOIN

SELECT f.lastname , f.firstname , j.job_id, j.job_name
FROM friend f LEFT OUTER JOIN job j
ON(f.job_id = j.job_id);

Ici on voit bien que les données de la table friend (table à gauche dans la requête ) sont toutes présentes, malgré le fait qu’il n’y est pas de correspondance avec la table job.

Exemple : FULL OUTER JOIN

SELECT f.lastname , f.firstname , j.job_id, j.job_name
FROM friend f FULL OUTER JOIN job j
ON(f.job_id = j.job_id);

Ici on voit bien que toutes les données sont présentes.

Conclusion

Nous avons vu à travers cet article comment récupérer des données à partir de plusieurs tables avec les jointures. En espérant que j’ai été clair sur cette partie (qui est souvent dure à assimiler) et sur les exemples.

Avez vous des questions sur le sujet ?Said ASSOUMANI

Comments (1)

  1. Merci pour ce long article très complet sur les jointures de tables. Je ne pense pas qu’il y ai de meilleur façon d’apprendre qu par des exemples concrets avec en plus une capture d’écran pour afficher les résultats.

    Répondre

Laisser un commentaire

Login to your account

Can't remember your Password ?

Register for this site!