Bonnes Pratiques de Formatage SQL pour des RequĂȘtes Propres
Tout professionnel des bases de donnĂ©es a un jour hĂ©ritĂ© d'une requĂȘte qui ressemblait Ă un amas de mots-clĂ©s jetĂ©s au hasard. Un bon formatage SQL transforme des blocs de texte illisibles en code structurĂ© et facilement analysable, que n'importe quel membre de votre Ă©quipe peut comprendre en quelques secondes. Que vous Ă©criviez une requĂȘte ponctuelle ou que vous construisiez une procĂ©dure stockĂ©e destinĂ©e Ă tourner en production pendant des annĂ©es, la façon dont vous formatez votre SQL a une importance considĂ©rable.
Vous pouvez coller n'importe quelle requĂȘte dĂ©sordonnĂ©e dans notre Formateur SQL et obtenir instantanĂ©ment un rĂ©sultat propre et correctement indentĂ© â mais comprendre pourquoi certains choix de formatage fonctionnent mieux fera de vous un dĂ©veloppeur SQL plus compĂ©tent dans l'ensemble.
Pourquoi le Formatage SQL est Important
Un SQL mal formaté crée des problÚmes en cascade dans tout votre flux de travail :
- Le dĂ©bogage prend trois fois plus de temps â Quand une requĂȘte renvoie des rĂ©sultats erronĂ©s, vous devez suivre visuellement la logique. Un formatage brouillon masque les erreurs logiques.
- Les revues de code stagnent â Les relecteurs passent leur temps Ă dĂ©chiffrer la structure au lieu d'Ă©valuer la logique.
- Les conflits de fusion se multiplient â Un formatage incohĂ©rent signifie que chaque membre de l'Ă©quipe reformate diffĂ©remment, crĂ©ant des diffs git inutiles.
- L'intĂ©gration des nouveaux en souffre â Les nouveaux membres de l'Ă©quipe peinent Ă comprendre la logique mĂ©tier enfouie dans des requĂȘtes emmĂȘlĂ©es.
- Les incidents en production s'aggravent â Sous pression, personne ne veut dĂ©mĂȘler une requĂȘte de 200 lignes sans aucun retour Ă la ligne.
Voici l'essentiel : le formatage SQL n'est pas une question d'esthĂ©tique. C'est une question de rĂ©duction de la charge cognitive. Une requĂȘte bien formatĂ©e communique son intention avant mĂȘme que vous ayez lu les noms de colonnes.
Casse des Mots-Clés : Choisissez une Convention et Respectez-la
Le sujet le plus débattu en matiÚre de formatage SQL est la casse des mots-clés. Il existe trois approches courantes :
Mots-clés en MAJUSCULES (le plus courant) :
SELECT
u.first_name,
u.last_name,
o.order_total
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE o.order_date >= '2025-01-01'
ORDER BY o.order_total DESC;
Mots-clés en minuscules :
select
u.first_name,
u.last_name,
o.order_total
from users u
inner join orders o on u.id = o.user_id
where o.order_date >= '2025-01-01'
order by o.order_total desc;
Mots-clés en Casse Titre :
Select
u.first_name,
u.last_name,
o.order_total
From users u
Inner Join orders o On u.id = o.user_id
Where o.order_date >= '2025-01-01'
Order By o.order_total Desc;
Les mots-clĂ©s en MAJUSCULES restent la norme de l'industrie, et pour de bonnes raisons. Ils crĂ©ent une sĂ©paration visuelle immĂ©diate entre les mots-clĂ©s SQL et les noms de vos tables/colonnes. Vos yeux peuvent parcourir la marge gauche et comprendre instantanĂ©ment la structure de la requĂȘte : SELECT, FROM, WHERE, ORDER BY.
à noter : quelle que soit la convention que vous choisissez, appliquez-la avec un outil automatisé. Notre Formateur SQL gÚre automatiquement la casse des mots-clés, pour que toute votre équipe reste cohérente sans y penser.
Stratégies d'Indentation pour les Clauses Principales
Une bonne indentation est l'Ă©pine dorsale d'un SQL lisible. Chaque clause principale doit commencer Ă la marge gauche, et son contenu doit ĂȘtre indentĂ© d'un niveau.
Clause SELECT
Placez chaque colonne sur sa propre ligne. Cela rend trivial l'ajout, la suppression ou la mise en commentaire de colonnes :
SELECT
e.employee_id,
e.first_name,
e.last_name,
e.department_id,
d.department_name,
e.hire_date,
e.salary
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
Ăvitez cet anti-pattern courant :
-- Difficile Ă parcourir, difficile Ă modifier
SELECT e.employee_id, e.first_name, e.last_name, e.department_id, d.department_name, e.hire_date, e.salary
FROM employees e INNER JOIN departments d ON e.department_id = d.id;
Clauses FROM et JOIN
Chaque JOIN a sa propre ligne. La condition ON reste avec son JOIN, indentée davantage si elle s'étend sur plusieurs conditions :
SELECT
o.order_id,
c.customer_name,
p.product_name,
oi.quantity,
oi.unit_price
FROM orders o
INNER JOIN customers c
ON o.customer_id = c.id
INNER JOIN order_items oi
ON o.id = oi.order_id
LEFT JOIN products p
ON oi.product_id = p.id
WHERE o.status = 'completed'
AND o.order_date >= '2025-01-01';
Clause WHERE
Chaque condition a sa propre ligne. Placez l'opĂ©rateur boolĂ©en (AND/OR) au dĂ©but de chaque nouvelle ligne â cela rend extrĂȘmement simple la mise en commentaire de conditions individuelles lors du dĂ©bogage :
WHERE o.status = 'completed'
AND o.order_date >= '2025-01-01'
AND o.order_date < '2026-01-01'
AND c.region IN ('US', 'CA', 'UK')
-- AND o.total > 100 (temporairement désactivé)
La bonne nouvelle : une fois ce pattern intégré, vous repérerez les erreurs logiques bien plus rapidement. Chaque condition est visuellement isolée, de sorte que les filtres manquants ou incorrects sautent aux yeux immédiatement.
Formatage des JOIN Complexes
Les requĂȘtes du monde rĂ©el ont rarement des JOIN simples sur une seule colonne. Voici comment gĂ©rer proprement les JOIN Ă conditions multiples :
SELECT
s.sale_id,
s.sale_date,
p.product_name,
w.warehouse_name,
i.quantity_on_hand
FROM sales s
INNER JOIN products p
ON s.product_id = p.id
LEFT JOIN inventory i
ON p.id = i.product_id
AND i.warehouse_id = s.warehouse_id
AND i.snapshot_date = s.sale_date
LEFT JOIN warehouses w
ON i.warehouse_id = w.id
WHERE s.sale_date >= '2025-06-01';
Remarquez comment les conditions de JOIN supplĂ©mentaires sont indentĂ©es au mĂȘme niveau que la premiĂšre condition ON. Cela indique clairement que les trois conditions appartiennent au mĂȘme JOIN â et non Ă une clause WHERE mal placĂ©e par accident.
Pour les auto-jointures, utilisez des alias explicites plutĂŽt que de simples lettres cryptiques :
SELECT
mgr.first_name AS manager_name,
emp.first_name AS employee_name,
emp.hire_date
FROM employees emp
INNER JOIN employees mgr
ON emp.manager_id = mgr.employee_id
WHERE mgr.department_id = 10;
Formatage des CTE (Clauses WITH)
Les expressions de table communes (CTE) mĂ©ritent une attention particuliĂšre en matiĂšre de formatage, car elles peuvent rendre une requĂȘte complexe lisible ou incomprĂ©hensible. Chaque CTE doit ĂȘtre traitĂ©e comme son propre bloc formatĂ© :
WITH monthly_revenue AS (
SELECT
DATE_TRUNC('month', order_date) AS revenue_month,
SUM(order_total) AS total_revenue,
COUNT(DISTINCT customer_id) AS unique_customers
FROM orders
WHERE order_date >= '2025-01-01'
GROUP BY DATE_TRUNC('month', order_date)
),
customer_segments AS (
SELECT
customer_id,
SUM(order_total) AS lifetime_value,
CASE
WHEN SUM(order_total) >= 10000 THEN 'platinum'
WHEN SUM(order_total) >= 5000 THEN 'gold'
WHEN SUM(order_total) >= 1000 THEN 'silver'
ELSE 'bronze'
END AS segment
FROM orders
GROUP BY customer_id
)
SELECT
mr.revenue_month,
mr.total_revenue,
mr.unique_customers,
COUNT(CASE WHEN cs.segment = 'platinum' THEN 1 END) AS platinum_count,
COUNT(CASE WHEN cs.segment = 'gold' THEN 1 END) AS gold_count
FROM monthly_revenue mr
CROSS JOIN customer_segments cs
GROUP BY mr.revenue_month, mr.total_revenue, mr.unique_customers
ORDER BY mr.revenue_month;
RÚgles clés de formatage des CTE :
- Séparez les CTE par une ligne vide aprÚs chaque parenthÚse fermante et virgule
- Indentez le corps de chaque CTE comme vous le feriez pour n'importe quelle requĂȘte ordinaire
- Utilisez des noms de CTE descriptifs â
monthly_revenueest toujours prĂ©fĂ©rable Ăcte1 - Gardez le SELECT final au mĂȘme niveau d'indentation que le mot-clĂ© WITH
Formatage des Sous-requĂȘtes
Les sous-requĂȘtes doivent ĂȘtre indentĂ©es d'un niveau supplĂ©mentaire par rapport Ă la requĂȘte englobante. Utilisez les parenthĂšses comme dĂ©limiteurs visuels :
SELECT
d.department_name,
d.budget,
dept_stats.avg_salary,
dept_stats.employee_count
FROM departments d
INNER JOIN (
SELECT
department_id,
AVG(salary) AS avg_salary,
COUNT(*) AS employee_count
FROM employees
WHERE status = 'active'
GROUP BY department_id
HAVING COUNT(*) >= 5
) dept_stats
ON d.id = dept_stats.department_id
WHERE d.budget > 100000
ORDER BY dept_stats.avg_salary DESC;
Quand vous avez des sous-requĂȘtes imbriquĂ©es sur trois ou quatre niveaux, c'est gĂ©nĂ©ralement le signe qu'il faut refactoriser en CTE. Les CTE aplatissent l'imbrication et donnent Ă chaque Ă©tape logique un nom lisible. Notre Formateur SQL peut vous aider Ă identifier les structures profondĂ©ment imbriquĂ©es qui gagneraient Ă ĂȘtre refactorisĂ©es.
Formatage des Instructions CASE
Les instructions CASE apparaissent partout â dans les listes SELECT, les clauses WHERE, les ORDER BY, et mĂȘme dans les conditions de JOIN. Gardez-les lisibles avec une indentation cohĂ©rente :
SELECT
order_id,
order_total,
CASE
WHEN order_total >= 1000 THEN 'high-value'
WHEN order_total >= 100 THEN 'medium-value'
ELSE 'low-value'
END AS order_tier,
CASE status
WHEN 'shipped' THEN 'In Transit'
WHEN 'delivered' THEN 'Complete'
WHEN 'returned' THEN 'Refund Pending'
ELSE 'Processing'
END AS display_status
FROM orders;
Les mots-clés WHEN et ELSE s'alignent les uns avec les autres, et le mot-clé END s'aligne avec CASE. Cela crée un bloc visuel propre, facile à parcourir et à modifier.
Bonnes Pratiques pour les Commentaires en SQL
Les commentaires SQL sont les meilleurs amis de votre futur vous. Utilisez-les de maniÚre stratégique :
Commentaires de bloc pour l'objectif de la requĂȘte :
/*
* Rapport de Revenus Mensuels
* GénÚre la ventilation des revenus par catégorie de produits
* Utilisé par : Tableau de bord Finance (Tableau)
* DerniĂšre modification : 2025-06-15
*/
SELECT
pc.category_name,
SUM(oi.quantity * oi.unit_price) AS revenue
FROM order_items oi
INNER JOIN products p ON oi.product_id = p.id
INNER JOIN product_categories pc ON p.category_id = pc.id
GROUP BY pc.category_name;
Commentaires en ligne pour la logique non évidente :
WHERE o.order_date >= '2025-01-01'
AND o.status != 'cancelled'
AND o.payment_verified = TRUE -- exclut les vérifications de paiement en attente
AND c.account_type != 'internal' -- les commandes test du personnel utilisent des comptes internes
Commentaires de section pour les longues requĂȘtes :
-- === Calcul des Revenus ===
...
-- === Filtrage des Clients ===
...
-- === Agrégation Finale ===
Ăvitez de sur-commenter les Ă©vidences. -- sĂ©lectionner toutes les colonnes au-dessus d'une instruction SELECT ajoute du bruit, pas de la clartĂ©.
Formatage selon les Différents Dialectes SQL
Les dialectes SQL ont leurs propres particularités syntaxiques, mais les principes de formatage restent cohérents. Voici les considérations spécifiques à chaque dialecte :
MySQL
SELECT
product_name,
price,
IFNULL(discount, 0) AS discount,
price - IFNULL(discount, 0) AS final_price
FROM products
WHERE category_id IN (1, 3, 5)
LIMIT 50 OFFSET 100;
PostgreSQL
SELECT
product_name,
price,
COALESCE(discount, 0) AS discount,
price - COALESCE(discount, 0) AS final_price
FROM products
WHERE category_id = ANY(ARRAY[1, 3, 5])
LIMIT 50 OFFSET 100;
SQL Server
SELECT TOP 50
product_name,
price,
ISNULL(discount, 0) AS discount,
price - ISNULL(discount, 0) AS final_price
FROM products
WHERE category_id IN (1, 3, 5)
ORDER BY price DESC
OFFSET 100 ROWS FETCH NEXT 50 ROWS ONLY;
Quel que soit le dialecte, le formatage structurel reste le mĂȘme : les mots-clĂ©s sur leurs propres lignes, une indentation cohĂ©rente, une colonne par ligne. Le Formateur SQL sur alltools.one gĂšre tous les dialectes majeurs, pour que vous obteniez des rĂ©sultats cohĂ©rents quelle que soit la base de donnĂ©es avec laquelle vous travaillez.
Formatage Automatisé vs. Formatage Manuel
Le formatage manuel convient pour les requĂȘtes courtes. Mais dĂšs que votre Ă©quipe dĂ©passe deux personnes, vous avez besoin d'une application automatisĂ©e. Voici pourquoi :
Avantages du formatage automatisé :
- ZĂ©ro dĂ©bat â Le formateur dĂ©cide, tout le monde suit
- Des diffs git cohĂ©rents â Plus de modifications uniquement d'espaces qui encombrent les pull requests
- RapiditĂ© â Reformater manuellement une procĂ©dure stockĂ©e de 500 lignes prend des minutes. Un outil le fait en millisecondes.
- IntĂ©gration â Les nouveaux membres de l'Ă©quipe n'ont pas besoin de mĂ©moriser les guides de style
Quand le formatage manuel reste gagnant :
- Alignement de colonnes spécifiques dans les instructions INSERT ou les blocs CASE complexes
- Conservation du formatage intentionnel dans les requĂȘtes de documentation
- Cas particuliers oĂč les outils automatisĂ©s nuisent Ă la lisibilitĂ© (rare, mais ça arrive)
L'approche pragmatique : utilisez le formatage automatisĂ© comme base, puis ajustez manuellement les quelques requĂȘtes oĂč c'est nĂ©cessaire. Passez votre SQL dans notre Formateur SQL d'abord, puis ajustez des sections spĂ©cifiques si besoin.
Référence Rapide : Checklist de Formatage SQL
Avant de commiter du SQL dans votre base de code, parcourez cette checklist :
- Les mots-clés ont une casse cohérente (de préférence en MAJUSCULES)
- Chaque clause principale (SELECT, FROM, WHERE, GROUP BY, ORDER BY) commence sur une nouvelle ligne
- Les colonnes dans le SELECT sont une par ligne
- Les JOIN sont chacun sur leur propre ligne avec les conditions ON indentées
- Les conditions WHERE sont une par ligne avec AND/OR au début
- Les CTE ont des noms descriptifs et une indentation cohérente
- Les instructions CASE ont les WHEN/ELSE alignés
- Les commentaires expliquent le pourquoi, pas le quoi
- Les alias de table sont explicites (pas de simples lettres pour les requĂȘtes complexes)
- Les sous-requĂȘtes de plus de deux niveaux de profondeur ont Ă©tĂ© refactorisĂ©es en CTE
Ressources Complémentaires
Si vous travaillez sur la qualité du code en général, ces guides complÚtent bien le formatage SQL :
- Bonnes Pratiques de Formatage JSON â Des principes de formatage similaires pour les structures de donnĂ©es JSON
- Guide de Comparaison de Texte â Utile pour examiner les changements de formatage dans les fichiers SQL
- Aide-MĂ©moire Regex â Pratique pour Ă©crire du pattern matching SQL avec LIKE et SIMILAR TO
Un formatage SQL propre fait partie de ces pratiques qui ne coĂ»tent presque rien Ă adopter mais qui rapportent des dividendes chaque jour. Votre futur vous â et chaque coĂ©quipier qui touchera Ă vos requĂȘtes â vous en remerciera.
đ ïž Essayez maintenant : Formateur SQL â Formatez et embellissez vos requĂȘtes SQL instantanĂ©ment. 100 % gratuit, tout est traitĂ© dans votre navigateur. Aucune donnĂ©e tĂ©lĂ©chargĂ©e.