Leçon 3.3 · Temps de lecture : ~8 min
Dans cette leçon, vous allez apprendre les fonctions mathematiques SQL essentielles qui permettent d'effectuer des calculs et de transformer des donnees numeriques directement dans les requetes. Nous verrons l'arrondi, le modulo, les puissances, les racines et la comparaison de valeurs, avec des exemples pratiques sur Sakila. A la fin de la leçon, vous pourrez appliquer ces fonctions avec confiance dans des cas analytiques et metier.
Fonctions mathematiques essentielles en SQL
Les fonctions mathematiques en SQL sont utilisees pour effectuer differents calculs sur des donnees numeriques. Elles permettent d'arrondir des valeurs, de trouver des minimums et des maximums, de calculer des restes de division, et bien plus encore. Cette lecon presente les fonctions mathematiques les plus courantes, avec des exemples bases sur la base Sakila.
Important : les donnees numeriques en SQL peuvent avoir des types differents (INTEGER, REAL/FLOAT, DECIMAL/NUMERIC). Une meme formule peut produire des resultats differents selon le type de donnee (par exemple a cause de la division entiere, de l'arrondi et de la precision de stockage). Si le type n'est pas pris en compte, le resultat peut etre different de celui attendu.
Fonctions mathematiques courantes
ABS() - Renvoie la valeur absolue d'un nombre.
Syntaxe :
ABS(number)
Exemple :
SELECT ABS(amount - 5) AS abs_difference
FROM payment
LIMIT 3;
Resultat : Renvoie la difference absolue entre amount et 5.
CEIL() / CEILING() - Arrondit un nombre vers le haut (a l'entier le plus proche).
Syntaxe :
CEIL(number)
CEILING(number)
Exemple :
SELECT CEIL(amount) AS rounded_up
FROM payment
LIMIT 3;
Resultat : Arrondit amount vers le haut a l'entier le plus proche.
FLOOR() - Arrondit un nombre vers le bas (a l'entier le plus proche).
Syntaxe :
FLOOR(number)
Exemple :
SELECT FLOOR(amount) AS rounded_down
FROM payment
LIMIT 3;
Resultat : Arrondit amount vers le bas a l'entier le plus proche.
ROUND() - Arrondit un nombre a un nombre defini de decimales.
Syntaxe :
ROUND(number, decimals)
Exemple :
SELECT ROUND(amount, 1) AS rounded_amount
FROM payment
LIMIT 3;
Resultat : Arrondit amount a une decimale.
POWER() / POW() - Eleve un nombre a une puissance.
Syntaxe :
POWER(number, exponent)
POW(number, exponent)
Exemple :
SELECT POWER(amount, 2) AS squared_amount
FROM payment
LIMIT 3;
Resultat : Met amount au carre.
SQRT() - Renvoie la racine carree d'un nombre.
Syntaxe :
SQRT(number)
Exemple :
SELECT SQRT(amount) AS sqrt_amount
FROM payment
LIMIT 3;
Resultat : Renvoie la racine carree de amount.
PI() - Renvoie la constante mathematique pi.
Syntaxe :
PI()
Exemple :
SELECT PI() AS pi_value;
Resultat : Renvoie la valeur de pi (environ 3.141592653589793).
MOD() - Renvoie le reste d'une division.
Syntaxe :
MOD(dividend, divisor)
Exemple :
SELECT MOD(payment_id, 5) AS mod_result
FROM payment
LIMIT 3;
Resultat : Renvoie le reste de la division de payment_id par 5.
Exemple d'utilisation d'une fonction dans WHERE (trouver les valeurs paires) :
SELECT payment_id, amount
FROM payment
WHERE MOD(payment_id, 2) = 0
LIMIT 10;
Resultat : Renvoie uniquement les lignes avec un payment_id pair.
SIGN() - Renvoie le signe d'un nombre (-1, 0 ou 1).
Syntaxe :
SIGN(number)
Exemple :
SELECT SIGN(amount - 5) AS sign_value
FROM payment
LIMIT 3;
Resultat : Renvoie -1 si le resultat est negatif, 0 s'il est nul, et 1 s'il est positif.
GREATEST() - Renvoie la plus grande valeur parmi les valeurs fournies (MySQL, PostgreSQL).
Syntaxe :
GREATEST(value1, value2, ...)
Exemple :
SELECT GREATEST(amount, 5) AS max_value
FROM payment
LIMIT 3;
Resultat : Renvoie la plus grande des deux valeurs : amount ou 5.
Important (NULL) : le comportement de GREATEST() depend du SGBD.
- En MySQL/MariaDB, si au moins un argument vaut
NULL, le resultat est generalementNULL. - En PostgreSQL, les arguments
NULLsont ignores, etNULLn'est renvoye que si tous les arguments sontNULL.
LEAST() - Renvoie la plus petite valeur parmi les valeurs fournies (MySQL, PostgreSQL).
Syntaxe :
LEAST(value1, value2, ...)
Exemple :
SELECT LEAST(amount, 5) AS min_value
FROM payment
LIMIT 3;
Resultat : Renvoie la plus petite des deux valeurs : amount ou 5.
Important (NULL) : pour LEAST(), les memes differences entre SGBD s'appliquent que pour GREATEST().
Pour rendre le comportement previsible dans des requetes multi-SGBD, on utilise souvent COALESCE(), par exemple :
SELECT GREATEST(COALESCE(value1, 0), COALESCE(value2, 0));
RAND() - Renvoie un nombre aleatoire entre 0 et 1.
Syntaxe :
RAND()
Exemple :
SELECT RAND() AS random_value
FROM payment
LIMIT 3;
Resultat : Renvoie un nombre aleatoire entre 0 et 1.
Important : il ne faut pas supposer que RAND() sera systematiquement recalcule pour chaque ligne dans tous les contextes. Selon le SGBD, le plan d'execution, l'utilisation de CTE/sous-requetes et d'autres facteurs, une meme valeur aleatoire peut etre reutilisee pour plusieurs lignes.
Si vous avez absolument besoin de valeurs differentes par ligne, verifiez le comportement sur votre SGBD et avec la forme exacte de la requete.
Cas d'utilisation pratiques
Arrondir les montants de paiement : Utilisez
ROUND(amount, 0)pour arrondir les montants a l'entier.Trouver des enregistrements via un reste de division : Utilisez
MOD(payment_id, 2)dansWHERE(par exempleMOD(payment_id, 2) = 0) pour trouver les identifiants pairs.Calculer une racine carree : Utilisez
SQRT(amount)pour analyser la distribution des paiements.Comparer des valeurs : Utilisez
GREATEST()etLEAST()pour choisir la valeur maximale ou minimale parmi plusieurs valeurs.Controler le type de donnees : Si la precision est importante, convertissez explicitement vers le type souhaite (par exemple
CAST(value AS DECIMAL(10,2))) afin d'eviter les surprises liees aux calculs entiers et a l'arrondi.
FAQ
Quelle est la difference entre ROUND(), CEIL() et FLOOR() ?
ROUND() arrondit a la valeur la plus proche (ou au nombre de decimales indique), CEIL() arrondit toujours vers le haut, et FLOOR() toujours vers le bas.
Pourquoi des formules proches peuvent-elles donner des resultats differents ?
La raison principale est le type de donnees. Les types entiers et decimaux gerent differemment la division, l'arrondi et la precision.
Quand vaut-il mieux utiliser MOD() ?
MOD() est utile pour des controles periodiques, par exemple pour separer des enregistrements en groupes ou filtrer des identifiants pairs/impairs.
Pourquoi faut-il tenir compte des differences SGBD pour GREATEST() et LEAST() ?
Parce que la gestion de NULL peut differer entre MySQL/MariaDB et PostgreSQL. Pour un comportement previsible, on utilise souvent COALESCE().
Questions d'entretien
Comment choisir la bonne fonction d'arrondi pour une regle metier ?
On definit d'abord la regle : arrondi classique (ROUND), toujours vers le haut (CEIL) ou toujours vers le bas (FLOOR). Ensuite, on verifie l'impact sur les indicateurs des rapports.
Quels sont les risques des calculs sans conversion explicite de type ?
On peut obtenir des resultats inattendus a cause de la division entiere ou d'une perte de precision. Dans les calculs critiques, des conversions explicites comme CAST(... AS DECIMAL(...)) sont plus sures.
Que fait SIGN() et dans quels cas est-ce utile ?
SIGN() renvoie -1, 0 ou 1 selon le signe de la valeur. C'est pratique pour classer rapidement des ecarts en negatif, nul ou positif.
Pourquoi utiliser RAND() avec prudence dans des requetes analytiques ?
Selon le SGBD et le plan d'execution, la valeur aleatoire peut ne pas etre recalculee ligne par ligne comme attendu. Il faut valider ce comportement sur votre moteur.
Points cles de cette lecon :
- Les fonctions mathematiques SQL permettent d'effectuer des calculs et des transformations directement dans la requete.
ROUND,CEILetFLOORrepondent a des besoins d'arrondi differents selon la regle metier.MOD,POWERetSQRTsont utiles pour l'analyse et les controles de donnees.- Les types de donnees influencent fortement la precision et le resultat final des calculs.
- Pour les requetes multi-SGBD, il faut prendre en compte les differences de comportement avec
NULL.
Dans la prochaine leçon, nous passerons aux fonctions de date et d'heure pour manipuler les valeurs temporelles en SQL.