SQL Pratique
Variables SQL : DECLARE, SET et utilisation pratique
9 min de lecture

Variables SQL : DECLARE, SET et utilisation pratique

Découvrez comment déclarer et utiliser des variables SQL avec DECLARE et SET. Exemples concrets, erreurs courantes et cas d'usage en entretien.

Avatar de Thomas LeroyThomas Leroy

Les variables SQL permettent de stocker temporairement une valeur pour la réutiliser dans une requête ou un script. Dès qu'on écrit des scripts complexes, des procédures ou des tests de données, elles deviennent indispensables. Pourtant, beaucoup de candidats en entretien data confondent leur syntaxe selon les SGBD, ou ignorent leur portée réelle. Cet article vous montre comment déclarer une variable avec DECLARE, lui affecter une valeur avec SET, et l'exploiter dans des cas concrets — y compris les pièges à éviter.

📌 Ce qu'il faut retenir

  • Une variable SQL stocke une valeur temporaire réutilisable dans un bloc ou un script
  • DECLARE initialise la variable, SET (ou SELECT) lui affecte une valeur
  • La syntaxe varie selon le SGBD : T-SQL (SQL Server), PL/pgSQL (PostgreSQL), MySQL
  • Les variables locales existent uniquement dans le bloc d'exécution où elles sont déclarées

Pourquoi utiliser des variables dans un script SQL ?

Quand une requête répète plusieurs fois la même valeur — un seuil, une date, un identifiant — remplacer cette valeur par une variable améliore la maintenabilité. Si la valeur change, on la modifie en 1 seul endroit.

Les variables sont aussi utiles pour décomposer un calcul complexe. Plutôt que d'imbriquer 5 fonctions dans une seule expression, on peut stocker les résultats intermédiaires. C'est plus lisible et plus facile à déboguer.

Enfin, en contexte d'entretien, savoir utiliser des variables montre qu'on pense au-delà de la requête unique. Cela témoigne d'une vision de scripting et d'automatisation, compétence très recherchée chez un data analyst ou un data engineer.

DECLARE et SET : la syntaxe de base en T-SQL

SQL Server (T-SQL) est souvent le premier dialecte où l'on rencontre les variables. La déclaration commence par DECLARE, suivi du nom de la variable (préfixé par @) et de son type.

DECLARE @seuil_ca INT;
SET @seuil_ca = 10000;

SELECT client_id, total_ca
FROM commandes
WHERE total_ca > @seuil_ca;

La variable @seuil_ca est déclarée avec le type INT, puis initialisée à 10000. La requête finale l'utilise comme n'importe quelle valeur littérale. Si demain le seuil passe à 15000, on modifie uniquement la ligne SET.

On peut aussi initialiser directement dans DECLARE :

DECLARE @seuil_ca INT = 10000;

C'est plus concis et préférable quand la valeur est connue d'emblée.

Affecter une valeur via SELECT

SET affecte une valeur scalaire fixe. Mais si on veut affecter le résultat d'une requête, on utilise SELECT :

DECLARE @nb_clients INT;
SELECT @nb_clients = COUNT(*) FROM clients WHERE actif = 1;

PRINT 'Clients actifs : ' + CAST(@nb_clients AS VARCHAR);

⚠️ Attention

Si la requête `SELECT` retourne plusieurs lignes, la variable ne retiendra que la dernière valeur assignée — sans erreur. Ce comportement silencieux est une source classique de bugs difficiles à détecter.

Les variables en MySQL : une syntaxe différente

MySQL distingue deux types de variables : les variables locales (dans les procédures stockées) et les variables utilisateur (préfixées par @ sans DECLARE).

Variables utilisateur (session)

SET @seuil = 500;

SELECT produit_id, ventes
FROM stats_ventes
WHERE ventes > @seuil;

