Leçon 12.1 · Temps de lecture : ~10 min
Cette leçon est consacrée au traitement pratique des chaînes en SQL. Vous allez apprendre à nettoyer des valeurs textuelles, normaliser la casse, extraire des fragments utiles et construire des champs lisibles pour l'analyse et le reporting. Nous verrons des scénarios concrets sur la base Sakila. À la fin de la leçon, vous serez capable de préparer des données textuelles pour l'analyse directement en SQL.
Dans le module précédent, nous avons parlé de la qualité du code SQL et de la performance des requêtes. Nous passons maintenant à l'analytique appliquée : dans les données réelles, les champs texte ne doivent pas seulement être affichés, ils doivent d'abord être mis en forme.
Le traitement pratique des chaînes est nécessaire pour les rapports, la segmentation des utilisateurs, le nettoyage des référentiels, la préparation des exports et les contrôles de qualité des données. Ce sont précisément les tâches que rencontrent les analystes et développeurs au quotidien.
Les fonctions de chaîne de base sont utiles, mais leur vraie valeur apparaît lorsqu'on les applique à une tâche concrète. Par exemple, une même valeur d'e-mail peut servir à la vérification de qualité, à la segmentation par domaine et à la préparation d'un rapport marketing.
En pratique, le traitement de chaînes en SQL se résume souvent à quatre types de tâches :
Le plus souvent, on traite le texte par étapes :
Cette approche rend les requêtes plus prévisibles et plus simples à déboguer.
SELECT
LOWER(TRIM(email)) AS email_normalized
FROM customer
LIMIT 5;
Résultat : l'e-mail est nettoyé des espaces en bordure et converti en minuscules.
Le scénario le plus courant consiste à préparer une chaîne pour une analyse ultérieure. Pour cela, on utilise généralement TRIM(), LOWER(), UPPER() et REPLACE().
SELECT
customer_id,
email,
LOWER(TRIM(email)) AS email_normalized
FROM customer
LIMIT 10;
Remarque : même si les données semblent déjà propres, la normalisation est utile pour la comparaison, le regroupement et les traitements automatiques.
SELECT
address_id,
address,
TRIM(REPLACE(address, 'Street', 'St.')) AS address_cleaned
FROM address
LIMIT 10;
Résultat : l'adresse devient plus courte et plus homogène, ce qui est pratique pour les rapports et les interfaces.
Après le nettoyage, il faut souvent conserver uniquement la partie utile de la chaîne pour l'analyse. En MySQL, SUBSTRING(), LEFT(), RIGHT() et SUBSTRING_INDEX() sont particulièrement pratiques.
SELECT
customer_id,
email,
SUBSTRING_INDEX(LOWER(TRIM(email)), '@', -1) AS email_domain
FROM customer
LIMIT 10;
Résultat : la partie domaine est extraite de l'e-mail, par exemple example.com.
SELECT
film_id,
title,
LEFT(title, 5) AS title_prefix,
RIGHT(title, 5) AS title_suffix
FROM film
LIMIT 10;
Remarque : ces fragments sont utiles pour des heuristiques rapides, des contrôles de convention de nommage ou la création de libellés courts.
En analytique, on a souvent besoin de libellés lisibles plutôt que de champs bruts. Pour cela, CONCAT() et CONCAT_WS() sont très utiles.
SELECT
customer_id,
CONCAT_WS(
' | ',
CONCAT_WS(' ', first_name, last_name),
LOWER(TRIM(email)),
CONCAT('store=', store_id)
) AS customer_label
FROM customer
LIMIT 10;
Résultat : vous obtenez un champ texte compact, pratique pour les rapports d'administration, les exports et les outils internes.
Le traitement de chaînes ne sert pas seulement au formatage, mais aussi à la validation de base. SQL ne remplace pas un système de validation complet, mais il permet de trouver rapidement des valeurs suspectes.
@SELECT
customer_id,
email
FROM customer
WHERE INSTR(LOWER(TRIM(email)), '@') = 0;
Résultat : la requête retourne les enregistrements où l'e-mail ne contient pas le séparateur obligatoire.
SELECT
film_id,
title,
CHAR_LENGTH(title) AS title_length
FROM film
WHERE CHAR_LENGTH(title) > 20
ORDER BY title_length DESC
LIMIT 10;
Remarque : ce type de contrôle est utile pour repérer des valeurs trop longues pour des cartes, des écrans d'interface ou des limites d'export.
Regroupons maintenant plusieurs techniques dans une seule requête analytique. Supposons que nous voulions identifier les domaines les plus fréquents chez les clients.
SELECT
SUBSTRING_INDEX(LOWER(TRIM(email)), '@', -1) AS email_domain,
COUNT(*) AS customer_count
FROM customer
WHERE email IS NOT NULL
AND INSTR(LOWER(TRIM(email)), '@') > 0
GROUP BY SUBSTRING_INDEX(LOWER(TRIM(email)), '@', -1)
ORDER BY customer_count DESC, email_domain
LIMIT 15;
Résultat : vous obtenez la distribution des clients par domaine e-mail. Cette requête est utile pour l'exploration d'audience, la détection d'anomalies et la préparation de segments de communication.
Cet exemple illustre une idée importante : les fonctions de chaîne sont particulièrement puissantes en chaîne. On nettoie d'abord la valeur, on vérifie ensuite sa structure, on extrait le domaine, puis on agrège.
CTE ou une sous-requête pour améliorer la lisibilité.SUBSTRING_INDEX() est pratique en MySQL, mais d'autres SGBD peuvent exiger une syntaxe différente.Points clés de cette leçon :
TRIM, LOWER, REPLACE, SUBSTRING_INDEX, LEFT, RIGHT et CONCAT_WS sont particulièrement utiles au quotidien.Parce que même des données visuellement propres peuvent contenir des espaces en trop, une casse incohérente ou de petites anomalies de format. La normalisation rend le filtrage, les comparaisons et les regroupements plus fiables.
Le domaine permet de segmenter rapidement les utilisateurs, d'identifier des adresses d'entreprise et de repérer des anomalies. C'est un moyen simple de transformer un champ texte brut en variable analytique.
Lorsque ces champs sont nécessaires pour des rapports, des interfaces d'administration, des exports ou des analyses intermédiaires. Dans ces cas, la construction de libellés côté SQL réduit la post-traitance et rapproche la logique des données.
En général : nettoyage du texte, normalisation du format, extraction de caractéristiques et validation des données. En pratique, ces fonctions sont souvent utilisées avant les regroupements, segmentations et constructions de champs de rapport.
TRIM() et LOWER() avant un GROUP BY sur un champ texte ?Sans normalisation, une même valeur peut se retrouver dans plusieurs groupes à cause d'une casse différente ou d'espaces superflus. Le pré-nettoyage améliore la justesse de l'agrégation et réduit les faux écarts.
SUBSTRING_INDEX() avec un exemple pratique ?En MySQL, cette fonction est pratique pour extraire rapidement une partie de chaîne selon un séparateur. Par exemple, on peut extraire le domaine d'un e-mail et l'utiliser immédiatement pour la segmentation utilisateurs ou le reporting analytique.
Dans la prochaine leçon, nous passerons à l'utilisation de SQL pour l'analyse et le reporting, et nous verrons comment transformer des données préparées en insights métier utiles.