Les Quantificateurs en SQL
Explication Ultra-Détaillée Pas à Pas
Cours SQL Avancé
8 juin 2025
Table des matières
1 Introduction aux Quantificateurs 3
1.1 Correspondance Mathématiques - SQL . . . . . . . . . . . . . . . . . . . . 3
2 Quantificateur Existentiel : EXISTS 3
2.1 Définition Mathématique . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Syntaxe SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.3 Algorithme d’Exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.4 Exemple Détaillé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3 Quantificateur Universel : ALL 5
3.1 Définition Mathématique . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2 Syntaxe SQL Directe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.3 Exemple avec ALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
4 Quantificateur Universel avec NOT EXISTS 6
4.1 Principe de la Double Négation . . . . . . . . . . . . . . . . . . . . . . . . 6
4.2 Pattern de Division Relationnelle . . . . . . . . . . . . . . . . . . . . . . . 6
4.3 Exemple Ultra-Détaillé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
5 Quantificateur ANY/SOME 7
5.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
5.2 Exemple ANY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
6 Comparaison des Approches 8
7 Erreurs Communes et Solutions 8
7.1 Erreur 1 : Oubli de Corrélation . . . . . . . . . . . . . . . . . . . . . . . . 8
7.2 Erreur 2 : Gestion des Valeurs NULL . . . . . . . . . . . . . . . . . . . . . 9
7.3 Erreur 3 : Confusion ALL vs ANY . . . . . . . . . . . . . . . . . . . . . . 9
8 Méthode Infaillible en 6 Étapes 10
9 Exercices Pratiques 10
9.1 Exercice 1 : Clients Fidèles . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
9.2 Exercice 2 : Produits Universels . . . . . . . . . . . . . . . . . . . . . . . . 11
1
Cours Détaillé Quantificateurs SQL
10 Optimisation et Performance 11
10.1 Index Recommandés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
10.2 Conseils de Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
11 Conclusion 11
2
Cours Détaillé Quantificateurs SQL
1 Introduction aux Quantificateurs
Définition
Un quantificateur est un opérateur logique qui exprime une quantité ou une éten-
due. En mathématiques et en SQL, nous utilisons principalement deux types :
∃ : quantificateur existentiel (“il existe”) (1)
∀ : quantificateur universel (“pour tout”) (2)
(3)
1.1 Correspondance Mathématiques - SQL
Mathématiques SQL Signification
∃x : P (x) EXISTS Il existe au moins un
∀x : P (x) ALL Pour tous
∀x : P (x) NOT EXISTS + NOT Pour tous (alternative)
∃x : P (x) ANY/SOME Au moins un (comparaison)
2 Quantificateur Existentiel : EXISTS
2.1 Définition Mathématique
Définition
Soit E un ensemble et P (x) une propriété. On note :
∃x ∈ E : P (x)
qui se lit : “Il existe au moins un élément x dans E tel que la propriété P (x) soit
vraie.”
2.2 Syntaxe SQL
Listing 1 – Syntaxe générale EXISTS
1 SELECT colonnes
2 FROM table_principale
3 WHERE EXISTS (
4 SELECT 1
5 FROM table_secondaire
6 WHERE condition_de_liaison
7 );
3
Cours Détaillé Quantificateurs SQL
2.3 Algorithme d’Exécution
Méthode
Algorithme EXISTS :
1. Pour chaque ligne de la table principale
2. Exécuter la sous-requête avec les valeurs de la ligne courante
3. Si la sous-requête retourne au moins une ligne :
→ Inclure cette ligne dans le résultat
4. Sinon :
→ Exclure cette ligne du résultat
2.4 Exemple Détaillé
Exemple
Contexte : Tables clients et commandes
Question : Quels clients ont passé au moins une commande ?
Étape 1 - Formulation mathématique :
∃c ∈ Commandes : c.client_id = client.id
Étape 2 - Code SQL :
1 SELECT c . nom , c . email
2 FROM clients c
3 WHERE EXISTS (
4 SELECT 1
5 FROM commandes cmd
6 WHERE cmd . client_id = c . id
7 );
Étape 3 - Exécution manuelle :
— Client 1 (Jean) : Chercher dans commandes où client_id = 1
→ Trouvé 2 commandes ⇒ INCLUS
— Client 2 (Marie) : Chercher dans commandes où client_id = 2
→ Aucune commande ⇒ EXCLU
4
Cours Détaillé Quantificateurs SQL
3 Quantificateur Universel : ALL
3.1 Définition Mathématique
Définition
Soit E un ensemble et P (x) une propriété. On note :
∀x ∈ E : P (x)
qui se lit : “Pour tout élément x dans E, la propriété P (x) est vraie.”
3.2 Syntaxe SQL Directe
Listing 2 – Syntaxe ALL avec opérateur
1 SELECT colonnes
2 FROM table
3 WHERE colonne operateur ALL ( sous_requete ) ;
où operateur peut être : >, <, >=, <=, =, <>
3.3 Exemple avec ALL
Exemple
Question : Quels produits sont plus chers que TOUS les produits électroniques ?
Formulation mathématique :
∀pe ∈ Produits_Électroniques : prix > pe .prix
Code SQL :
1 SELECT nom , prix
2 FROM produits
3 WHERE prix > ALL (
4 SELECT prix
5 FROM produits
6 WHERE categorie = ’ lectronique ’
7 AND prix IS NOT NULL
8 );
Exécution manuelle :
— Sous-requête retourne : [100€, 200€, 300€]
— Pour chaque produit, vérifier : prix > 100 ET prix > 200 ET prix > 300
— Équivalent à : prix > MAX(100, 200, 300) = prix > 300€
5
Cours Détaillé Quantificateurs SQL
4 Quantificateur Universel avec NOT EXISTS
4.1 Principe de la Double Négation
Définition
En logique, nous avons l’équivalence :
∀x : P (x) ≡ ¬∃x : ¬P (x)
Traduction : “Pour tout x, P (x) est vrai” équivaut à “Il n’existe pas de x tel que
P (x) soit faux”.
4.2 Pattern de Division Relationnelle
Listing 3 – Template pour la division relationnelle
1 -- Trouver les X qui sont l i s TOUS les Y
2 SELECT x . id
3 FROM table_X x
4 WHERE NOT EXISTS (
5 SELECT y . id
6 FROM table_Y y
7 WHERE NOT EXISTS (
8 SELECT 1
9 FROM table_liaison l
10 WHERE l . x_id = x . id
11 AND l . y_id = y . id
12 )
13 );
6
Cours Détaillé Quantificateurs SQL
4.3 Exemple Ultra-Détaillé
Exemple
Question : Quels clients ont commandé TOUS les produits de la catégorie “Livre” ?
Reformulation : Quels clients pour lesquels il n’existe AUCUN livre qu’ils n’ont
pas commandé ?
Formulation mathématique :
¬∃l ∈ Livres : ¬∃c ∈ Commandes : (c.client_id = client.id) ∧ (c.produit_id = l.id)
Code SQL :
1 SELECT c . nom
2 FROM clients c
3 WHERE NOT EXISTS (
4 -- Il n ’ existe pas de livre ...
5 SELECT p . id
6 FROM produits p
7 WHERE p . categorie = ’ Livre ’
8 AND NOT EXISTS (
9 -- ... que ce client n ’ a pas c o m m a n d
10 SELECT 1
11 FROM commandes cmd
12 WHERE cmd . client_id = c . id
13 AND cmd . produit_id = p . id
14 )
15 );
Algorithme d’exécution pour un client donné :
1. Lister tous les livres : [Livre1, Livre2, Livre3]
2. Pour chaque livre :
— Vérifier si le client l’a commandé
— Si NON → STOP, ce client ne satisfait pas la condition
3. Si tous les livres ont été commandés → inclure ce client
5 Quantificateur ANY/SOME
5.1 Définition
Définition
ANY et SOME sont synonymes et équivalent à un EXISTS avec comparaison :
∃x ∈ E : valeur opérateur x
7
Cours Détaillé Quantificateurs SQL
5.2 Exemple ANY
Exemple
Question : Produits moins chers qu’au moins un produit de luxe
1 SELECT nom , prix
2 FROM produits
3 WHERE prix < ANY (
4 SELECT prix
5 FROM produits
6 WHERE categorie = ’ Luxe ’
7 );
Équivalence avec EXISTS :
1 SELECT nom , prix
2 FROM produits p1
3 WHERE EXISTS (
4 SELECT 1
5 FROM produits p2
6 WHERE p2 . categorie = ’ Luxe ’
7 AND p1 . prix < p2 . prix
8 );
6 Comparaison des Approches
Quantificateur Condition Équivalent Performance
EXISTS Au moins un IN (sans NULL) Excellente
ALL Tous (comparaison) MAX/MIN Bonne
NOT EXISTS Tous (liaison) Division relationnelle Variable
ANY/SOME Au moins un (comp.) EXISTS Bonne
7 Erreurs Communes et Solutions
7.1 Erreur 1 : Oubli de Corrélation
Attention
Code incorrect :
1 -- Pas de lien entre la r e q u t e principale et la sous -
requ te
2 WHERE EXISTS ( SELECT 1 FROM commandes WHERE total > 100)
Code correct :
1 -- C o r r l a t i o n avec la table principale
2 WHERE EXISTS ( SELECT 1 FROM commandes
3 WHERE client_id = c . id AND total > 100)
8
Cours Détaillé Quantificateurs SQL
7.2 Erreur 2 : Gestion des Valeurs NULL
Attention
Problème avec ALL :
— Si la sous-requête retourne des NULL, ALL peut retourner NULL
— Si la sous-requête est vide, ALL retourne TRUE
Solution :
1 WHERE prix > ALL (
2 SELECT prix
3 FROM produits
4 WHERE categorie = ’ Test ’
5 AND prix IS NOT NULL -- Filtrer les NULL
6 )
7 AND EXISTS ( -- V r i f i e r que la sous - r e q u t e n ’ est pas vide
8 SELECT 1 FROM produits WHERE categorie = ’ Test ’
9 );
7.3 Erreur 3 : Confusion ALL vs ANY
Pour “plus cher que le moins Pour “plus cher que le plus
cher” cher”
prix > ANY (sous-requête) prix > ALL (sous-requête)
≡ prix > MIN(...) ≡ prix > MAX(...)
9
Cours Détaillé Quantificateurs SQL
8 Méthode Infaillible en 6 Étapes
Méthode
Algorithme de résolution :
1. Traduire en français la question posée
— Identifier les mots-clés : “au moins un”, “tous”, “chaque”
2. Identifier le quantificateur approprié
— “Au moins un” → EXISTS ou ANY
— “Tous” → ALL ou NOT EXISTS
3. Écrire la logique en pseudo-code
— Décomposer la question en étapes simples
4. Convertir en SQL étape par étape
— Commencer par la sous-requête
— Ajouter les corrélations
5. Tester avec des données simples
— Exécution manuelle sur 2-3 exemples
6. Optimiser si nécessaire
— Ajouter des index
— Vérifier le plan d’exécution
9 Exercices Pratiques
9.1 Exercice 1 : Clients Fidèles
Question : Trouver les clients qui ont commandé chaque mois de 2024.
Solution :
1 SELECT c . nom
2 FROM clients c
3 WHERE NOT EXISTS (
4 SELECT m . numero_mois
5 FROM ( VALUES (1) ,(2) ,(3) ,(4) ,(5) ,(6) ,
6 (7) ,(8) ,(9) ,(10) ,(11) ,(12) ) AS m ( numero_mois )
7 WHERE NOT EXISTS (
8 SELECT 1
9 FROM commandes cmd
10 WHERE cmd . client_id = c . id
11 AND YEAR ( cmd . date_commande ) = 2024
12 AND MONTH ( cmd . date_commande ) = m . numero_mois
13 )
14 );
10
Cours Détaillé Quantificateurs SQL
9.2 Exercice 2 : Produits Universels
Question : Trouver les produits commandés par tous les clients.
Solution :
1 SELECT p . nom
2 FROM produits p
3 WHERE NOT EXISTS (
4 SELECT c . id
5 FROM clients c
6 WHERE NOT EXISTS (
7 SELECT 1
8 FROM commandes cmd
9 WHERE cmd . client_id = c . id
10 AND cmd . produit_id = p . id
11 )
12 );
10 Optimisation et Performance
10.1 Index Recommandés
Listing 4 – Création d’index pour les quantificateurs
1 -- Pour les jointures dans EXISTS
2 CREATE INDEX idx_co mmandes_cl ient_id ON commandes ( client_id ) ;
3 CREATE INDEX i dx _co mm an de_ pr od uit s_ id s
4 ON commande_produits ( commande_id , produit_id ) ;
5
6 -- Pour les conditions de filtrage
7 CREATE INDEX idx_produits_categorie ON produits ( categorie ) ;
8 CREATE INDEX idx_commandes_date ON commandes ( date_commande ) ;
9
10 -- Index c o m p o s s pour les r e q u t e s complexes
11 CREATE INDEX i dx _co mm an des _c li ent _d at e
12 ON commandes ( client_id , date_commande ) ;
10.2 Conseils de Performance
1. EXISTS vs IN : Préférer EXISTS pour les sous-requêtes corrélées
2. SELECT 1 vs SELECT * : Toujours utiliser SELECT 1 dans EXISTS
3. Filtrage précoce : Ajouter des conditions restrictives dans les sous-requêtes
4. Index appropriés : Créer des index sur les colonnes de jointure
5. EXPLAIN PLAN : Analyser le plan d’exécution pour les requêtes complexes
11 Conclusion
Les quantificateurs SQL permettent d’exprimer des requêtes complexes de manière
élégante et efficace. La maîtrise de ces concepts nécessite :
11
Cours Détaillé Quantificateurs SQL
— Une compréhension solide de la logique mathématique sous-jacente
— Une pratique régulière avec des exemples concrets
— Une attention particulière aux détails (corrélations, NULL, etc.)
— L’application systématique de la méthode en 6 étapes
Avec ces outils, vous serez capable de résoudre tous les problèmes de quantification en
SQL, même les plus complexes.
12