Ces variables persistent pour toute la session MySQL. Pas besoin de DECLARE. Elles sont pratiques pour des scripts rapides, mais attention : leur portée globale à la session peut créer des effets de bord si on ne les réinitialise pas.

Variables locales dans une procédure MySQL

À l'intérieur d'un bloc BEGIN...END, on utilise DECLARE comme en T-SQL, mais sans le préfixe @ :

DELIMITER $$
CREATE PROCEDURE calcul_bonus()
BEGIN
  DECLARE taux DECIMAL(5,2);
  SET taux = 0.10;
  
  UPDATE employes
  SET salaire = salaire * (1 + taux)
  WHERE anciennete > 5;
END$$
DELIMITER ;

La variable taux est locale au bloc BEGIN...END de la procédure. Elle disparaît dès la fin de l'exécution.

Variables en PL/pgSQL (PostgreSQL)

PostgreSQL utilise PL/pgSQL pour les blocs procéduraux. La syntaxe ressemble à celle de T-SQL mais avec quelques différences importantes.

DO $$
DECLARE
  v_seuil INTEGER := 1000;
  v_count INTEGER;
BEGIN
  SELECT COUNT(*) INTO v_count
  FROM commandes
  WHERE montant > v_seuil;
  
  RAISE NOTICE 'Commandes > % : %', v_seuil, v_count;
END;
$$;

Notez l'usage de := pour l'affectation (et non = ou SET), et INTO pour capturer le résultat d'un SELECT. La clause RAISE NOTICE sert à afficher des messages de debug — l'équivalent de PRINT en T-SQL.

💡 Bon à savoir

En PostgreSQL, il est conventionnel de préfixer les variables locales avec `v_` (ex. `v_seuil`, `v_count`) pour les distinguer des noms de colonnes. Cette convention évite des ambiguïtés difficiles à déboguer, surtout dans les requêtes SELECT.

Comparatif des syntaxes selon les SGBD

SGBD Déclaration Affectation Portée Préfixe
SQL Server (T-SQL) DECLARE @var TYPE SET @var = val Batch / procédure @
MySQL (session) Aucune (implicite) SET @var = val Session entière @
MySQL (procédure) DECLARE var TYPE SET var = val Bloc BEGIN...END Aucun
PostgreSQL (PL/pgSQL) DECLARE v_var TYPE v_var := val Bloc DO / fonction v_ (convention)
Oracle (PL/SQL) DECLARE v_var TYPE; v_var := val; Bloc anonyme / procédure v_ (convention)

Cas d'usage concrets en data analyse

Les variables SQL simplifient plusieurs scénarios réels fréquemment rencontrés dans un contexte data.

Paramétrer une période d'analyse

DECLARE @debut DATE = '2026-01-01';
DECLARE @fin   DATE = '2026-06-30';

SELECT
  DATE_TRUNC('month', date_commande) AS mois,
  SUM(montant) AS ca_mensuel
FROM commandes
WHERE date_commande BETWEEN @debut AND @fin
GROUP BY 1
ORDER BY 1;

On change la plage temporelle en modifiant 2 lignes seulement. C'est particulièrement utile pour les rapports mensuels ou trimestriels.

Stocker un résultat intermédiaire

DECLARE @ca_total DECIMAL(12,2);
SELECT @ca_total = SUM(montant) FROM commandes WHERE annee = 2025;

SELECT
  region,
  SUM(montant) AS ca_region,
  ROUND(SUM(montant) / @ca_total * 100, 2) AS part_pct
FROM commandes
WHERE annee = 2025
GROUP BY region;

Sans variable, on devrait calculer SUM(montant) deux fois — une fois pour chaque contexte — ou utiliser une sous-requête. La variable évite la redondance. Pour aller plus loin sur ce type de patterns, consultez notre guide sur les sous-requêtes SQL corrélées et imbriquées.

Contrôler une boucle dans une procédure

