🙏 Aidez le projet à continuer. Le mois dernier, nous n'avons recueilli que 32 $ - juste de quoi payer les serveurs. Sans votre soutien, il n'y aura pas de nouvelles leçons ni de nouvelles fonctionnalités. Soutenir maintenant →
Code SQL copié dans le presse-papiers
RU EN PT

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 SQL essentielles

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 generalement NULL.
  • En PostgreSQL, les arguments NULL sont ignores, et NULL n'est renvoye que si tous les arguments sont NULL.

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

  1. Arrondir les montants de paiement : Utilisez ROUND(amount, 0) pour arrondir les montants a l'entier.

  2. Trouver des enregistrements via un reste de division : Utilisez MOD(payment_id, 2) dans WHERE (par exemple MOD(payment_id, 2) = 0) pour trouver les identifiants pairs.

  3. Calculer une racine carree : Utilisez SQRT(amount) pour analyser la distribution des paiements.

  4. Comparer des valeurs : Utilisez GREATEST() et LEAST() pour choisir la valeur maximale ou minimale parmi plusieurs valeurs.

  5. 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, CEIL et FLOOR repondent a des besoins d'arrondi differents selon la regle metier.
  • MOD, POWER et SQRT sont 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.

Essayez de resoudre les exercices suivants pour consolider ce que vous avez appris dans cette lecon.

  1. Calculer l'aire d'un cercle
  2. Calculer le périmètre d'un cercle
  3. Trouver les clients avec des IDs pairs