Développement Web

Guide : Les bases de données MySQL pour débutants

13 دقائق للقراءة

Prérequis

  • Niveau : aucun en SQL ; à l’aise avec un terminal ou phpMyAdmin.
  • Outils : XAMPP / WAMP / Laragon (MySQL ou MariaDB), ou MySQL 8 installé seul. DBeaver ou HeidiSQL en client graphique alternatif.
  • Temps estimé : 1 h 30.

Pourquoi MySQL ?

MySQL (et son fork MariaDB) reste l’une des bases de données relationnelles les plus déployées du web. WordPress (~43 % des sites web mondiaux) repose dessus, ainsi que d’innombrables ERP, CRM et applications métier. Apprendre MySQL, c’est apprendre SQL — qui se transpose ensuite à PostgreSQL, SQL Server, SQLite et BigQuery avec très peu d’écart.

MySQL : la base de données la plus populaire du web

MySQL stocke les données d’une part très importante du web : WordPress (~43 % des sites mondiaux selon W3Techs), de nombreux ERP/CRM, et historiquement Facebook (qui en utilise toujours pour certaines parties). C’est une base de données relationnelle : les données sont organisées en tables avec des lignes et des colonnes, comme un tableur Excel structuré.

Installer et accéder à MySQL

Voici la mise en pratique pour Installer et accéder à MySQL. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.

# Avec XAMPP (Windows/Mac) : MySQL est inclus, lancez-le depuis le panneau de contrôle
# Accédez à phpMyAdmin : http://localhost/phpmyadmin

# En ligne de commande :
mysql -u root -p

Créer une base de données et une table

Voici la mise en pratique pour Créer une base de données et une table. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.

-- Créer la base de données
CREATE DATABASE ecole_formation;

-- L'utiliser
USE ecole_formation;

-- Créer une table "etudiants"
CREATE TABLE etudiants (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nom VARCHAR(100) NOT NULL,
    prenom VARCHAR(100) NOT NULL,
    email VARCHAR(150) UNIQUE,
    telephone VARCHAR(15),
    formation VARCHAR(100),
    date_inscription DATE DEFAULT CURRENT_DATE,
    actif BOOLEAN DEFAULT TRUE
);

-- Créer une table "formations"
CREATE TABLE formations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nom VARCHAR(150) NOT NULL,
    duree_heures INT,
    prix DECIMAL(10, 2),
    categorie VARCHAR(50)
);

📌 Types de données courants

Type Usage Exemple
INT Nombres entiers 25, 1000
VARCHAR(n) Texte court Noms, emails
TEXT Texte long Descriptions
DECIMAL(10,2) Prix, montants 15000.00 FCFA
DATE Dates 2026-03-15
BOOLEAN Vrai/Faux TRUE, FALSE

CRUD : les 4 opérations fondamentales

CREATE — Insérer des données

-- Insérer un étudiant
INSERT INTO etudiants (nom, prenom, email, telephone, formation)
VALUES ('Diallo', 'Mamadou', 'mamadou@email.com', '771234567', 'Développement Web');

-- Insérer plusieurs en une fois
INSERT INTO etudiants (nom, prenom, email, formation) VALUES
    ('Ndiaye', 'Fatou', 'fatou@email.com', 'Marketing Digital'),
    ('Sow', 'Ibrahima', 'ibrahima@email.com', 'Cybersécurité'),
    ('Ba', 'Aissatou', 'aissatou@email.com', 'Design UX');

READ — Lire les données

-- Tous les étudiants
SELECT * FROM etudiants;

-- Colonnes spécifiques
SELECT nom, prenom, formation FROM etudiants;

-- Avec condition (WHERE)
SELECT * FROM etudiants WHERE formation = 'Développement Web';

-- Tri (ORDER BY)
SELECT * FROM etudiants ORDER BY nom ASC;

-- Limiter les résultats
SELECT * FROM etudiants LIMIT 10;

-- Recherche partielle (LIKE)
SELECT * FROM etudiants WHERE nom LIKE 'Di%';  -- Commence par "Di"
SELECT * FROM etudiants WHERE email LIKE '%gmail.com';  -- Terminé par gmail.com

