Chapitre 11Projet SunuShop

Fonctions MySQL — texte, dates, nombres, CASE WHEN

Fonctions texte (CONCAT, UPPER, TRIM, SUBSTRING, REPLACE, LENGTH). Fonctions date (NOW, DATE_FORMAT, DATEDIFF, DATE_ADD, YEAR/MONTH). Fonctions numériques (ROUND, FORMAT). CASE WHEN. COALESCE, IFNULL.

Concepts Théoriques

MySQL offre des dizaines de fonctions intégrées pour transformer les données directement dans vos requêtes. Sans elles, vous récupérez des données brutes (un timestamp "2026-03-24 14:30:00", un prix "15000.00", un nom en deux colonnes) et vous devez les formater côté application. Avec les fonctions MySQL, le formatage se fait dans la requête — la donnée arrive prête à afficher.

Ces fonctions sont aussi indispensables pour le reporting : calculer l'ancienneté d'un client, classer les produits par gamme de prix, ou afficher "Il y a 3 jours" au lieu d'un timestamp brut.

Fonctions de texte

  • CONCAT(a, b, c) — coller des textes bout à bout. CONCAT(first_name, ' ', last_name) → "Fatou Sall". Attention : si UN seul argument est NULL, le résultat entier est NULL. CONCAT('Dakar', NULL, 'Sénégal') → NULL.
  • CONCAT_WS(séparateur, a, b, c) — coller avec un séparateur fixe. Le "WS" signifie "With Separator". L'avantage : il IGNORE les NULL. CONCAT_WS(', ', 'Dakar', NULL, 'Sénégal') → "Dakar, Sénégal".
  • UPPER(texte) / LOWER(texte) — convertir en majuscules / minuscules. UPPER('dakar') → 'DAKAR'. Utile pour normaliser les comparaisons.
  • TRIM(texte) — supprimer les espaces en début et fin. TRIM(' Dakar ') → 'Dakar'. LTRIM et RTRIM pour un seul côté.
  • SUBSTRING(texte, début, longueur) — extraire une portion. SUBSTRING('Sénégal', 1, 3) → 'Sén'. Le premier caractère est à la position 1 (pas 0 comme en PHP/JS).
  • LEFT(texte, n) / RIGHT(texte, n) — les n premiers / derniers caractères. LEFT('Bonjour', 3) → 'Bon'.
  • LENGTH(texte) / CHAR_LENGTH(texte) — LENGTH compte les octets (un "é" fait 2 octets en UTF-8), CHAR_LENGTH compte les caractères. Préférez CHAR_LENGTH pour l'UTF-8.
  • REPLACE(texte, ancien, nouveau) — remplacer toutes les occurrences. REPLACE('café touba', 'touba', 'TOUBA') → 'café TOUBA'.
  • GROUP_CONCAT(colonne ORDER BY ... SEPARATOR ', ') — concaténer les valeurs d'un groupe en une seule chaîne. Vu au chapitre 8 pour les tags.

Fonctions de date

Les dates sont au cœur du reporting. MySQL les manipule nativement, sans passer par PHP.

  • NOW() — date et heure actuelles : 2026-03-24 14:30:00.
  • CURDATE() — date seule : 2026-03-24.
  • DATE_FORMAT(date, format) — formater une date pour l'affichage. Les codes : %d = jour (01-31), %m = mois (01-12), %Y = année 4 chiffres, %H = heure 24h, %i = minutes, %s = secondes, %M = nom du mois (anglais), %W = nom du jour (anglais). DATE_FORMAT(NOW(), '%d/%m/%Y à %Hh%i') → "24/03/2026 à 14h30".
  • DATEDIFF(date1, date2) — nombre de jours entre deux dates. DATEDIFF(NOW(), '2026-01-01') = jours écoulés depuis le 1er janvier. DATEDIFF retourne un entier positif si date1 > date2, négatif sinon.
  • TIMESTAMPDIFF(unité, date1, date2) — différence dans l'unité choisie. TIMESTAMPDIFF(MONTH, created_at, NOW()) = mois d'ancienneté. Unités : YEAR, MONTH, DAY, HOUR, MINUTE, SECOND.
  • DATE_ADD(date, INTERVAL n UNIT) / DATE_SUB(...) — ajouter/soustraire du temps. DATE_ADD(NOW(), INTERVAL 7 DAY) = dans 7 jours. DATE_SUB(NOW(), INTERVAL 1 MONTH) = il y a un mois.
  • YEAR(date), MONTH(date), DAY(date) — extraire une composante. YEAR('2026-03-24') → 2026. Très utile dans GROUP BY pour regrouper par mois : GROUP BY YEAR(created_at), MONTH(created_at).
  • DAYNAME(date) — nom du jour en anglais : DAYNAME('2026-03-24') → 'Tuesday'.
  • LAST_DAY(date) — dernier jour du mois : LAST_DAY('2026-03-01') → '2026-03-31'.

Fonctions numériques

  • ROUND(nombre, décimales) — arrondir. ROUND(15234.567, 2) → 15234.57. ROUND(15234.567, 0) → 15235. ROUND(15234.567, -2) → 15200.
  • CEIL(nombre) / FLOOR(nombre) — arrondir vers le haut / vers le bas. CEIL(4.01) → 5, FLOOR(4.99) → 4.
  • FORMAT(nombre, décimales) — formater avec séparateurs de milliers. FORMAT(1500000, 0) → "1,500,000". Attention : FORMAT retourne une STRING, pas un nombre — ne l'utilisez pas dans les calculs, seulement pour l'affichage final.
  • ABS(nombre) — valeur absolue. ABS(-42) → 42.
  • MOD(a, b) ou a % b — modulo (reste de la division). MOD(17, 5) → 2.

CAST et CONVERT — conversions de types

CAST(valeur AS type) convertit une valeur d'un type à un autre. CAST('2026-03-24' AS DATE) convertit une string en date. CAST(price AS SIGNED) convertit un DECIMAL en entier. Utile quand MySQL traite un nombre comme du texte (résultat de GROUP_CONCAT par exemple).

CASE WHEN — le if/else du SQL

CASE WHEN crée une colonne conditionnelle — c'est la structure la plus puissante pour le reporting :

CASE WHEN condition1 THEN resultat1 WHEN condition2 THEN resultat2 ELSE resultat_defaut END

Vous pouvez imbriquer des CASE WHEN, les utiliser dans ORDER BY (trier par statut personnalisé), dans GROUP BY, et même dans UPDATE.

COALESCE et IFNULL — gérer les NULL proprement

  • COALESCE(val1, val2, val3, ...) — retourne la PREMIÈRE valeur NON NULL de la liste. COALESCE(compare_price, price) retourne l'ancien prix si disponible, sinon le prix actuel. COALESCE(phone, email, 'Aucun contact') essaie le téléphone, puis l'email, puis un texte par défaut.
  • IFNULL(valeur, remplacement) — si la valeur est NULL, retourner le remplacement. IFNULL(phone, 'Non renseigné'). C'est un COALESCE à 2 arguments.

La différence : COALESCE est le standard SQL (fonctionne partout), IFNULL est spécifique MySQL.