Cours Complet : Les Jointures en SQL
(JOIN)
Dans une base de données relationnelle, les informations sont souvent réparties dans
plusieurs tables pour éviter les redondances. Les jointures (JOIN) permettent de
combiner les lignes de deux ou plusieurs tables en se basant sur une colonne commune
(généralement une clé primaire et une clé étrangère).
1. Tables d'Exemple pour le Cours
Pour bien comprendre les différents types de jointures, nous allons utiliser deux tables :
'employes' et 'services'. Remarquez que certains employés n'ont pas de service, et
qu'un service n'a pas encore d'employé.
Table : services
id_service nom_service
1 IT
2 RH
3 Ventes
Table : employes
id nom salaire service_id
1 Dupont 3500.00 1
2 Martin 2800.00 2
3 Durand 4200.00 1
4 Inconnu 1900.00 NULL
2. Les Différents Types de Jointures
A. INNER JOIN (La jointure interne)
C'est la jointure par défaut. Elle retourne uniquement les lignes pour lesquelles il y a une
correspondance parfaite entre les deux tables.
Exemple : Afficher les employés et le nom de leur service.
SELECT [Link], services.nom_service
FROM employes
INNER JOIN services ON employes.service_id =
services.id_service;
Résultat obtenu (L'employé 4 'Inconnu' est exclu car son service_id est NULL) :
nom nom_service
Dupont IT
Martin RH
Durand IT
B. LEFT JOIN / LEFT OUTER JOIN (La jointure externe gauche)
Elle retourne toutes les lignes de la table de gauche (ici 'employes'), même s'il n'y a pas
de correspondance dans la table de droite. Si aucune correspondance n'existe, les
colonnes de la table de droite afficheront NULL.
Exemple : Afficher TOUS les employés, avec leur service s'ils en ont un.
SELECT [Link], services.nom_service
FROM employes
LEFT JOIN services ON employes.service_id =
services.id_service;
C. RIGHT JOIN / RIGHT OUTER JOIN (La jointure externe droite)
À l'inverse du LEFT JOIN, elle retourne toutes les lignes de la table de droite (ici
'services'), même s'il n'y a pas d'employé associé. Les colonnes manquantes de la table
de gauche afficheront NULL.
SELECT [Link], services.nom_service
FROM employes
RIGHT JOIN services ON employes.service_id =
services.id_service;
3. Script SQL Complet d'Application (DDL, DML, JOIN)
--
=========================================================================
===
-- 1. CREATION DES TABLES (DDL)
--
=========================================================================
===
DROP TABLE IF EXISTS employes;
DROP TABLE IF EXISTS services;
CREATE TABLE services (
id_service INT PRIMARY KEY AUTO_INCREMENT,
nom_service VARCHAR(50) NOT NULL
);
CREATE TABLE employes (
id INT PRIMARY KEY AUTO_INCREMENT,
nom VARCHAR(50) NOT NULL,
salaire DECIMAL(10,2) NOT NULL,
service_id INT,
FOREIGN KEY (service_id) REFERENCES services(id_service)
);
--
=========================================================================
===
-- 2. INSERTION DES DONNÉES (DML)
--
=========================================================================
===
INSERT INTO services (id_service, nom_service) VALUES
(1, 'IT'),
(2, 'RH'),
(3, 'Ventes');
INSERT INTO employes (nom, salaire, service_id) VALUES
('Dupont', 3500.00, 1),
('Martin', 2800.00, 2),
('Durand', 4200.00, 1),
('Inconnu', 1900.00, NULL);
--
=========================================================================
===
-- 3. LES REQUÊTES DE JOINTURE (DQL)
--
=========================================================================
===
-- REQUÊTE 1 : INNER JOIN (Uniquement les correspondances parfaites)
SELECT [Link], s.nom_service
FROM employes e
INNER JOIN services s ON e.service_id = s.id_service;
-- REQUÊTE 2 : LEFT JOIN (Tous les employés, même sans service)
SELECT [Link], s.nom_service
FROM employes e
LEFT JOIN services s ON e.service_id = s.id_service;
-- REQUÊTE 3 : RIGHT JOIN (Tous les services, même sans employé)
SELECT [Link], s.nom_service
FROM employes e
RIGHT JOIN services s ON e.service_id = s.id_service;