alltools.one
SQL‱
2026-02-25
‱
10 min
‱
alltools.one Team
sqlformattingdatabasebest-practicesdeveloper-tools

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_revenue est 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 :

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.


Published on 2026-02-25
SQL Formatting Best Practices for Clean Queries | alltools.one