Parcours · SQL
Interroger une base en écrivant du vrai SQL
Chaque chapitre combine une explication concise, une requête à écrire sur une vraie base exécutée dans votre navigateur, et le schéma de la base sous les yeux.
142
leçons
22
modules
Ce parcours compte pour plusieurs certifications
Toutes les certifications- Analyste de données (Fondamentaux)15 leçons
- Analyste de données (Avancé)42 leçons
- Concepteur de bases de données (Fondamentaux)12 leçons
- Concepteur de bases de données (Avancé)23 leçons
- Data engineer (Fondamentaux)13 leçons
- Data engineer (Avancé)8 leçons
Chaque niveau demande des leçons de plusieurs parcours, puis un examen final corrigé sur nos serveurs. Le diagnostic et le plan de révision sont ouverts sans abonnement.
Certification Central Campus : ni diplôme d'État, ni certification professionnelle enregistrée au répertoire national.
Les bases du SQL
Découvrez comment lire et filtrer des données.
SELECT : lire des données
Afficher toutes les colonnes d'une table.
Ouvrir la leçonChoisir des colonnes
Sélectionner uniquement certaines colonnes.
Ouvrir la leçonWHERE : filtrer les résultats
Ne garder que les lignes qui correspondent à une condition.
Ouvrir la leçonORDER BY : trier
Ordonner les résultats par une ou plusieurs colonnes.
Ouvrir la leçonFiltrage avancé
Conditions composées, BETWEEN, IN, LIKE, NULL et négations, tri des NULL, DISTINCT, alias, LIMIT et pagination.
AND, OR et parenthèses
Combiner plusieurs conditions sans se tromper de priorité.
Ouvrir la leçonBETWEEN : intervalles
Filtrer entre deux valeurs, bornes incluses.
Ouvrir la leçonIN : liste de valeurs
Tester l'appartenance à une liste de valeurs.
Ouvrir la leçonLIKE : recherche par motif
Filtrer du texte avec les jokers % et _.
Ouvrir la leçonIS NULL / IS NOT NULL
Repérer les valeurs manquantes.
Ouvrir la leçonNOT, <> et le piège des NULL
Écrire des négations justes : NOT IN, NOT LIKE, NOT BETWEEN.
Ouvrir la leçonTrier des colonnes qui contiennent des NULL
Décider où placer les valeurs manquantes avec NULLS FIRST et NULLS LAST.
Ouvrir la leçonDISTINCT : valeurs uniques
Éliminer les doublons d'un résultat.
Ouvrir la leçonAlias de colonnes (AS)
Nommer les colonnes calculées du résultat.
Ouvrir la leçonLIMIT : garder les N premières lignes
Obtenir un top N fiable avec ORDER BY et LIMIT.
Ouvrir la leçonPagination avec LIMIT et OFFSET
Découper un résultat en pages stables.
Ouvrir la leçonFonctions et expressions
Calculs, arrondis et division entière, chaînes de caractères, NULL, CASE et dates : transformer chaque ligne sans jointure ni regroupement.
ROUND : calculer un prix TTC arrondi
Calculer une colonne dérivée ligne par ligne et l'arrondir au centime avec ROUND.
Ouvrir la leçonCAST et division entière
Éviter le piège de la division entière en SQLite pour calculer un taux de conversion juste.
Ouvrir la leçonConcaténation avec ||
Assembler colonnes et textes fixes en une seule chaîne avec ||, concat() et concat_ws().
Ouvrir la leçonUPPER et LOWER : normaliser la casse
Mettre des textes en majuscules ou en minuscules pour un export homogène, et connaître la limite des accents.
Ouvrir la leçonLENGTH : contrôler la longueur d'une chaîne
Repérer les saisies trop longues pour un champ limité avec LENGTH dans le SELECT et le WHERE.
Ouvrir la leçonSUBSTR, INSTR, REPLACE et TRIM
Découper et nettoyer du texte en SQL : séparer le prénom et le nom d'un salarié avec SUBSTR et INSTR.
Ouvrir la leçonCOALESCE, IFNULL et NULLIF
Remplacer un NULL affiché par une valeur lisible avec COALESCE et éviter une division par zéro avec NULLIF.
Ouvrir la leçonCASE WHEN : catégories d'âge
Créer des libellés conditionnels à trois tranches et comprendre pourquoi l'ordre des WHEN compte.
Ouvrir la leçonFonctions de date : date, strftime, julianday
Calculer mois, échéances et retards sur des dates ISO avec date(), strftime() et julianday() en SQLite.
Ouvrir la leçonAgrégations
Calculer des totaux, moyennes et compter des lignes.
Jointures et relations
Relier plusieurs tables grâce aux clés étrangères.
Modélisation de base de données
Comprendre les relations entre tables.
Jointures avancées
Alias et jointures multiples, anti-jointure, filtre dans ON ou dans WHERE, RIGHT et FULL OUTER JOIN, produit cartésien et jointures sur une inégalité.
Alias de tables et jointure à trois tables
Nommer chaque table par un alias court pour écrire une jointure à trois tables lisible.
Ouvrir la leçonTraverser quatre tables : qui a acheté quoi ?
Enchaîner trois jointures pour relier clients, commandes, lignes de commande et produits.
Ouvrir la leçonDétail d'une commande et montant par ligne
Joindre la table de détail aux produits et calculer le montant de chaque ligne de commande.
Ouvrir la leçonTable de liaison N-N et filtre de date
Traverser une table de liaison N-N et ne garder que les inscriptions tardives.
Ouvrir la leçonProfesseurs, matières et classes
Partir de la table référencée pour lister chaque professeur avec sa matière et sa classe.
Ouvrir la leçonJointure filtrée sur deux critères
Filtrer le résultat d'une jointure multiple sur des colonnes venant de tables différentes.
Ouvrir la leçonAnti-jointure : les classes sans élève
Combiner LEFT JOIN et IS NULL pour trouver les lignes qui n'ont aucune correspondance.
Ouvrir la leçonINNER JOIN ou LEFT JOIN : mesurer la différence
Compter les lignes produites par une jointure interne et par une jointure externe gauche.
Ouvrir la leçonLEFT JOIN : filtrer dans ON ou dans WHERE
Placer un filtre dans ON pour garder les lignes sans correspondance, au lieu de les perdre dans WHERE.
Ouvrir la leçonRIGHT JOIN et FULL OUTER JOIN : rapprocher deux listes
Rapprocher deux tables qui ont des absents de chaque côté avec FULL OUTER JOIN et COALESCE.
Ouvrir la leçonCROSS JOIN : générer toutes les combinaisons
Produire une grille de combinaisons avec CROSS JOIN, puis repérer celles qui n'existent pas.
Ouvrir la leçonJointure sur une inégalité (non-équi)
Écrire une condition de jointure avec <= pour associer chaque acheteur aux biens de son budget.
Ouvrir la leçonAgrégations avancées
MIN, MAX, COUNT DISTINCT, GROUP BY multi-colonnes, HAVING, agrégation conditionnelle et GROUP_CONCAT sur des cas de reporting.
MIN et MAX
Trouver les prix extrêmes du catalogue pour cadrer une grille tarifaire.
Ouvrir la leçonCOUNT DISTINCT
Compter des valeurs uniques pour mesurer la couverture géographique des clients.
Ouvrir la leçonGROUP BY sur deux colonnes
Regrouper les commandes par client et par statut pour suivre le service client.
Ouvrir la leçonSUM sur order_items
Totaliser les quantités vendues par produit pour piloter le réassort.
Ouvrir la leçonHAVING : filtrer les groupes
Ne garder que les clients qui ont commandé plus d'une fois, pour un programme de fidélité.
Ouvrir la leçonHAVING avec AVG
Repérer les catégories dont le prix moyen dépasse 100 € pour la vitrine premium.
Ouvrir la leçonWHERE et HAVING dans la même requête
Filtrer les lignes puis les groupes : rendez-vous terminés par service hospitalier.
Ouvrir la leçonORDER BY sur un agrégat
Classer les classes par effectif décroissant, sans les classes vides.
Ouvrir la leçonAgrégation conditionnelle
Compter plusieurs cas dans la même ligne avec SUM(CASE …) ou FILTER : un tableau croisé de statuts.
Ouvrir la leçonChiffre d'affaires par client
Jointures et SUM arrondi pour classer les clients par chiffre d'affaires.
Ouvrir la leçonUnités vendues et commandes par produit
Distinguer unités vendues et nombre de commandes par produit avec SUM et COUNT DISTINCT.
Ouvrir la leçonMoyenne du montant d'une commande
Agréger en deux étapes : le montant de chaque commande, puis le panier moyen arrondi.
Ouvrir la leçonGROUP_CONCAT et string_agg
Concaténer les valeurs d'un groupe en une liste triée : les livres empruntés par chaque membre.
Ouvrir la leçonModélisation avancée
Clés primaires et candidates, clés étrangères déclarées, tables de liaison N-N et normalisation, vérifiées par des requêtes.
Clés primaires et clés candidates
Vérifier par le calcul quelles colonnes identifient une ligne de façon unique.
Ouvrir la leçonLire les clés étrangères déclarées
Interroger le catalogue de SQLite pour cartographier les relations d'une base.
Ouvrir la leçonModèle N-N : exploiter order_items
Traverser une table de liaison pour résumer chaque commande.
Ouvrir la leçonTable de liaison enrollments
Repérer les élèves inscrits dans plusieurs classes grâce au modèle N-N.
Ouvrir la leçonNormalisation : détecter les anomalies
Repérer les incohérences d'une table plate et comprendre les formes normales.
Ouvrir la leçonSous-requêtes
Requêtes imbriquées : valeur scalaire, liste avec IN et NOT IN, table dérivée dans le FROM et sous-requêtes corrélées.
Sous-requête scalaire : égaler le maximum
Comparer chaque ligne à une valeur calculée par une sous-requête, et garder tous les ex æquo.
Ouvrir la leçonPrix supérieur à la moyenne
Filtrer les lignes au-dessus d'une moyenne calculée par une sous-requête non corrélée, évaluée une seule fois.
Ouvrir la leçonSous-requête dans le SELECT : écart au plus cher
Ajouter à chaque ligne une colonne calculée par une sous-requête scalaire placée dans le SELECT, ici l'écart au produit le plus cher.
Ouvrir la leçonIN avec sous-requête
Filtrer avec IN sur une liste de valeurs calculée par une sous-requête, sans les doublons qu'une jointure produirait.
Ouvrir la leçonIN avec sous-requête filtrée
Filtrer et joindre à l'intérieur de la sous-requête d'un IN pour répondre à une question qui traverse plusieurs tables.
Ouvrir la leçonNOT IN : clients sans commande
Exclure les valeurs d'une sous-requête avec NOT IN, et comprendre pourquoi un seul NULL dans la liste vide toujours le résultat.
Ouvrir la leçonTable dérivée : une sous-requête dans le FROM
Utiliser le résultat d'une sous-requête comme une table, avec un alias, pour agréger en deux étapes : montant par commande puis comparaison.
Ouvrir la leçonSous-requête corrélée : comparer à son groupe
Écrire une sous-requête qui dépend de la ligne externe pour comparer chaque salarié à la moyenne de son propre département.
Ouvrir la leçonSous-requête corrélée dans le SELECT
Calculer une statistique par ligne avec une sous-requête scalaire corrélée dans le SELECT, en gardant les lignes sans correspondance.
Ouvrir la leçonEnsembles et jointures avancées
Opérateurs ensemblistes (UNION, UNION ALL, INTERSECT, EXCEPT), sous-requêtes corrélées EXISTS / NOT EXISTS et auto-jointures (SELF JOIN).
UNION et UNION ALL
Empiler les résultats de deux SELECT compatibles dans une seule liste.
Ouvrir la leçonINTERSECT et EXCEPT
Calculer l'intersection et la différence de deux ensembles de résultats.
Ouvrir la leçonEXISTS et NOT EXISTS
Tester l'absence de lignes liées avec une sous-requête corrélée NOT EXISTS.
Ouvrir la leçonSELF JOIN
Joindre une table à elle-même avec deux alias pour comparer ses lignes entre elles.
Ouvrir la leçonManipulation des données
INSERT, UPDATE et DELETE en sécurité, puis INSERT … SELECT, mises à jour et suppressions par sous-requête, et UPSERT.
INSERT : ajouter un élève
Ajouter une ligne dans une table en respectant ses colonnes obligatoires.
Ouvrir la leçonINSERT avec colonnes explicites
Préciser les colonnes à renseigner pour un INSERT robuste.
Ouvrir la leçonUPDATE : modifier l'âge
Changer une valeur existante sans toucher aux autres lignes.
Ouvrir la leçonUPDATE : ajuster un prix
Modifier le prix d'un produit identifié par sa clé primaire.
Ouvrir la leçonDELETE : supprimer une inscription
Retirer une ligne précise d'une table de liaison.
Ouvrir la leçonINSERT … SELECT : copier des lignes calculées
Créer une table de synthèse et la remplir à partir d'une requête.
Ouvrir la leçonUPDATE piloté par une sous-requête
Modifier les lignes choisies d'après le contenu d'une autre table.
Ouvrir la leçonDELETE en cascade manuelle : l'ordre compte
Supprimer des lignes enfants puis leurs parents à l'aide d'une sous-requête.
Ouvrir la leçonUPSERT : insérer ou mettre à jour
Synchroniser un catalogue avec INSERT … ON CONFLICT DO UPDATE.
Ouvrir la leçonStructure, contraintes et transactions
CREATE TABLE et contraintes, ALTER, clés étrangères en cascade, transactions, vues, index et plan d'exécution, colonnes JSON.
CREATE TABLE et contraintes
Déclarer PRIMARY KEY, NOT NULL, UNIQUE, CHECK et DEFAULT, puis les voir filtrer des insertions.
Ouvrir la leçonALTER TABLE et DROP : faire évoluer un schéma
Ajouter, renommer et supprimer des colonnes, supprimer une table sans risque.
Ouvrir la leçonClés étrangères et ON DELETE CASCADE
Activer les clés étrangères dans SQLite et supprimer un parent avec ses enfants.
Ouvrir la leçonTransactions : BEGIN, COMMIT, ROLLBACK, SAVEPOINT
Rendre un virement atomique et annuler une seule étape avec un point de sauvegarde.
Ouvrir la leçonVues : enregistrer une requête
Créer une vue de chiffre d'affaires et constater qu'elle suit les données.
Ouvrir la leçonIndex et plan d'exécution
Créer un index et vérifier avec EXPLAIN QUERY PLAN que le moteur l'utilise.
Ouvrir la leçonColonnes JSON : json_extract et ->>
Lire des attributs produits stockés en JSON et les croiser avec une table classique.
Ouvrir la leçonSQL avancé
Premières fonctions de fenêtrage (classements, LAG et LEAD) et expressions de table communes : WITH, CTE multiples et CTE récursives.
ROW_NUMBER, RANK et DENSE_RANK
Classer des lignes avec une fonction de fenêtrage et comprendre comment ROW_NUMBER, RANK et DENSE_RANK traitent les ex æquo.
Ouvrir la leçonLAG et LEAD : la ligne d'avant, la ligne d'après
Lire la valeur de la ligne précédente ou suivante avec LAG et LEAD, puis calculer un écart en jours entre deux commandes.
Ouvrir la leçonCTE (WITH) : nommer une étape
Nommer un calcul intermédiaire avec WITH pour écrire une requête en étapes lisibles : chiffre d'affaires par client, puis filtre.
Ouvrir la leçonCTE multiples : enchaîner les étapes
Enchaîner plusieurs CTE dans un même WITH, où la seconde lit la première, et réutiliser une CTE à deux endroits de la requête.
Ouvrir la leçonCTE récursive : générer un calendrier
Générer une suite de mois avec WITH RECURSIVE, puis la joindre aux commandes pour compter aussi les mois sans activité.
Ouvrir la leçonCTE récursive : parcourir un organigramme
Parcourir un organigramme avec WITH RECURSIVE : le niveau hiérarchique de chaque salarié et son chemin complet depuis la direction.
Ouvrir la leçonFonctions de fenêtrage analytiques
Cumuls, moyennes mobiles, parts du total, top N par groupe, dédoublonnage et comparaison au meilleur : les requêtes analytiques du quotidien.
Cumul : SUM() OVER (ORDER BY …)
Calculer un chiffre d'affaires cumulé mois après mois avec une somme glissante SUM() OVER (ORDER BY …), sans perdre le détail mensuel.
Ouvrir la leçonMoyenne mobile : ROWS BETWEEN
Lisser une série quotidienne avec une moyenne mobile sur trois jours (ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) et éviter de filtrer trop tôt.
Ouvrir la leçonPart du total : SUM() OVER ()
Calculer la part de chaque catégorie dans le chiffre d'affaires avec une fenêtre vide OVER (), sans sous-requête ni second passage.
Ouvrir la leçonTop N par groupe
Garder les deux meilleurs salaires de chaque département : ROW_NUMBER partitionné dans une CTE, puis filtre sur le rang dans la requête externe.
Ouvrir la leçonDédoublonner avec ROW_NUMBER
Garder une seule ligne par entité, la plus récente, avec ROW_NUMBER() OVER (PARTITION BY … ORDER BY … DESC) et un critère de départage.
Ouvrir la leçonFIRST_VALUE et NTILE : se situer dans le groupe
Comparer chaque salarié au mieux payé de son département avec FIRST_VALUE et MAX() OVER, puis répartir l'effectif en tranches avec NTILE.
Ouvrir la leçonCas pratiques
Requêtes complètes tirées de situations réelles : jointures, filtres, agrégats, contrôle qualité et sécurité des requêtes.
Inscriptions par classe encadrée
Deux jointures aux rôles opposés : écarter les classes sans professeur, garder celles sans inscription.
Ouvrir la leçonMeilleur client par chiffre d'affaires
Calculer le chiffre d'affaires par client hors commandes annulées et garder le premier.
Ouvrir la leçonBilan scolaire par matière
Traverser professeurs, classes et élèves pour un bilan par matière : effectif et âge moyen.
Ouvrir la leçonÉchauffement : filtre et double tri
Échauffement avant les cas complets : filtrer une fourchette de prix et trier sur deux clés.
Ouvrir la leçonFiche complète élève-classe-prof
Enchaîner trois tables par leurs clés étrangères pour produire un annuaire trié.
Ouvrir la leçonContrôle qualité des données en une requête
Mesurer les valeurs manquantes, les doublons et les incohérences d'une base en une seule requête de contrôle.
Ouvrir la leçonInjection SQL et requêtes paramétrées
Voir une injection SQL réussir sur une requête concaténée, puis comprendre pourquoi un paramètre lié la neutralise.
Ouvrir la leçonCas pratique : hôpital
Pilotez l'activité d'un hôpital avec SQL : charge des médecins sur un trimestre, file active d'un service, palmarès et coût des prescriptions, médecins sans planning et délai entre deux rendez-vous. Jointures externes, chaînes de jointures, NOT EXISTS, LAG et dates sur le jeu de données hôpital.
Charge des médecins : rendez-vous du premier trimestre
Compter les rendez-vous de chaque médecin sur une période, sans perdre ceux qui n'en ont aucun : LEFT JOIN, filtre dans le ON et COUNT(a.id).
Ouvrir la leçonFile active d'un service : les patients de Cardiologie
Remonter du patient au service par une chaîne de jointures appointments → doctors → departments, puis dédoublonner avec DISTINCT.
Ouvrir la leçonPharmacie : les médicaments les plus prescrits
Classer les médicaments par nombre de prescriptions avec JOIN, GROUP BY et un tri à deux critères qui départage les ex æquo.
Ouvrir la leçonPharmacie : coût estimé des traitements par service
Additionner prix unitaire × durée de traitement par service en traversant quatre jointures, puis arrondir la somme avec ROUND.
Ouvrir la leçonPlanning : les médecins sans rendez-vous planifié
Détecter une absence de lignes liées avec NOT EXISTS : les médecins qui n'ont aucun rendez-vous au statut 'planifié'.
Ouvrir la leçonParcours patient : délai entre deux rendez-vous (LAG)
Retrouver le rendez-vous précédent de chaque patient avec LAG … OVER (PARTITION BY), calculer l'écart en jours avec julianday et filtrer le résultat d'une fenêtre via une CTE.
Ouvrir la leçonCas pratique : cinéma
Pilotez l'exploitation d'un cinéma : casting via la table de liaison N-N film_actors, programmation des salles, recette par film, films les plus diffusés et taux de remplissage des séances. JOIN, LEFT JOIN, GROUP BY, SUM, HAVING et division décimale sur des données réelles.
Casting : films et acteurs (N-N)
Relier films et acteurs via la table de liaison film_actors avec une double jointure.
Ouvrir la leçonProgrammation : nombre de séances par salle
Compter les séances de chaque salle avec un JOIN et GROUP BY, puis trier sur deux critères.
Ouvrir la leçonRecette billetterie par film
Calculer la recette de chaque film en remontant tickets → screenings → films, chaque billet rapportant le prix de sa séance.
Ouvrir la leçonFilms diffusés plus d'une fois (HAVING)
Filtrer les groupes avec HAVING COUNT > 1 pour isoler les films programmés dans plusieurs séances.
Ouvrir la leçonExploitation : taux de remplissage des séances
Rapporter les billets vendus à la capacité de la salle en pourcentage, sans perdre les séances vides (LEFT JOIN) ni tomber dans la division entière.
Ouvrir la leçonCas pratique : bibliothèque
Un projet métier complet sur le jeu de données bibliothèque : relation N-N livre/auteur, activité des membres, fonds dormant, retours en retard et emprunts en retard à une date d'inventaire, avec les fonctions de date de SQLite.
Catalogue : livres et leurs auteurs (N-N)
Reconstituer le catalogue en reliant chaque livre à son auteur via la table de liaison book_authors.
Ouvrir la leçonActivité : nombre d'emprunts par membre
Mesurer l'activité de chaque adhérent en comptant ses emprunts (jointure loans ↔ members puis GROUP BY).
Ouvrir la leçonFonds dormant : livres jamais empruntés
Détecter les ouvrages du catalogue qui n'ont jamais été empruntés (anti-jointure LEFT JOIN … IS NULL).
Ouvrir la leçonGestion des retards : rendus hors délai
Identifier les emprunts rendus après leur échéance et calculer le nombre de jours de dépassement avec julianday().
Ouvrir la leçonRelances : emprunts en retard à une date d'inventaire
Lister les emprunts non rendus dont l'échéance est dépassée à une date de référence fixe, et calculer le retard en jours avec julianday.
Ouvrir la leçonCas pratique : immobilier
Pilotez une agence immobilière en SQL : biens par agent, visites, offres reçues, biens sans offre et écart entre la meilleure offre et le prix affiché. Jointures, GROUP BY, agrégats multiples, anti-jointure et pourcentages arrondis sur le jeu de données immobilier.
Portefeuille : biens gérés par agent
Joindre properties et agents, puis compter les biens de chaque agent en groupant par la clé et les colonnes affichées.
Ouvrir la leçonActivité : visites par bien
Joindre viewings et properties pour mesurer l'intérêt suscité par chaque bien.
Ouvrir la leçonNégociation : offres reçues par bien
Agréger les offres par bien : nombre, montant maximal et montant moyen arrondi, dans une seule requête.
Ouvrir la leçonInvendus : biens sans aucune offre
Détecter les biens qui n'ont reçu aucune offre avec une anti-jointure LEFT JOIN … IS NULL.
Ouvrir la leçonNégociation : écart entre la meilleure offre et le prix affiché
Comparer la meilleure offre encore valable au prix demandé, en pourcentage arrondi : MAX, filtre de statut et calcul décimal.
Ouvrir la leçonCas pratique : entreprise
Mise en situation RH sur le jeu de données entreprise : agrégations par département, affectations N-N projets/employés, auto-jointure managériale, employés sans subordonné, salaire comparé à la moyenne du département (fonction de fenêtre) et organigramme complet par CTE récursive.
Effectif et masse salariale par département
Joindre employés et départements, puis agréger l'effectif, la masse salariale et le salaire moyen arrondi.
Ouvrir la leçonAffectations projets ↔ employés (relation N-N)
Traverser la table d'association assignments par une double jointure pour lister qui travaille sur quel projet en cours.
Ouvrir la leçonSELF JOIN : chaque employé et son manager
Auto-jointure de la table employees sur elle-même pour afficher le nom du manager de chaque employé, PDG inclus.
Ouvrir la leçonEmployés sans subordonné (NOT EXISTS)
Identifier les employés que personne n'a comme manager, à l'aide d'une sous-requête corrélée NOT EXISTS sur la table elle-même.
Ouvrir la leçonÉquité salariale : salaire comparé à la moyenne du département
Afficher à côté de chaque salaire la moyenne de son département avec AVG() OVER (PARTITION BY), sans perdre le détail des lignes, puis calculer l'écart.
Ouvrir la leçonOrganigramme complet : CTE récursive depuis la PDG
Parcourir toute la hiérarchie depuis la PDG avec WITH RECURSIVE, en calculant le niveau et le chemin hiérarchique de chaque employé.
Ouvrir la leçonCas d'examen
Cas d'examen chronométrables : un énoncé long et précis, une requête complète à écrire en temps limité, comme le jour de l'épreuve.
Cas d'examen : tableau des effectifs
Sujet en plusieurs étapes : effectif de chaque classe avec son professeur, classes vides et classes sans professeur comprises.
Ouvrir la leçonCas d'examen : reporting boutique
Top 3 des produits les plus vendus avec quantité et chiffre d'affaires arrondi, hors commandes annulées.
Ouvrir la leçonCas d'examen : agrégat comparé à une moyenne
Clients dont le chiffre d'affaires dépasse le chiffre d'affaires moyen par client : HAVING et sous-requête.
Ouvrir la leçonCas d'examen : ventes mensuelles
Chiffre d'affaires et panier moyen par mois avec strftime, commandes livrées seulement, mois triés.
Ouvrir la leçonCas d'examen : les clients sans commande livrée
Anti-jointure avec condition : NOT EXISTS ou LEFT JOIN … IS NULL, puis un comptage par ville.
Ouvrir la leçonCas d'examen : top 2 par catégorie avec ex æquo
Classer les villes par catégorie avec DENSE_RANK, garder les deux premiers niveaux, ex æquo compris.
Ouvrir la leçonCas d'examen : mise à jour ciblée et contrôle
UPDATE conditionnel avec sous-requête, puis requête de contrôle de la masse salariale par département.
Ouvrir la leçon