Ce guide vous accompagne dans la découverte et la maîtrise des opérations ensemblistes SQL (EXCEPT, UNION ALL, INTERSECT) à travers une série d'exercices pratiques comparant DuckDB et SQLite.
À la fin de ce parcours, vous serez capable de :
- ✅ Comprendre les 3 opérations ensemblistes et leurs cas d'usage
- ✅ Identifier quand utiliser EXCEPT vs UNION ALL vs INTERSECT
- ✅ Comparer les performances DuckDB vs SQLite sur des volumes réalistes
- ✅ Optimiser vos requêtes avec des filtres WHERE stratégiques (gains 8-25x)
- ✅ Réaliser des audits de données et détections d'anomalies
- ✅ Comprendre pourquoi DuckDB excelle en analytique
Ce parcours est découpé en 8 étapes progressives :
| Étape | Fichier | Durée | Niveau |
|---|---|---|---|
| 0️⃣ | 00-setup.md | 15 min | Débutant |
| 1️⃣ | 01-concept-ensembliste.md | 20 min | Débutant |
| 2️⃣ | 02-except-differences.md | 30 min | Intermédiaire |
| 3️⃣ | 03-union-consolidation.md | 25 min | Intermédiaire |
| 4️⃣ | 04-intersect-similitudes.md | 25 min | Intermédiaire |
| 5️⃣ | 05-comparaison-complete.md | 40 min | Avancé |
| 6️⃣ | 06-optimisation-where.md | 35 min | Avancé |
| 7️⃣ | 07-benchmark-performance.md | 30 min | Avancé |
Durée totale estimée : 3h30
- SQLite 3.35+ (généralement pré-installé)
- DuckDB 0.9.0+ (CLI)
- 4 Go d'espace disque (bases: 2.4 GB SQLite + 850 MB DuckDB)
- 8 Go de RAM minimum (16 Go recommandé)
Étape 1 : Installer les outils
Consultez INSTALL.md pour les instructions complètes :
- Windows PowerShell
- WSL/Linux Bash
- macOS
Étape 2 : Générer les données
3 méthodes au choix :
Windows :
.\setup-database.ps1Linux/WSL/macOS :
chmod +x setup-database.sh
./setup-database.sh# Télécharger le script SQL de génération
# Puis exécuter :
sqlite3 data/facturation.db < setup_database.sql
# Pour DuckDB
duckdb data/facturation.duckdb < setup_duckdb.sqlAdaptez le schéma fourni à vos données existantes.
Commencez par :
- 00-setup.md - Configuration de l'environnement
- 01-concept-ensembliste.md - Comprendre les bases
- 02-except-differences.md - Première opération simple
Puis continuez avec : 4. 03-union-consolidation.md 5. 04-intersect-similitudes.md
Démarrez directement par :
- 00-setup.md - Configuration rapide
- 05-comparaison-complete.md - Pattern avancé
- 06-optimisation-where.md - Optimisations
- 07-benchmark-performance.md - Benchmarks
Focus sur :
- 05-comparaison-complete.md - Audits de données
- 06-optimisation-where.md - Performance tuning
- 07-benchmark-performance.md - Scalabilité
- Théorie des ensembles appliquée au SQL
- Différence entre UNION et UNION ALL
- Cas d'usage métier de chaque opération
- Optimisations de requêtes analytiques
- Détecter des données manquantes entre environnements
- Identifier des clients churned (perdus)
- Analyser l'évolution temporelle de catalogues produits
- Comparer des performances entre moteurs SQL
- Réaliser des audits qualité de données
| Critère | SQLite | DuckDB | Gagnant |
|---|---|---|---|
| Analytique | ⭐⭐ | ⭐⭐⭐⭐⭐ | DuckDB |
| Transactionnel | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | SQLite |
| Performance OLAP | ⭐⭐ | ⭐⭐⭐⭐⭐ | DuckDB |
| Simplicité | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | SQLite |
| Portabilité | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | SQLite |
| Compression | ⭐⭐ | ⭐⭐⭐⭐⭐ | DuckDB |
client (100 000 lignes)
├── client_id
├── nom, prenom, email
├── ville, code_postal
└── date_creation
facture (3 000 000 lignes)
├── facture_id
├── client_id → client
├── numero_facture
├── date_facture, date_echeance
├── montant_ht, montant_tva, montant_ttc
└── statut (BROUILLON, EMISE, PAYEE, ANNULEE)
ligne_facture (~24 000 000 lignes)
├── ligne_id
├── facture_id → facture
├── description (25 produits différents)
├── quantite, prix_unitaire
└── montant_ht, montant_tva, montant_ttc
- Volume : ~27M lignes au total (100K clients, 3M factures, 24M lignes)
- Période : 2020-2025 (6 ans, 2190 jours)
- Villes : 18 villes françaises
- Produits : 25 produits IT/services
- CA moyen : Variable selon facture (génération déterministe)
- SQLite →
*_sqlite.sql(avecstrftime()) - DuckDB →
*.sql(avecYEAR()etMONTH())
📘 Voir SQL_VERSIONS.md pour les détails complets
SQLite :
sqlite3 data/facturation.db
.timer on
.mode column
.headers on
.read benchmark_01_pool_complet_sqlite.sqlDuckDB :
duckdb data/facturation.duckdb
.timer on
.read benchmark_01_pool_complet.sqlGuide complet : DBEAVER.md
- ✅ Interface visuelle professionnelle
- ✅ Timer automatique intégré
- ✅ Export de résultats
- ✅ Plan d'exécution visuel
Guide complet : DUCKDB-UI.md
- ✅ Interface web moderne
- ✅ Aucune installation (version web)
- ✅ Timer intégré
- ✅ Parfait pour DuckDB
DuckDB (standard) :
| Fichier | Description | Requêtes |
|---|---|---|
benchmark_01_pool_complet.sql |
Sans filtrage WHERE (YEAR/MONTH) | 10 |
benchmark_02_where_limite.sql |
Avec WHERE optimisé (YEAR/MONTH) | 10 |
comparaison_pools_complete.sql |
Pattern P1/P2/BOTH (YEAR/MONTH) | 8 |
SQLite (avec strftime) :
| Fichier | Description | Requêtes |
|---|---|---|
benchmark_01_pool_complet_sqlite.sql |
Sans filtrage WHERE (strftime) | 10 |
benchmark_02_where_limite_sqlite.sql |
Avec WHERE optimisé (strftime) | 10 |
comparaison_pools_complete_sqlite.sql |
Pattern P1/P2/BOTH (strftime) | 8 |
IBM i / DB2 :
| Fichier | Description | Requêtes |
|---|---|---|
benchmark_ibmi.sql |
Version IBM i / DB2 | 12 |
comparaison_pools_ibmi.sql |
Version IBM i | 6 |
📘 Documentation détaillée : SQL_VERSIONS.md
| Fichier | Description |
|---|---|
setup_database.sql |
Génération données (généré) |
setup-database.ps1 |
Wrapper PowerShell |
setup-database.sh |
Wrapper Bash |
run_benchmark.sh |
Script automatisé (utilise les bonnes versions) |
Les opérations ensemblistes sont essentielles pour :
- Comparer PROD vs DEV
- Détecter données orphelines
- Vérifier synchronisation
- Identifier clients perdus (churn)
- Comparer produits 2024 vs 2025
- Segmentation client
- Réconciliation de comptes
- Analyse TVA par taux
- Détection d'anomalies
- Comparer performances régionales
- Identifier marchés exclusifs
- Expansion géographique
- SQL_VERSIONS.md - Guide des versions SQL (SQLite/DuckDB/IBM i)
- README_BENCHMARK.md - Guide des benchmarks
- VOLUMES.md - Documentation de la volumétrie
- CHANGELOG.md - Historique des versions
- "SQL Performance Explained" - Markus Winand
- DuckDB Blog - Dernières optimisations
- Modern SQL - Fonctionnalités SQL modernes
Ce guide est conçu pour être pédagogique et évolutif. Les améliorations sont bienvenues :
- 🐛 Signaler des erreurs ou imprécisions
- 📝 Améliorer les explications
- 💡 Proposer de nouveaux cas d'usage
- 🚀 Ajouter des optimisations
ensemblistes-guide/
├── README.md # Ce fichier
├── INSTALL.md # Installation SQLite/DuckDB
├── DBEAVER.md # Guide DBeaver
├── DUCKDB-UI.md # Guide DuckDB UI
│
├── 00-setup.md # Configuration environnement
├── 01-concept-ensembliste.md # Théorie de base
├── 02-except-differences.md # Opération EXCEPT
├── 03-union-consolidation.md # Opération UNION ALL
├── 04-intersect-similitudes.md # Opération INTERSECT
├── 05-comparaison-complete.md # Pattern avancé
├── 06-optimisation-where.md # Optimisations
├── 07-benchmark-performance.md # Benchmarks
│
├── sql/
│ ├── benchmark_01_pool_complet.sql
│ ├── benchmark_02_where_limite.sql
│ ├── benchmark_ibmi.sql
│ ├── comparaison_pools_complete.sql
│ └── comparaison_pools_ibmi.sql
│
├── scripts/
│ ├── setup-database.ps1 # PowerShell
│ └── setup-database.sh # Bash
│
└── data/
├── facturation.db # SQLite
├── facturation.duckdb # DuckDB
└── setup_database.sql # Généré
Prêt à démarrer ?
- 📖 Lisez INSTALL.md pour installer SQLite et DuckDB
- 🔧 Suivez 00-setup.md pour configurer l'environnement
- 🎓 Commencez par 01-concept-ensembliste.md
- ⚡ Installation rapide via INSTALL.md
- 🚀 Générez les données :
./setup-database.sh - 🎯 Direction 05-comparaison-complete.md
Ce guide est fourni à des fins éducatives. Les données générées sont fictives.
Bon apprentissage ! 🎓🦆
Créé pour démontrer la puissance de DuckDB en analytique et l'utilité des opérations ensemblistes en SQL.