Les variables numériques servent aussi de compteurs dans les boucles WHILE (T-SQL) ou LOOP (PL/pgSQL). C'est un cas classique dans les procédures stockées SQL pour traiter des données par lots.

DECLARE @i INT = 1;

WHILE @i <= 10
BEGIN
  INSERT INTO log_test (valeur) VALUES (@i);
  SET @i = @i + 1;
END;

Erreurs courantes à éviter

1. Confondre variable locale et variable session en MySQL. Une variable @var sans DECLARE est de session et peut conserver une ancienne valeur d'une requête précédente. Toujours initialiser explicitement avant utilisation.

2. Oublier le type lors du DECLARE. En T-SQL et PL/pgSQL, le type est obligatoire. Utiliser un type trop petit (ex. INT pour un CA en millions) provoque des erreurs d'overflow silencieuses dans certains contextes.

3. Utiliser SET avec une sous-requête qui retourne plusieurs lignes. En T-SQL, SET @var = (SELECT ...) génère une erreur si la sous-requête retourne plus d'1 ligne. Toujours s'assurer que la requête est scalaire, ou utiliser TOP 1 avec un ORDER BY explicite.

4. Négliger la portée. Une variable déclarée dans un batch T-SQL n'est pas accessible dans un batch suivant. Si le script est exécuté en plusieurs batches séparés par GO, la variable doit être redéclarée.

Questions fréquentes

Peut-on utiliser des variables dans une requête SQL standard (hors procédure) ?

En T-SQL et MySQL, oui — les variables utilisateur et les variables de batch fonctionnent en dehors des procédures. En PostgreSQL standard (SQL pur, sans PL/pgSQL), les variables locales nécessitent un bloc DO ou une fonction. Il n'existe pas de DECLARE en SQL ISO pur.

Quelle différence entre SET et SELECT pour affecter une variable ?

SET affecte une valeur unique et génère une erreur si la source retourne plusieurs lignes. SELECT est plus permissif : il affecte la dernière valeur retournée sans erreur si plusieurs lignes correspondent. SET est recommandé pour la rigueur, SELECT pour capturer un résultat de requête scalaire.

Les variables SQL sont-elles indexées ou optimisées par le moteur ?

Non. Le moteur SQL ne peut pas utiliser les statistiques de colonne pour optimiser un filtre basé sur une variable, car la valeur n'est connue qu'à l'exécution. En SQL Server, cela peut provoquer un "parameter sniffing" indésirable dans les procédures stockées. Pour les requêtes très sensibles à la performance, on peut forcer la recompilation avec OPTION (RECOMPILE).

Les variables sont-elles compatibles avec les CTEs ?

Oui, on peut utiliser une variable déclarée avant la CTE dans les filtres de la CTE ou de la requête finale. La variable doit simplement être déclarée et initialisée avant le bloc WITH.

Comment déboguer la valeur d'une variable en cours de script ?

En T-SQL, utilisez PRINT @ma_variable ou SELECT @ma_variable AS debug_val. En PL/pgSQL, utilisez RAISE NOTICE '% ', v_ma_variable. En MySQL, un simple SELECT @ma_variable; dans le script affiche la valeur courante.

Conclusion

Les variables SQL sont un outil de scripting fondamental, que ce soit pour paramétrer une période, stocker un résultat intermédiaire ou contrôler une logique conditionnelle. Maîtriser DECLARE et SET — avec leurs variations selon SQL Server, MySQL et PostgreSQL — vous distingue des candidats qui ne pensent qu'en termes de requêtes isolées.

En entretien, mentionner l'usage de variables dans un contexte de reporting automatisé ou de traitement par lot montre une maturité technique appréciée. Entraînez-vous directement sur entretien-data.org avec des exercices pratiques pour consolider ces notions avant votre prochain entretien.

Prêt à vous entraîner ?

50 exercices SQL interactifs avec éditeur en ligne, chronomètre et feedback IA.

Voir les exercices