-- Compter
SELECT COUNT(*) AS total FROM etudiants;
SELECT formation, COUNT(*) AS nombre FROM etudiants GROUP BY formation;

UPDATE — Modifier des données

-- Modifier un étudiant (par son ID)
UPDATE etudiants SET telephone = '781234567' WHERE id = 1;

-- Modifier plusieurs champs
UPDATE etudiants 
SET formation = 'IA & Data Science', actif = TRUE 
WHERE email = 'mamadou@email.com';

-- ⚠️ TOUJOURS utiliser WHERE sinon TOUS les enregistrements sont modifiés !

DELETE — Supprimer des données

-- Supprimer un étudiant
DELETE FROM etudiants WHERE id = 5;

-- Supprimer les inactifs
DELETE FROM etudiants WHERE actif = FALSE;

-- ⚠️ TOUJOURS utiliser WHERE sinon TOUTE la table est vidée !

Les JOIN : relier les tables entre elles

Voici la mise en pratique pour Les JOIN : relier les tables entre elles. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.

-- Ajouter une clé étrangère
ALTER TABLE etudiants ADD formation_id INT;
ALTER TABLE etudiants ADD FOREIGN KEY (formation_id) REFERENCES formations(id);

-- JOIN : récupérer étudiants avec le nom de leur formation
SELECT e.nom, e.prenom, f.nom AS formation, f.prix
FROM etudiants e
INNER JOIN formations f ON e.formation_id = f.id;

-- LEFT JOIN : tous les étudiants, même sans formation
SELECT e.nom, e.prenom, f.nom AS formation
FROM etudiants e
LEFT JOIN formations f ON e.formation_id = f.id;

Requêtes utiles au quotidien

Voici la mise en pratique pour Requêtes utiles au quotidien. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.

-- Étudiants inscrits ce mois
SELECT * FROM etudiants 
WHERE MONTH(date_inscription) = MONTH(CURRENT_DATE)
AND YEAR(date_inscription) = YEAR(CURRENT_DATE);

-- Formation la plus populaire
SELECT formation, COUNT(*) AS inscrits 
FROM etudiants 
GROUP BY formation 
ORDER BY inscrits DESC 
LIMIT 1;

-- Chiffre d'affaires par formation
SELECT f.nom, f.prix, COUNT(e.id) AS inscrits, 
       f.prix * COUNT(e.id) AS chiffre_affaires
FROM formations f
LEFT JOIN etudiants e ON e.formation_id = f.id
GROUP BY f.id;

⚠️ Sécurité : injections SQL

Ne JAMAIS insérer directement des données utilisateur dans une requête :

// ❌ DANGEREUX (injection SQL possible)
$sql = "SELECT * FROM etudiants WHERE email = '$email'";

// ✅ SÉCURISÉ (requête préparée)
$stmt = $pdo->prepare("SELECT * FROM etudiants WHERE email = ?");
$stmt->execute([$email]);

Erreurs fréquentes

UPDATE/DELETE sans WHERE → tout est modifié

Cause : oubli de la clause WHERE.
Solution : activez le mode safe-updates en local : SET SQL_SAFE_UPDATES = 1; dans MySQL Workbench. Toujours tester avec un SELECT avant un UPDATE/DELETE.

Encodage cassé (caractères « � » ou « ’ »)

Cause : base/connexion en latin1 alors que les données sont en UTF-8.
Solution : créez les tables en CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci et connectez-vous avec charset=utf8mb4 (PDO).

Identifiants accentués dans les noms de colonnes

Cause : téléphone, catégorie — MySQL les accepte en UTF-8 mais les exports CSV, certains ORM et drivers anciens cassent dessus.
Solution : utilisez exclusivement de l’ASCII pour les noms de tables et colonnes (telephone, categorie).

Injection SQL via concaténation

Cause : "WHERE email = '" . $_POST['email'] . "'".
Solution : utilisez les requêtes préparées avec prepare() et execute() en PDO ou mysqli_prepare() en mysqli.

