Publié le 11 novembre 2026 · Mis à jour le 11 novembre 2026 · Signaler une erreur
L'essentiel
Une requête interroge une base : SELECT choisit les colonnes, FROM la table, WHERE filtre les lignes, ORDER BY trie.
Une jointure relie deux tables grâce à un champ commun : la clé primaire d'un côté, la clé étrangère de l'autre, comparées dans ON.
Sans condition de jointure, on obtient toutes les combinaisons de lignes (produit cartésien) : le résultat est faux et énorme.
GROUP BY regroupe les lignes ; SUM, COUNT, AVG calculent un résultat par groupe ; HAVING filtre sur ces groupes.
INNER JOIN garde seulement les lignes qui ont une correspondance ; LEFT JOIN garde aussi les lignes de la table de gauche sans correspondance.
Le même principe existe dans un logiciel de cartographie (SIG) : la jointure attributaire lie une couche à une table grâce à des champs clés.2
Pourquoi interroger et relier des données ?
Une entreprise garde ses informations dans une base de données : clients, produits, commandes, factures. Ces informations ne sont pas rangées dans un seul grand tableau. Elles sont réparties dans plusieurs tables, chacune consacrée à un sujet précis. Cette organisation évite de recopier cent fois l'adresse d'un client chaque fois qu'il passe commande.
Mais cette répartition pose un problème pratique. Un responsable commercial veut savoir : quels clients de Lyon ont passé commande en mars, et pour quel montant total ? La réponse se trouve dans deux tables à la fois. Il faut donc deux outils :
la requête, qui permet de poser une question précise à la base ;
la jointure, qui permet de rassembler dans une même réponse des données stockées dans des tables différentes.
Dans ce cours, tu vas apprendre à lire et à écrire des requêtes en langage SQL, à construire une jointure en repérant les bons champs, à calculer des totaux par groupe, et à éviter les erreurs qui coûtent des points au bac. Tu t'appuies sur deux notions déjà vues : le modèle relationnel et les bases du langage SQL.
Tout au long du cours, nous utiliserons la même petite base d'une boutique en ligne. Elle contient deux tables.
Table CLIENT
id_client
nom
ville
1
Durand
Lyon
2
Martin
Nantes
3
Bernard
Lille
4
Petit
Lyon
Table COMMANDE
id_commande
date_commande
montant
id_client
101
2026-03-02
120
1
102
2026-03-05
80
2
103
2026-03-09
45
1
104
2026-03-12
200
4
105
2026-03-15
60
2
Les montants sont en euros. Retiens bien ces deux tables : tous les exemples et les exercices s'y rapportent.
Rappel : tables, clés primaire et étrangère
Observe la commande 103 : son id_client vaut 1. On ne retrouve pas le nom du client dans COMMANDE, seulement son numéro. Pour savoir que la commande 103 appartient à Durand, il faut aller lire la table CLIENT. C'est exactement ce que fera la jointure, mais de façon automatique et pour toutes les lignes en même temps.
La requête de sélection : SELECT, FROM, WHERE, ORDER BY
Calculer avec les agrégats : COUNT, SUM, AVG, GROUP BY
La jointure : relier deux tables par un champ commun
Jusqu'ici, nos requêtes ne touchaient qu'une seule table. Le total par client affiche pourtant un numéro (1, 2, 4), alors que le responsable commercial veut lire un nom (Durand, Martin, Petit). Le nom est dans CLIENT, le montant dans COMMANDE. Pour les mettre côte à côte, il faut joindre les deux tables.
Cette idée dépasse le seul SQL. Dans les logiciels de cartographie (SIG), on parle de jointure attributaire : elle rattache à une couche géographique des données qui viennent d'une table ou d'une autre couche, en s'appuyant sur les données attributaires.2 Un tutoriel du CNRS pose d'ailleurs la question de départ qui compte dans toute jointure : quels sont les deux champs clés qui permettront de relier les deux tables ?2 C'est le premier réflexe à avoir, que tu travailles en SQL ou dans un SIG.
Résultat de la jointure CLIENT et COMMANDE
nom
id_commande
montant (€)
Durand
101
120
Martin
102
80
Durand
103
45
Petit
104
200
Martin
105
60
Résultat de la jointure CLIENT et COMMANDE · Bernard n'apparaît pas : il n'a aucune commande.
Écrire une jointure en SQL
Lire la questionQuelles colonnes, quel calcul ?
Repérer les tablesOù se trouve chaque information ?
Trouver les clésClé primaire et clé étrangère.
JoindreJOIN … ON avec les champs clés.
Filtrer et grouperWHERE, GROUP BY, HAVING, ORDER BY.
Écrire une requête avec jointure
INNER JOIN et LEFT JOIN : que faire des lignes sans correspondance ?
Bernard n'a passé aucune commande. Avec INNER JOIN, il disparaît du résultat : une ligne n'est gardée que si une correspondance existe des deux côtés. Or il arrive qu'on veuille justement repérer les clients sans commande, pour leur envoyer une offre par exemple. Un autre type de jointure répond à ce besoin.
Jointure et cartographie : le même principe dans un SIG
Un système d'information géographique (SIG) stocke des cartes sous forme de couches. Chaque couche possède une table d'attributs : une ligne par territoire (une commune, un département), avec des colonnes qui le décrivent. Les statistiques, elles, arrivent souvent dans un fichier séparé, par exemple un tableau de recensement.
Le tutoriel du CNRS montre deux situations : la jointure d'une couche et d'une table, avec le recensement de la population au Kenya, et la jointure de deux couches, avec les licences sportives et les catégories socio-professionnelles en France.2 Dans les deux cas, on se base sur les données attributaires, et la première chose à faire est de choisir un champ clé commun aux deux ensembles.2
Erreurs fréquentes et méthode complète
Exercices corrigés
Exercice 1 Le total des clients de Lyon
★☆☆Environ 10 min
On reprend les tables CLIENT et COMMANDE du cours.
Écris la requête qui affiche le nom et le montant de chaque commande passée par un client de Lyon.
Calcule le total, en euros, des commandes de ces clients.
Indice 1
Il faut joindre CLIENT et COMMANDE sur id_client, puis filtrer sur la ville.
Indice 2
Les clients de Lyon sont Durand (clé 1) et Petit (clé 4).
Voir la correction pas à pas
On repère les deux tables nécessaires : CLIENT (pour la ville et le nom) et COMMANDE (pour le montant). Le champ clé est id_client.
On écrit la requête : SELECT cl.nom, co.montant FROM COMMANDE co INNER JOIN CLIENT cl ON co.id_client = cl.id_client WHERE cl.ville = 'Lyon';
Le filtre garde les clients Durand et Petit. Durand a deux commandes : 120 € et 45 €. Petit en a une : 200 €.
On additionne : 120+45+200=365 euros.
Le total des commandes des clients de Lyon est de 365 euros. On l'obtiendrait directement en remplaçant cl.nom, co.montant par SUM(co.montant).
Exercice 2 Produit cartésien ou jointure ?
★★☆Environ 10 min
Un élève écrit la requête suivante :
SELECT cl.nom, co.montant
FROM CLIENT cl, COMMANDE co;
La table CLIENT contient 4 lignes et la table COMMANDE en contient 5.
Combien de lignes cette requête renvoie-t-elle ?
Quelle erreur l'élève a-t-il commise ?
Corrige la requête et indique combien de lignes elle renvoie alors.
Indice 1
Sans condition de liaison, chaque ligne de la première table est associée à chaque ligne de la seconde.
Indice 2
Une jointure correcte renvoie une ligne par commande, car chaque commande a exactement un client.
Voir la correction pas à pas
Sans condition, la base forme toutes les paires possibles : une ligne de CLIENT avec une ligne de COMMANDE. Le nombre de lignes vaut 4×5=20.
L'erreur est l'oubli de la condition de jointure : rien ne dit que cl.id_client doit être égal à co.id_client.
On corrige : SELECT cl.nom, co.montant FROM CLIENT cl INNER JOIN COMMANDE co ON cl.id_client = co.id_client;
Chaque commande a un seul client correspondant, donc le résultat contient une ligne par commande, soit 5 lignes.
La requête fausse renvoie 20 lignes, dont 15 sont absurdes. La requête corrigée en renvoie 5. Quand un résultat est bien plus grand que prévu, vérifie la condition ON.
Exercice 3 Moyenne des grosses commandes et clients sans commande
★★★Environ 15 min
Toujours avec les tables CLIENT et COMMANDE.
Écris une requête qui calcule la moyenne des montants des commandes d'au moins 60 euros.
Calcule cette moyenne.
Écris une requête qui affiche le nom des clients n'ayant passé aucune commande, et donne son résultat.
Indice 1
Utilise AVG(montant) avec un WHERE montant >= 60.
Indice 2
Pour les clients sans commande, pars de CLIENT avec un LEFT JOIN et teste IS NULL sur un champ de COMMANDE.
Voir la correction pas à pas
Requête 1 : SELECT AVG(montant) FROM COMMANDE WHERE montant >= 60;
Les commandes qui passent le filtre sont 101 (120), 102 (80), 104 (200) et 105 (60). La commande 103 (45) est écartée.
On calcule la moyenne : 4120+80+200+60=4460=115 euros.
Requête 2 : SELECT cl.nom FROM CLIENT cl LEFT JOIN COMMANDE co ON cl.id_client = co.id_client WHERE co.id_commande IS NULL;
Seul le client 3 n'a aucune ligne correspondante dans COMMANDE : le résultat est Bernard.
La moyenne des commandes d'au moins 60 euros est de 115 euros, et le seul client sans commande est Bernard. Le LEFT JOIN suivi de IS NULL est le modèle à retenir pour chercher les éléments sans correspondance.
Quiz
8 questions · correction immédiate · ton score reste sur ton appareil.
id_client reprend dans COMMANDE la valeur de la clé primaire de CLIENT : c'est une clé étrangère, qui permet la jointure. Ce n'est pas la clé primaire de COMMANDE, car la même valeur se répète (le client 1 a deux commandes) ; la clé primaire de COMMANDE est id_commande.
ON précise quels champs comparer pour rapprocher les lignes des deux tables. ORDER BY trie le résultat et GROUP BY regroupe des lignes : aucun des deux ne relie des tables. HAVING filtre des groupes après agrégation.
Sans condition, chaque client est associé à chaque commande : 4×5=20 lignes. Le nombre 5 correspond à une jointure correcte, pas à ce produit cartésien : ici, rien ne limite les paires aux clients qui ont réellement passé la commande.
LEFT JOIN garde toutes les lignes de la table écrite après FROM, ici CLIENT, et met NULL quand il n'y a pas de commande. Un INNER JOIN élimine les lignes sans correspondance, donc Bernard disparaîtrait, quel que soit l'ordre des tables. GROUP BY ne relie pas de tables.
WHERE agit sur les lignes individuelles, avant GROUP BY ; HAVING agit sur les groupes, après le calcul de SUM, COUNT ou AVG. HAVING ne remplace pas ON, qui sert à relier des tables. Un agrégat ne peut pas être testé dans WHERE : pour un total, il faut HAVING SUM(montant) > 150.
Martin a passé les commandes 102 (80 €) et 105 (60 €), soit 80+60=140 euros. Le nombre 165 est le total de Durand, et 200 celui de Petit : il faut bien repérer le client avant d'additionner.
Vrai : en gestion, c'est le plus souvent le couple clé primaire / clé étrangère qui porte l'information commune aux deux tables et donne des correspondances correctes. Joindre deux champs sans lien logique, comme un numéro de client et un numéro de commande, est accepté par la base mais donne un résultat absurde.
Une valeur vide se teste avec IS NULL. L'écriture = NULL est tentante mais ne renvoie jamais de ligne, car NULL n'est égal à aucune valeur, pas même à lui-même. Les valeurs 0 et la chaîne vide sont des valeurs réelles, différentes de NULL.
Les questions qu'on se pose
Quelle est la différence entre une requête et une jointure ?
Une requête est la question posée à la base (afficher, filtrer, calculer). Une jointure est un moyen, à l'intérieur d'une requête, de rassembler les données de deux tables. Une requête peut s'écrire sans jointure (une seule table), mais une jointure se trouve toujours dans une requête.
Comment savoir quels champs utiliser pour joindre deux tables ?
Cherche la clé étrangère : c'est un champ d'une table qui reprend la clé primaire d'une autre. Dans notre base, id_client de COMMANDE renvoie à id_client de CLIENT. Le schéma relationnel donné dans un sujet indique d'ordinaire ces liens. Dans un SIG, on se pose la même question : quels champs clés relient la couche et la table ?2
Pourquoi mon résultat contient-il beaucoup trop de lignes ?
Le plus souvent, la condition de jointure manque ou porte sur le mauvais champ. La base fait alors toutes les combinaisons possibles : c'est le produit cartésien. Avec 4 clients et 5 commandes, on obtient 20 lignes au lieu de 5. Vérifie ta clause ON.
Quand choisir INNER JOIN, quand choisir LEFT JOIN ?
Choisis INNER JOIN quand tu ne veux que les éléments qui ont une correspondance (les clients qui ont commandé). Choisis LEFT JOIN quand tu veux garder tous les éléments de la table de gauche, même sans correspondance (tous les clients, avec ou sans commande), par exemple pour trouver ceux qui n'ont rien acheté.
Que dois-je savoir écrire de mémoire pour le bac ?
Entraîne-toi à lire et à écrire une requête complète : SELECT, FROM, JOIN … ON, WHERE, GROUP BY, ORDER BY. Sache aussi expliquer pourquoi un résultat est faux (condition manquante, mauvais champ clé). Ne retiens aucune règle de barème précise depuis ce cours : consulte les consignes officielles de ta session.