Comment écrire du SQL comme un pro : maîtrisez la requête parfaite
20 Apr 2026 | Développement Web et Mobile
Avez-vous déjà passé des heures à fixer un écran, attendant désespérément qu'une requête SQL veuille bien se terminer ? Si vous travaillez avec des données, vous savez que le SQL (Structured Query Language) est le langage universel et incontournable pour dialoguer avec les bases de données. Mais il y a une différence monumentale entre écrire une requête SQL qui fonctionne et écrire une requête SQL comme un pro.
Une requête de débutant ramène les bonnes données, mais elle peut épuiser les ressources du serveur, prendre des minutes au lieu de millisecondes, et ressembler à un plat de spaghettis indéchiffrable pour le prochain développeur qui devra la maintenir. Une requête de professionnel, en revanche, est un chef-d'œuvre de logique : elle est rapide, élégante, facile à lire et conçue pour évoluer. Dans cet article extrêmement détaillé, nous allons plonger dans les profondeurs de l'optimisation et des bonnes pratiques. Vous voulez écrire du SQL comme un PRO ? Suivez le guide et transformez votre façon de coder.
1. L'art de la lisibilité : écrivez pour les humains, pas seulement pour la machine
La première erreur des novices est de négliger le formatage. Les moteurs de bases de données comme PostgreSQL, MySQL ou SQL Server se moquent éperdument des espaces et des retours à la ligne. Mais vos collègues (et vous-même dans six mois) vous remercieront pour un code clair. Écrire du SQL lisible est la première étape vers la maîtrise.
Adoptez une convention de style stricte
- Majuscules pour les mots-clés : Écrivez toujours vos instructions principales (SELECT, FROM, WHERE, INNER JOIN, GROUP BY) en majuscules. Cela permet de distinguer immédiatement la structure de la requête des noms de tables ou de colonnes.
- Indentation logique : Alignez vos clauses. Chaque élément du SELECT devrait idéalement avoir sa propre ligne, tout comme chaque condition de votre clause WHERE ou ON.
- Utilisez des alias clairs (AS) : Bannissez les alias cryptiques comme
a,bouc. Préférez des abréviations significatives commecustpour customers ouordpour orders.
Un code SQL bien formaté réduit de moitié le temps de débogage. C'est un investissement immédiat dans votre productivité.
2. Oubliez le « SELECT * », le pire ennemi de la performance
C'est probablement le conseil le plus répété, et pourtant, le SELECT * continue de hanter les bases de données de production. Pourquoi est-ce une si mauvaise pratique ?
L'impact désastreux sur la bande passante et la mémoire
Lorsque vous demandez toutes les colonnes d'une table, vous forcez la base de données à lire des données dont vous n'avez probablement pas besoin. Cela consomme des ressources CPU pour extraire les données, de la mémoire (RAM) pour les stocker temporairement, et de la bande passante réseau pour les envoyer à votre application. Imaginez une table avec une colonne contenant des images lourdes ou de longs textes (BLOB/TEXT) : récupérer ces données pour simplement vérifier un statut est un désastre en termes de performance.
La fragilité de votre application
Les requêtes utilisant SELECT * sont fragiles. Si un administrateur ajoute une nouvelle colonne à la table, votre application va soudainement recevoir plus de données que prévu, ce qui peut provoquer des bugs en aval (par exemple, si le code s'attend à un tableau de 5 éléments et en reçoit 6). Les professionnels déclarent toujours explicitement les colonnes qu'ils utilisent : SELECT id, nom, date_creation FROM utilisateurs;.
3. Dites adieu aux sous-requêtes imbriquées : adoptez les CTE (Common Table Expressions)
Les sous-requêtes imbriquées (des SELECT à l'intérieur d'autres SELECT) rendent le code illisible. Le regard doit faire des allers-retours entre l'intérieur et l'extérieur de la requête pour comprendre la logique. Les professionnels utilisent la clause WITH pour créer des CTE.
Pourquoi les CTE changent la donne ?
- Lecture séquentielle : Les CTE permettent de lire le code de haut en bas, comme une histoire. Vous préparez d'abord vos blocs de données, puis vous les assemblez à la fin.
- Réutilisabilité : Vous pouvez référencer la même CTE plusieurs fois dans votre requête principale, évitant ainsi de dupliquer du code (principe DRY - Don't Repeat Yourself).
- Débogage facilité : Vous pouvez facilement tester une CTE de manière isolée en commentant le reste de la requête.
Exemple de syntaxe propre : WITH ClientsActifs AS (SELECT id, nom FROM clients WHERE statut = 'actif') SELECT nom FROM ClientsActifs;. Cette approche compartimente la complexité.
4. Maîtrisez les Jointures et évitez le piège du LEFT JOIN systématique
Comprendre les jointures est fondamental. Beaucoup de développeurs utilisent LEFT JOIN par défaut par peur de perdre des lignes. C'est une grave erreur d'optimisation.
INNER JOIN vs OUTER JOIN
Si vous savez pertinemment que chaque commande a un client correspondant (grâce à une clé étrangère stricte), utilisez un INNER JOIN. Le moteur SQL l'exécute souvent plus rapidement car il peut optimiser l'ordre d'évaluation des tables de manière plus agressive qu'avec un LEFT JOIN. Ne réservez le LEFT JOIN que pour les cas où l'absence de correspondance de l'autre côté est une condition métier normale et attendue.
Le filtrage dans le ON vs le WHERE
C'est une nuance de niveau pro. Dans un LEFT JOIN, si vous placez une condition sur la table de droite dans la clause WHERE, vous transformez accidentellement votre LEFT JOIN en INNER JOIN, car les valeurs NULL générées par le LEFT JOIN seront rejetées par le WHERE. Pour conserver la nature du LEFT JOIN, vos conditions de filtrage sur la table jointe doivent être placées dans la clause ON.
5. Les Fonctions de Fenêtrage (Window Functions) : L'arme secrète des experts
Si vous voulez vraiment écrire du SQL comme un pro, vous devez maîtriser les Window Functions (fonctions de fenêtrage). Avant leur existence, calculer des totaux cumulés ou trouver la dernière transaction d'un utilisateur nécessitait des jointures complexes ou des sous-requêtes lourdes.
Que sont les Window Functions ?
Elles permettent d'effectuer des calculs sur un ensemble de lignes associées à la ligne courante, sans regrouper les lignes en une seule comme le ferait un simple GROUP BY. Vous conservez le détail tout en ajoutant des informations agrégées.
Exemples d'utilisation incontournables
- ROW_NUMBER() : Idéal pour dédoublonner des données ou trouver le top 1 de chaque catégorie. En combinant
ROW_NUMBER() OVER(PARTITION BY client_id ORDER BY date_achat DESC), vous numérotez les achats de chaque client du plus récent au plus ancien. Il suffit ensuite de filtrer sur le rang 1. - Totaux cumulatifs : Utilisez
SUM(montant) OVER(ORDER BY date)pour voir le chiffre d'affaires grandir jour après jour dans votre tableau de résultats. - LEAD() et LAG() : Ces fonctions permettent de comparer la ligne courante avec la ligne suivante ou précédente. Parfait pour calculer l'évolution d'une métrique d'un mois sur l'autre (Month-over-Month).
6. La SARGabilité : Écrivez des requêtes qui aiment les index
Avoir des index sur votre base de données ne sert à rien si vos requêtes ne peuvent pas les utiliser. Une requête est qualifiée de SARGable (Search ARGument ABLE) si le moteur de base de données peut utiliser un index pour l'exécuter. C'est ici que se joue la véritable performance.
Le piège des fonctions sur les colonnes
Ne modifiez jamais la colonne dans votre clause WHERE. Si vous écrivez WHERE YEAR(date_commande) = 2023, le moteur SQL est obligé de scanner toute la table (Table Scan), d'appliquer la fonction YEAR sur chaque ligne, puis de comparer le résultat à 2023. Votre index sur date_commande devient inutile.
La méthode SARGable (de niveau pro) consiste à modifier l'argument de recherche, pas la colonne : WHERE date_commande >= '2023-01-01' AND date_commande < '2024-01-01'. Ici, l'index sera utilisé de manière optimale (Index Seek), ce qui peut diviser le temps d'exécution par cent, voire par mille sur de grandes tables.
L'utilisation prudente du LIKE
De même, une condition comme LIKE '%terme' n'est pas SARGable. Si le joker % est au début, l'index ne peut pas être lu de gauche à droite. Si vous devez chercher des termes exacts en début de chaîne, utilisez LIKE 'terme%', qui lui, peut exploiter l'index de manière efficace.
7. Maîtriser le plan d'exécution (EXPLAIN)
Un véritable expert SQL ne devine pas les performances de sa requête : il les mesure. Le mot-clé EXPLAIN (ou EXPLAIN ANALYZE dans PostgreSQL) est votre meilleur allié. Il vous montre exactement comment le moteur de base de données prévoit d'exécuter votre requête.
Que chercher dans un plan d'exécution ?
- Les Sequential Scans (ou Table Scans) : Ils indiquent que le moteur lit toute la table. S'il s'agit d'une table de plusieurs millions de lignes, c'est un signal d'alarme clair indiquant qu'un index est manquant ou que votre requête n'est pas SARGable.
- Les Nested Loops coûteuses : Bien que normales pour de petits volumes de données, elles peuvent devenir désastreuses si elles opèrent sur d'énormes ensembles de résultats non indexés.
- L'utilisation de la mémoire temporaire : Si vous voyez des tris sur disque (disk sorts) au lieu de tris en mémoire, c'est que votre requête manipule trop de données et a besoin d'être optimisée.
Conclusion
Écrire du SQL comme un pro n'est pas une question de talent inné, mais plutôt l'application rigoureuse de bonnes pratiques. De la lisibilité de votre code avec les CTE, en passant par l'élimination du toxique SELECT *, jusqu'à la maîtrise absolue des Window Functions et de la SARGabilité, chaque petit détail compte.
La prochaine fois que vous devrez extraire des données, prenez quelques minutes supplémentaires pour structurer votre requête, l'analyser avec EXPLAIN et vous assurer qu'elle tire pleinement parti des index. Vous ne ferez pas seulement gagner un temps précieux aux serveurs de votre entreprise, vous produirez un code robuste, maintenable et digne d'un véritable expert de la donnée. À vos claviers, et que la requête parfaite soit avec vous !
Commentaires (0)
Aucun commentaire pour le moment.
Laissez un commentaire