Exercice pratique

🎯 Défi : Base de données pour un centre de formation

  1. Créez les tables : formations, etudiants, inscriptions
  2. Insérez 5 formations et 10 étudiants
  3. Écrivez une requête JOIN pour lister chaque étudiant avec sa formation
  4. Comptez le nombre d’étudiants par formation
  5. Trouvez la formation la plus chère et la moins chère

MySQL 8.4 LTS vs MariaDB 11.4 LTS en 2026

À Dakar, Abidjan ou Lomé, la majorité des hébergeurs mutualisés (LWS, Hostinger, IONOS, OVHcloud) proposent par défaut MariaDB. Si vous installez vous-même un serveur sur un VPS, vous avez le choix.

MySQL 8.4 LTS est sortie en avril 2024 chez Oracle. C’est la branche officielle à privilégier pour rester aligné avec les drivers et la documentation upstream. MariaDB 11.4 LTS est sortie en mai 2024 ; elle reste compatible binaire avec la majorité des requêtes MySQL et brille sur le moteur Aria et le clustering Galera. Pour un débutant qui apprend, peu importe : la syntaxe SQL fonctionne sur les deux. Vérifiez via SELECT VERSION(); avant d’écrire une requête spécifique.

Indexer correctement

Une table de 200 000 lignes peut répondre en 5 ms ou en 8 secondes selon la présence d’un index. La règle : indexez les colonnes utilisées dans WHERE, JOIN ON et ORDER BY.

CREATE INDEX idx_commandes_client_date ON commandes (client_id, date_commande);

Cet index composite couvre WHERE client_id = 42 ORDER BY date_commande DESC. L’ordre des colonnes compte : la plus sélective vient en premier. Évitez d’indexer une colonne à deux valeurs (sexe, actif) : la cardinalité est trop faible.

EXPLAIN ANALYZE

Voici la mise en pratique pour EXPLAIN ANALYZE. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.

EXPLAIN ANALYZE
SELECT c.nom, COUNT(o.id) AS nb_commandes
FROM clients c
LEFT JOIN commandes o ON o.client_id = c.id
WHERE c.ville = 'Dakar'
GROUP BY c.id;

Lisez le plan de l’intérieur vers l’extérieur. Signaux d’alarme : Using filesort, Using temporary, type: ALL. Si vous voyez ces signaux sur une table de plus de quelques milliers de lignes, ajoutez l’index manquant.

Sauvegarder avec mysqldump

Voici la mise en pratique pour Sauvegarder avec mysqldump. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.

mysqldump -u root -p --single-transaction --routines --triggers --events ma_base > backup_2026-05-05.sql

--single-transaction capture un instantané cohérent sur InnoDB. Restaurez avec mysql -u root -p ma_base < backup.sql. Planifiez via cron une sauvegarde quotidienne et copiez vers Backblaze B2 à 6 USD/TB/mois.

Sécuriser : moindre privilège

Voici la mise en pratique pour Sécuriser : moindre privilège. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.

CREATE USER 'app_blog'@'localhost' IDENTIFIED BY 'mot_de_passe_long';
GRANT SELECT, INSERT, UPDATE, DELETE ON blog.* TO 'app_blog'@'localhost';
FLUSH PRIVILEGES;

Ne connectez jamais en root. Sur MySQL 8.4, activez le plugin caching_sha2_password par défaut.

Erreurs fréquentes

Stocker les dates en VARCHAR : faites toujours DATE, DATETIME ou TIMESTAMP. Stocker des montants en FLOAT : utilisez DECIMAL(10,2) pour éviter les erreurs d’arrondi sur les FCFA. Oublier WHERE dans un UPDATE ou DELETE : entraînez-vous d’abord en SELECT. Activez SET sql_mode = 'STRICT_ALL_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO'; pour transformer les avertissements silencieux en erreurs.

Adaptation au contexte ouest-africain : performance, équipe, marché

