Générateur de requête SQL : d’une question en français à une requête testée
Écrire de mémoire la bonne jointure ou la bonne fonction de fenêtrage prend du temps, et un GROUP BY mal placé donne des chiffres crédibles mais faux. Collez la structure de vos tables et posez votre question en français : votre agent todo.is écrit une requête commentée pour votre base, l’exécute sur des données d’exemple dans son espace de travail et vous montre le résultat.
Le prompt
- Écris une requête SQL pour [TYPE DE BASE DE DONNÉES] qui répond à : [VOTRE QUESTION]. Mes tables : [STRUCTURE DES TABLES]. Commente chaque partie, utilise des alias clairs et évite tout ce qui serait lent sur [VOLUME DES TABLES]. Crée un petit jeu de données d’exemple conforme à mes tables, exécute la requête dessus dans ton espace de travail et montre-moi le résultat, pour que je voie qu’elle marche. Si ma question est ambiguë (par exemple la façon de compter les remboursements), dis-moi ce que tu as supposé.
Ce qu’il faut changer
- [TYPE DE BASE DE DONNÉES]: Par exemple « PostgreSQL 15 », « MySQL 8 », « MariaDB », « SQL Server », « SQLite », « BigQuery ».
- [VOTRE QUESTION]: En français, par exemple « les 10 meilleurs clients en chiffre d’affaires sur les 90 derniers jours, avec leur nombre de commandes ».
- [STRUCTURE DES TABLES]: Collez les CREATE TABLE ou listez tables et colonnes, par exemple « commandes(id, client_id, total, statut, cree_le) ». Ou joignez un export du schéma.
- [VOLUME DES TABLES]: Ordre de grandeur, par exemple « commandes fait 20 millions de lignes », ou « petit, moins de 100 000 lignes ».
Exemple de résultat
- Les 10 meilleurs clients en chiffre d’affaires, 90 derniers jours (PostgreSQL)
- -- Commandes payées des 90 derniers jours, remboursements déduits
- WITH recentes AS (
- SELECT c.client_id,
- c.id AS commande_id,
- c.total - COALESCE(r.montant, 0) AS total_net
- FROM commandes c
- LEFT JOIN remboursements r ON r.commande_id = c.id -- garde les commandes sans remboursement
- WHERE c.statut = 'payee'
- AND c.cree_le >= now() - interval '90 days'
- )
- SELECT cl.id,
- cl.nom,
- COUNT(*) AS nb_commandes,
- SUM(rc.total_net) AS ca
- FROM recentes rc
- JOIN clients cl ON cl.id = rc.client_id
- GROUP BY cl.id, cl.nom
- ORDER BY ca DESC
- LIMIT 10;
- Ce que fait chaque partie
- • WITH recentes AS (…) rassemble d’abord les commandes utiles, pour garder la requête principale lisible
- • LEFT JOIN remboursements conserve les commandes jamais remboursées ; COALESCE transforme leur remboursement absent en 0
- • GROUP BY cl.id, cl.nom donne une ligne par client ; grouper par id évite de fusionner deux clients homonymes
- • ORDER BY ca DESC LIMIT 10 garde les 10 premiers
- Exécution test (500 commandes fictives, 60 clients)
- • 1. Cycles du Nord : 14 commandes, 8 920,00
- • 2. Studio Genièvre : 9 commandes, 7 410,50
- • 3. Aulne & Pinson : 11 commandes, 6 985,00
- Hypothèses
- • Le « chiffre d’affaires » correspond aux commandes payées moins les remboursements ; les commandes en attente ou annulées sont exclues
- • Un seul remboursement par commande au maximum. S’il peut y en avoir plusieurs, il faut d’abord les additionner par commande
- Performances sur 20 millions de lignes
- • Un index sur commandes (statut, cree_le) permet au WHERE d’ignorer les anciennes lignes
- • Lancez un EXPLAIN ANALYZE avant de l’utiliser dans un tableau de bord
Comment faire avec todo.is
- Copiez le prompt, puis indiquez votre type de base, votre question et vos tables.
- Collez vos CREATE TABLE, ou joignez un export du schéma, sur l’écran Aujourd’hui de todo.is.
- Votre agent écrit la requête, l’exécute sur des données d’exemple réalistes et vous montre le tableau de résultat.
- Copiez la requête (ou téléchargez le fichier .sql) et lancez-la dans votre propre outil.
- Renvoyez-lui tout message d’erreur ou chiffre bizarre : il corrige la requête.
Conseils pour un meilleur résultat
- Nommez toujours votre base. Fonctions de date, LIMIT ou TOP, gestion des chaînes : tout diffère entre PostgreSQL, MySQL, SQL Server et BigQuery.
- Partagez la structure, pas les données. Les noms et types de colonnes suffisent pour écrire une requête juste, et c’est plus simple côté RGPD.
- Définissez les mots piégeux comme « client actif » ou « chiffre d’affaires » (HT ou TTC ?) : la plupart des chiffres faux viennent de définitions floues.
- Testez toute nouvelle requête avec un utilisateur en lecture seule ou sur une copie de la base avant de lancer un UPDATE ou un DELETE.
générateur de requête SQL : questions fréquentes
- Peut-il se connecter à ma base de données et lancer la requête ? Non. Il ne se connecte pas à votre base. Il exécute la requête sur des données d’exemple dans son propre espace de travail, et vous lancez la version finale dans votre outil.
- Quelle différence entre WHERE et HAVING ? WHERE filtre les lignes avant le regroupement, HAVING filtre les groupes après l’agrégation. Par exemple, HAVING COUNT(*) > 5 ne garde que les clients ayant plus de 5 commandes.
- Peut-il expliquer ou accélérer une requête lente que j’ai déjà ? Oui. Collez la requête et, si possible, le résultat de l’EXPLAIN. Il repère les index manquants, les sous-requêtes inutiles ou les fonctions appliquées à des colonnes indexées, puis la réécrit.
- Puis-je coller mon schéma sans risque ? Votre schéma reste dans l’espace de travail de votre agent, et lui seul l’utilise. Ne mettez ni vraies données ni identifiants : ils ne sont pas nécessaires.
JavaScript is required to use the todo.is app.