SQL : jointures, agrégations et sous-requêtes
Informatique de gestion · Bachelor 2
Interroger une base relationnelle avec SQL : jointures, GROUP BY, HAVING et sous-requêtes.
Introduction
SQL (Structured Query Language) est le langage standard d'interrogation et de manipulation des bases de données relationnelles. Une requête SELECT décrit le résultat voulu (déclaratif) et le moteur choisit le plan d'exécution. Les clauses s'écrivent dans l'ordre SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, mais sont évaluées dans un ordre logique différent : FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY.
Les jointures combinent plusieurs tables : INNER JOIN ne garde que les lignes qui se correspondent des deux côtés, LEFT JOIN conserve toutes les lignes de la table de gauche avec NULL en l'absence de correspondance. Les fonctions d'agrégation (COUNT, SUM, AVG, MIN, MAX) résument des groupes de lignes définis par GROUP BY ; HAVING filtre les groupes, alors que WHERE filtre les lignes avant le regroupement.
En gestion, ces requêtes alimentent les rapports : chiffre d'affaires par client en CHF, clients sans commande, articles les plus vendus. Une attention particulière est requise pour les valeurs NULL, dont la comparaison suit une logique à trois valeurs.
Objectifs d'apprentissage
- Écrire une requête SELECT avec filtre, tri et regroupement
- Choisir entre INNER JOIN et LEFT JOIN selon le besoin
- Distinguer WHERE et HAVING
- Utiliser les fonctions d'agrégation avec GROUP BY
- Traiter correctement les valeurs NULL
Concepts clés
- INNER JOIN
- Retourne uniquement les lignes pour lesquelles la condition de jointure est satisfaite dans les deux tables.
- LEFT JOIN
- Retourne toutes les lignes de la table de gauche, avec NULL pour les colonnes de droite sans correspondance. Utile pour trouver les clients sans commande (WHERE colonne_droite IS NULL).
- GROUP BY et fonctions d'agrégation
- GROUP BY regroupe les lignes ; COUNT, SUM, AVG, MIN, MAX calculent un résultat par groupe. Toute colonne non agrégée du SELECT doit figurer dans GROUP BY.
- WHERE versus HAVING
- WHERE filtre les lignes avant regroupement ; HAVING filtre les groupes après agrégation.
- Valeurs NULL et sous-requêtes
- NULL signifie « inconnu » : on le teste avec IS NULL, jamais avec = NULL. Une sous-requête peut servir de filtre (IN, EXISTS) ou de table dérivée.
Conclusion
Maîtriser SQL, c'est savoir exprimer précisément quelles données on veut, en combinant jointures, filtres et agrégats. La distinction WHERE/HAVING et le traitement de NULL sont des sources d'erreurs courantes à surveiller.
Ces compétences sont directement mobilisées dans le reporting et l'analyse de données d'entreprise.
Cartes
- Quel est l'ordre d'écriture des principales clauses d'une requête SELECT ?
- SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY.
- Quelle différence entre INNER JOIN et LEFT JOIN ?
- INNER JOIN ne garde que les correspondances ; LEFT JOIN garde toutes les lignes de gauche, avec NULL à droite en l'absence de correspondance.
- Comment lister les clients qui n'ont jamais passé de commande ?
- LEFT JOIN de Client vers Commande, puis WHERE Commande.NoCommande IS NULL (ou NOT EXISTS).
- À quoi sert GROUP BY ?
- À regrouper des lignes partageant les mêmes valeurs pour calculer des agrégats par groupe.
- Quelle différence entre WHERE et HAVING ?
- WHERE filtre les lignes avant le regroupement ; HAVING filtre les groupes selon une condition sur un agrégat.
- Que fait COUNT(*) par rapport à COUNT(colonne) ?
- COUNT(*) compte toutes les lignes ; COUNT(colonne) ignore les valeurs NULL de cette colonne.
- Comment tester une valeur NULL ?
- Avec IS NULL ou IS NOT NULL ; une comparaison avec = NULL ne retourne jamais vrai.
- Qu'est-ce qu'une sous-requête ?
- Une requête imbriquée dans une autre, par exemple dans WHERE avec IN ou EXISTS, ou dans FROM comme table dérivée.
- Quelle requête donne le total des ventes par client ?
- SELECT CodeClient, SUM(Montant) FROM Vente GROUP BY CodeClient;
- Quel est l'effet de DISTINCT ?
- Il supprime les lignes en doublon du résultat.
Glossaire
- SELECT
- Instruction qui extrait des données d'une ou plusieurs tables.
- Jointure
- Opération qui combine des lignes de deux tables selon une condition.
- Agrégat
- Fonction qui calcule une valeur unique à partir d'un ensemble de lignes.
- HAVING
- Clause filtrant les groupes après agrégation.
- NULL
- Marqueur de valeur inconnue ou absente, différent de zéro et de la chaîne vide.
- Sous-requête
- Requête incluse dans une autre requête.