Pour un développeur ou une PME basée à Dakar, Abidjan, Bamako, Cotonou, Lomé, Ouagadougou, Niamey ou Conakry qui livre des sites web ou applications custom, trois adaptations pèsent sur le succès des projets. Premièrement, la connectivité 4G inégale impose de réduire le poids des pages au strict nécessaire. Deuxièmement, le profil typique des développeurs disponibles localement est majoritairement formé sur du JavaScript moderne et du PHP. Troisièmement, le coût en FCFA des services cloud doit être anticipé : Hetzner CX22 à 4 500 FCFA/mois reste imbattable pour démarrer, Cloudflare Pages gratuit pour les sites statiques, Backblaze B2 à 6 USD/TB/mois pour les sauvegardes.

Tester sur appareils réels

Plus important que tous les outils synthétiques, tester son site sur un Android d’entrée de gamme (Galaxy A03 à 200 EUR neuf, Tecno Spark, Itel A60) avec une connexion 4G locale dégradée donne le seul verdict qui compte. Pour étoffer le tableau, voir le guide media queries responsive.

Pratiques avancées et outils complémentaires

Au-delà des patterns présentés, plusieurs outils complètent une maîtrise sérieuse. Premier axe : automatiser la qualité via une pipeline CI (GitHub Actions, GitLab CI) qui exécute tests, linting et audit avant chaque déploiement. Deuxième axe : monitorer en production avec Sentry pour les erreurs JavaScript ou New Relic pour les performances applicatives. Troisième axe : documenter les décisions importantes dans un dossier docs/adr/ avec format simple (contexte, décision, conséquences).

Ressources francophones pour approfondir

Plusieurs ressources gratuites en français permettent de monter en compétence rapidement. MDN Web Docs reste la documentation de référence. FreeCodeCamp propose des parcours de 300+ heures. Grafikart.fr offre des centaines de tutoriels vidéos en français. Pour la pratique, contribuer à un projet open source via GitHub est l’investissement le plus payant à moyen terme.

Pratiques avancées et outils complémentaires

Au-delà des patterns présentés, plusieurs outils complètent une maîtrise sérieuse. Premier axe : automatiser la qualité via une pipeline CI (GitHub Actions, GitLab CI) qui exécute tests, linting et audit avant chaque déploiement. Deuxième axe : monitorer en production avec Sentry pour les erreurs JavaScript ou New Relic pour les performances applicatives. Troisième axe : documenter les décisions importantes dans un dossier docs/adr/ avec format simple (contexte, décision, conséquences).

Ressources francophones pour approfondir

Plusieurs ressources gratuites en français permettent de monter en compétence rapidement. MDN Web Docs reste la documentation de référence. FreeCodeCamp propose des parcours de 300+ heures. Grafikart.fr offre des centaines de tutoriels vidéos en français. Pour la pratique, contribuer à un projet open source via GitHub est l’investissement le plus payant à moyen terme.

Erreurs courantes à éviter en production

Trois patterns reviennent dans les projets web mal exécutés et coûtent cher à corriger plus tard. Premier pattern : copier-coller de code Stack Overflow sans comprendre le contexte d’origine. Deuxième pattern : ignorer les warnings de la console — chaque warning est un signal qui mérite d’être lu. Troisième pattern : ne pas tester sur de vrais appareils. DevTools simule mais ne remplace pas un test physique sur un Android d’entrée de gamme avec une 4G dégradée. Documenter chaque décision technique majeure dans un fichier ADR prend dix minutes et fait gagner des heures lors d’un incident ou d’un audit.

Erreurs courantes à éviter en production

Trois patterns reviennent dans les projets web mal exécutés et coûtent cher à corriger plus tard. Premier pattern : copier-coller de code Stack Overflow sans comprendre le contexte d’origine. Deuxième pattern : ignorer les warnings de la console — chaque warning est un signal qui mérite d’être lu. Troisième pattern : ne pas tester sur de vrais appareils. DevTools simule mais ne remplace pas un test physique sur un Android d’entrée de gamme avec une 4G dégradée. Documenter chaque décision technique majeure dans un fichier ADR prend dix minutes et fait gagner des heures lors d’un incident ou d’un audit.

Dans la continuité

مشاركة