Tutoriel sur les fonctions de fenêtrage SQL
Pour aller plus loin : ROW_NUMBER, RANK, LEAD, LAG.
Maîtrisez toutes les fonctions SQL essentielles : transformation, chaînes de caractères, dates, mathématiques, conditionnelles et agrégation. Exemples pratiques pour chaque fonction.
Ces fonctions convertissent une valeur d'un type de données à un autre, essentielles pour harmoniser les formats avant analyse.
CASTSELECT CAST('2023-10-25' AS DATE) AS date_converted;
CONVERTSimilaire à CAST, mais avec une syntaxe spécifique à certains SGBD comme SQL Server.
SELECT CONVERT(DATE, '2023-10-25') AS date_converted;
CAST est standard SQL et portable. CONVERT est spécifique à certains SGBD (SQL Server, Sybase) mais offre plus d'options de formatage.
CONCATConcatène deux ou plusieurs chaînes de caractères.
SELECT CONCAT('Bonjour', ' ', 'le monde') AS message;
SUBSTRINGExtrait une sous-chaîne d'une chaîne de caractères.
SELECT SUBSTRING('Bonjour le monde', 9, 2) AS sous_chaine; -- Résultat: "le"
LENGTH (ou LEN)Retourne la longueur d'une chaîne de caractères.
SELECT LENGTH('Bonjour') AS longueur; -- Résultat: 7
UPPER et LOWERConvertit une chaîne en majuscules ou en minuscules.
SELECT UPPER('Bonjour') AS majuscules; -- Résultat: "BONJOUR"
SELECT LOWER('BONJOUR') AS minuscules; -- Résultat: "bonjour"
TRIM, LTRIM, RTRIMSupprime les espaces en début et/ou fin de chaîne.
SELECT TRIM(' Bonjour ') AS sans_espaces; -- Résultat: "Bonjour"
SELECT LTRIM(' Bonjour') AS sans_espaces_gauche; -- Résultat: "Bonjour"
SELECT RTRIM('Bonjour ') AS sans_espaces_droite; -- Résultat: "Bonjour"
REPLACERemplace toutes les occurrences d'une sous-chaîne par une autre.
SELECT REPLACE('Bonjour le monde', 'le', 'la') AS remplace; -- Résultat: "Bonjour la monde"

