SQL avancé

SQL avancé : jointures, agrégats, GROUP BY/HAVING, sous-requêtes, mises à jour et transactions, illustrés par un tableau de bord commercial.

Rédigé par l'équipe éditoriale de RévisionBac d'après le programme officiel · Mis à jour le · Méthodologie

Se connecter pour contribuerPublié le · Dernière mise à jour le

En clair. Les requêtes avancées croisent plusieurs tables et calculent des totaux par groupe.

Ce qu'on te demande au bac STMG : utiliser jointures, GROUP BY et fonctions d'agrégat pour répondre à une question de gestion.

Exemple simple. Le chiffre d'affaires par vendeur s'obtient par un regroupement sur le vendeur.

1. Rappels de vocabulaire

  • SGBDR : système de gestion de bases de données relationnelles (MySQL, PostgreSQL, SQLite).
  • Table : ensemble de lignes (enregistrements) décrites par des attributs (colonnes).
  • Clé primaire : attribut qui identifie une ligne de façon unique.
  • Clé étrangère : attribut qui référence la clé primaire d'une autre table et garantit l'intégrité référentielle.
  • SQL se décompose en LDD (CREATE, ALTER, DROP) et LMD (SELECT, INSERT, UPDATE, DELETE).

2. Structure d'une requête d'interrogation

SELECT   colonnes / fonctions
FROM     table
JOIN     autre_table ON condition
WHERE    condition sur les lignes
GROUP BY colonnes
HAVING   condition sur les groupes
ORDER BY colonnes ASC|DESC
LIMIT    n;

L'ordre logique d'exécution est FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY : c'est pourquoi un alias défini dans le SELECT n'est pas utilisable dans le WHERE.

3. Les jointures

  • INNER JOIN : uniquement les lignes ayant une correspondance dans les deux tables.
  • LEFT JOIN : toutes les lignes de la table de gauche, complétées par NULL à droite si aucune correspondance — indispensable pour repérer les clients sans commande.
  • Auto-jointure : une table jointe à elle-même (hiérarchie salarié/manager).
SELECT c.nom, COUNT(cmd.id) AS nb_commandes
FROM   client c
LEFT JOIN commande cmd ON cmd.client_id = c.id
GROUP BY c.id, c.nom
ORDER BY nb_commandes DESC;

4. Agrégats et regroupements

Fonctions : COUNT(), SUM(), AVG(), MIN(), MAX().

SELECT   p.categorie,
         COUNT(*)          AS nb,
         ROUND(AVG(p.prix),2) AS prix_moyen,
         SUM(p.stock * p.prix) AS valeur_stock
FROM     produit p
GROUP BY p.categorie
HAVING   COUNT(*) >= 3
ORDER BY valeur_stock DESC;

Règle d'or : WHERE filtre les lignes avant regroupement, HAVING filtre les groupes après.

5. Sous-requêtes

-- Produits plus chers que la moyenne générale
SELECT nom, prix FROM produit
WHERE prix > (SELECT AVG(prix) FROM produit);

-- Clients ayant commandé en 2026
SELECT nom FROM client
WHERE id IN (SELECT client_id FROM commande
             WHERE date_cmd >= '2026-01-01');

6. Mises à jour et transactions

INSERT INTO commande (client_id, date_cmd, montant)
VALUES (12, '2026-03-04', 249.90);

UPDATE produit SET prix = prix * 1.05 WHERE categorie = 'Textile';

DELETE FROM commande WHERE montant IS NULL;

Une transaction (BEGIN … COMMIT / ROLLBACK) garantit les propriétés ACID : atomicité, cohérence, isolation, durabilité. Un virement bancaire (débit + crédit) doit être atomique, sinon de l'argent disparaît.

7. Cas de gestion : tableau de bord commercial

Objectif : chiffre d'affaires mensuel par commercial.

SELECT   s.nom,
         STRFTIME('%Y-%m', c.date_cmd) AS mois,
         SUM(c.montant) AS ca
FROM     commande c
JOIN     salarie s ON s.id = c.salarie_id
WHERE    c.date_cmd >= '2026-01-01'
GROUP BY s.nom, mois
ORDER BY mois, ca DESC;

Ce résultat alimente un tableau croisé et le calcul d'écarts par rapport aux objectifs (contrôle de gestion).

8. Erreurs fréquentes

  • Oublier la condition de jointure → produit cartésien (des milliers de lignes fausses).
  • Mettre un agrégat dans le WHERE au lieu du HAVING.
  • Utiliser = NULL au lieu de IS NULL.
  • Exécuter un UPDATE ou DELETE sans WHERE : toute la table est modifiée.

À retenir

  • Un SELECT complet suit l'ordre FROM/WHERE/GROUP BY/HAVING/SELECT/ORDER BY.
  • INNER JOIN = intersection, LEFT JOIN = tout à gauche.
  • WHERE avant regroupement, HAVING après ; transactions pour l'intégrité.

Sources et références

Ce cours est rédigé par l'équipe RévisionBac à partir du programme officiel et des sources institutionnelles ci-dessous. Elles permettent de vérifier les définitions, les chiffres et les normes citées.

  1. 1.Programmes et ressources du lycée général et technologique — Éduscol — Ministère de l'Éducation nationale
  2. 2.Bulletin officiel de l'Éducation nationale (programmes du baccalauréat) — education.gouv.fr
  3. 3.Protection des données personnelles (RGPD) — CNIL
  4. 4.Bonnes pratiques de cybersécurité — ANSSI
  5. 5.Textes de loi et jurisprudence — Légifrance

Contenu vérifié et mis à jour le 09/09/2026. Les liens renvoient vers les sites officiels des éditeurs cités.

Historique éditorial

Ce chapitre est rédigé et relu par l'équipe RévisionBac, puis enrichi par les contributions validées.

  1. — Dernière mise à jour du cours (relecture et enrichissement)
  2. — Première publication de la fiche de cours