schéma des fonctions CONCAT, SUBSTRING, TRIM, REPLACE
CURRENT_DATE (ou GETDATE)Retourne la date actuelle.
SELECT CURRENT_DATE AS aujourdhui;
DATEADDAjoute un intervalle de temps à une date.
SELECT DATEADD(DAY, 5, '2023-10-25') AS date_ajoutee; -- Ajoute 5 jours
DATEDIFFCalcule la différence entre deux dates.
SELECT DATEDIFF(DAY, '2023-10-25', '2023-11-01') AS difference_jours; -- Résultat: 7
DATEPARTExtrait une partie spécifique d'une date (année, mois, jour, etc.).
SELECT DATEPART(YEAR, '2023-10-25') AS annee; -- Résultat: 2023
FORMATFormate une date selon un modèle spécifique.
SELECT FORMAT('2023-10-25', 'dd/MM/yyyy') AS date_formatee; -- Résultat: "25/10/2023"
MySQL utilise DATE_ADD(), DATEDIFF() et DATE_FORMAT(). PostgreSQL utilise INTERVAL, AGE() et TO_CHAR(). Les concepts sont similaires, les noms diffèrent.
ROUNDArrondit un nombre à un certain nombre de décimales.
SELECT ROUND(3.14159, 2) AS arrondi; -- Résultat: 3.14
CEILING et FLOORArrondit un nombre à l'entier supérieur ou inférieur.
SELECT CEILING(3.14159) AS plafond; -- Résultat: 4
SELECT FLOOR(3.14159) AS plancher; -- Résultat: 3
ABSRetourne la valeur absolue d'un nombre.
SELECT ABS(-10) AS absolue; -- Résultat: 10
POWERCalcule la puissance d'un nombre.
SELECT POWER(2, 3) AS puissance; -- Résultat: 8
SQRTCalcule la racine carrée d'un nombre.
SELECT SQRT(16) AS racine; -- Résultat: 4
CASEPermet de définir des conditions dans une requête (équivalent du IF/THEN/ELSE).
SELECT nom,
CASE
WHEN age < 18 THEN 'Mineur'
ELSE 'Majeur'
END AS statut
FROM utilisateurs;
COALESCERetourne la première valeur non nulle dans une liste. Idéal pour traiter les NULL.
SELECT COALESCE(NULL, 'Valeur par défaut') AS valeur; -- Résultat: "Valeur par défaut"
NULLIFRetourne NULL si deux valeurs sont égales. Utile pour éviter la division par zéro.
SELECT NULLIF(10, 10) AS resultat; -- Résultat: NULL
SELECT 10 / NULLIF(0, 0) AS pas_erreur; -- Évite division par zéro
Combinez NULLIF et COALESCE pour gérer les divisions par zéro :SELECT COALESCE(ventes / NULLIF(nb_clients, 0), 0) AS moyenne_par_client FROM stats;
COUNTCompte le nombre de lignes.
SELECT COUNT(*) AS total_lignes FROM utilisateurs;
SELECT COUNT(DISTINCT ville) AS villes_distinctes FROM utilisateurs;
SUMCalcule la somme des valeurs d'une colonne.
SELECT SUM(salaire) AS total_salaires FROM employes;
AVGCalcule la moyenne des valeurs d'une colonne.
SELECT AVG(salaire) AS moyenne_salaires FROM employes;
MIN et MAXRetourne la valeur minimale ou maximale d'une colonne.
SELECT MIN(salaire) AS salaire_min, MAX(salaire) AS salaire_max FROM employes;
GROUP_CONCAT (ou STRING_AGG)Concatène les valeurs d'une colonne pour chaque groupe.
-- SQL Server, PostgreSQL
SELECT departement, STRING_AGG(nom, ', ') AS employes
FROM employes
GROUP BY departement;
-- MySQL
SELECT departement, GROUP_CONCAT(nom SEPARATOR ', ') AS employes
FROM employes
GROUP BY departement;
| Catégorie | Fonction | Description | Exemple |
|---|---|---|---|
| Transformation | CAST |
Convertit un type de données | CAST('2023-10-25' AS DATE) |
CONVERT |
Convertit (syntaxe spécifique) | CONVERT(DATE, '2023-10-25') |
|
| Chaînes | CONCAT |
Concatène des chaînes | CONCAT('A', 'B') |
SUBSTRING |
Extrait une sous-chaîne | SUBSTRING('Bonjour', 2, 3) |
|
LENGTH |
Longueur d'une chaîne | LENGTH('Bonjour') |
|
UPPER/LOWER |
Majuscules/minuscules | UPPER('test') |
|
TRIM |
Supprime les espaces | TRIM(' test ') |
|
REPLACE |
Remplace une sous-chaîne | REPLACE('abc', 'b', 'x') |
|
| Dates | CURRENT_DATE |
Date actuelle | CURRENT_DATE |
DATEADD |
Ajoute un intervalle | DATEADD(DAY, 5, '2023-10-25') |
|
DATEDIFF |
Différence entre dates | DATEDIFF(DAY, date1, date2) |
|
DATEPART |
Extrait une partie | DATEPART(YEAR, date) |
|
FORMAT |
Formate une date | FORMAT(date, 'dd/MM/yyyy') |
|
| Maths | ROUND |
Arrondit | ROUND(3.14159, 2) |
CEILING/FLOOR |
Entier sup/inf | CEILING(3.14) |
|
ABS |
Valeur absolue | ABS(-10) |
|
POWER |
Puissance | POWER(2, 3) |
|
SQRT |
Racine carrée | SQRT(16) |
|
| Conditionnelles | CASE |
Conditions | CASE WHEN age<18 THEN 'Mineur' END |
COALESCE |
Première non NULL | COALESCE(col, 'default') |
|
NULLIF |
NULL si égaux | NULLIF(a, b) |
|
| Agrégation | COUNT |
Compte les lignes | COUNT(*) |
SUM |
Somme | SUM(colonne) |
|
AVG |
Moyenne | AVG(colonne) |
|
MIN/MAX |
Min/Max | MIN(colonne) |
|
GROUP_CONCAT |
Concatène par groupe | STRING_AGG(nom, ', ') |
| Fonction | MySQL | PostgreSQL | SQL Server |
|---|---|---|---|
| Concaténation | CONCAT() ou || |
|| ou CONCAT() |
CONCAT() ou + |
| Longueur chaîne | CHAR_LENGTH() ou LENGTH() |
LENGTH() ou CHAR_LENGTH() |
LEN() |
| Date actuelle | CURDATE(), NOW() |
CURRENT_DATE, NOW() |
GETDATE(), SYSDATETIME() |
| Formatage date | DATE_FORMAT() |
TO_CHAR() |
FORMAT() |
| Concaténation groupe | GROUP_CONCAT() |
STRING_AGG() |
STRING_AGG() |
CAST, COALESCE, CASE, SUBSTRING).CAST est standard SQL, portable sur tous les SGBD. CONVERT est spécifique à certains SGBD (SQL Server, Sybase) mais offre des options de formatage supplémentaires. Pour du code portable, préférez CAST.
Utilisez NULLIF : SELECT valeur / NULLIF(diviseur, 0) FROM table; Retourne NULL au lieu d'une erreur. Combine avec COALESCE pour une valeur par défaut : COALESCE(valeur / NULLIF(diviseur, 0), 0).
MySQL : GROUP_CONCAT(nom SEPARATOR ', ')
PostgreSQL / SQL Server : STRING_AGG(nom, ', ')
Ces fonctions regroupent les valeurs d'une colonne en une seule chaîne par groupe.
EXTRACT(MONTH FROM date_column) (standard SQL)DATEPART(MONTH, date_column) (SQL Server)MONTH(date_column) (MySQL)
Tous retournent un entier (1-12 pour le mois, 4 chiffres pour l'année).
COUNT(*) compte toutes les lignes, y compris celles avec des NULL. COUNT(colonne) compte uniquement les lignes où la colonne n'est pas NULL. Pour compter les valeurs distinctes : COUNT(DISTINCT colonne).
Utilisez COALESCE(colonne, 'valeur_par_defaut') qui retourne la première valeur non NULL. Ou ISNULL(colonne, 'valeur_par_defaut') (SQL Server). Cela ne modifie pas la base, seulement l'affichage.
La maîtrise des fonctions SQL est essentielle pour tout analyste ou développeur de données. Ces fonctions vous permettent de transformer, nettoyer, calculer et agréger vos données directement dans la base, sans outils externes.