Semaine 3 - Jour 1 : Introduction à MySQL

1. Qu'est-ce que MySQL ?

MySQL est un système de gestion de base de données relationnelle (SGBDR) open-source. Il permet de stocker, organiser et récupérer des données de manière structurée.

Concepts clés

2. Types de données MySQL

Types numériques

Type Description Exemple
INT Nombre entier (-2 147 483 648 à 2 147 483 647) 42
BIGINT Grand nombre entier 9223372036854775807
DECIMAL(10,2) Nombre décimal exact (10 chiffres, 2 après virgule) 12345.67
FLOAT / DOUBLE Nombre décimal approximatif 3.14159

Types texte

Type Taille max Usage
CHAR(n) n caractères (fixe) Code postal, code pays
VARCHAR(n) n caractères (variable) Nom, email, titre
TEXT 65 535 caractères Description, commentaire
LONGTEXT 4 GB Articles, contenu long

Types date et heure

Type Format Exemple
DATE YYYY-MM-DD 2026-01-08
TIME HH:MM:SS 14:30:00
DATETIME YYYY-MM-DD HH:MM:SS 2026-01-08 14:30:00
TIMESTAMP Horodatage Unix Auto-généré

3. Créer une base de données

CREATE DATABASE

-- Créer une nouvelle base de données CREATE DATABASE mon_site; -- Créer une base de données avec encodage UTF-8 CREATE DATABASE mon_site CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- Supprimer une base de données DROP DATABASE mon_site; -- Sélectionner une base de données USE mon_site;

4. Créer des tables

CREATE TABLE - Table utilisateurs

CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, nom VARCHAR(100) NOT NULL, prenom VARCHAR(100) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, date_naissance DATE, ville VARCHAR(100), actif BOOLEAN DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );

Explication :

  • AUTO_INCREMENT : L'id s'incrémente automatiquement (1, 2, 3...)
  • PRIMARY KEY : Identifiant unique obligatoire
  • NOT NULL : Le champ ne peut pas être vide
  • UNIQUE : Pas de doublons (ici, un email = un utilisateur)
  • DEFAULT : Valeur par défaut si non spécifiée

CREATE TABLE - Table articles avec clé étrangère

CREATE TABLE articles ( id INT AUTO_INCREMENT PRIMARY KEY, titre VARCHAR(200) NOT NULL, contenu TEXT NOT NULL, user_id INT NOT NULL, statut ENUM('brouillon', 'publié', 'archivé') DEFAULT 'brouillon', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Clé étrangère : relie user_id à la table users FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE );

ON DELETE CASCADE :

Si un utilisateur est supprimé, tous ses articles seront automatiquement supprimés.

5. Opérations CRUD de base

INSERT - Insérer des données

-- Insérer un utilisateur INSERT INTO users (nom, prenom, email, password, ville) VALUES ('Dupont', 'Jean', 'jean.dupont@example.com', 'hashed_password', 'Paris'); -- Insérer plusieurs utilisateurs INSERT INTO users (nom, prenom, email, password) VALUES ('Martin', 'Marie', 'marie.martin@example.com', 'pass123'), ('Durand', 'Paul', 'paul.durand@example.com', 'pass456');

SELECT - Récupérer des données

-- Sélectionner tous les utilisateurs SELECT * FROM users; -- Sélectionner uniquement certaines colonnes SELECT nom, prenom, email FROM users; -- Sélectionner avec condition WHERE SELECT * FROM users WHERE ville = 'Paris'; -- Sélectionner avec plusieurs conditions SELECT * FROM users WHERE ville = 'Paris' AND actif = 1; -- Sélectionner avec LIKE (recherche partielle) SELECT * FROM users WHERE email LIKE '%@example.com'; -- Limiter les résultats SELECT * FROM users LIMIT 10; -- Trier les résultats SELECT * FROM users ORDER BY nom ASC; SELECT * FROM users ORDER BY created_at DESC;

UPDATE - Modifier des données

-- Mettre à jour un utilisateur spécifique UPDATE users SET ville = 'Lyon', updated_at = NOW() WHERE id = 1; -- Mettre à jour plusieurs champs UPDATE users SET nom = 'Nouveau Nom', prenom = 'Nouveau Prenom' WHERE email = 'jean.dupont@example.com'; -- ATTENTION : sans WHERE, toutes les lignes seront modifiées ! UPDATE users SET actif = 0; -- ❌ Désactive TOUS les utilisateurs

DELETE - Supprimer des données

-- Supprimer un utilisateur spécifique DELETE FROM users WHERE id = 5; -- Supprimer avec condition DELETE FROM users WHERE actif = 0 AND created_at < '2025-01-01'; -- ATTENTION : sans WHERE, toutes les lignes seront supprimées ! DELETE FROM users; -- ❌ Supprime TOUT
Attention ! Utilisez toujours une clause WHERE avec UPDATE et DELETE, sinon TOUTES les lignes seront affectées ! Testez d'abord avec un SELECT pour vérifier votre condition.

6. Jointures (JOIN)

INNER JOIN - Récupérer des données de plusieurs tables

-- Récupérer les articles avec les informations de l'auteur SELECT articles.titre, articles.contenu, users.nom, users.prenom FROM articles INNER JOIN users ON articles.user_id = users.id; -- Avec des alias pour simplifier SELECT a.titre, a.contenu, u.nom, u.prenom FROM articles AS a INNER JOIN users AS u ON a.user_id = u.id;

LEFT JOIN - Inclure les lignes sans correspondance

-- Récupérer tous les utilisateurs, même ceux sans articles SELECT u.nom, u.prenom, COUNT(a.id) AS nb_articles FROM users u LEFT JOIN articles a ON u.id = a.user_id GROUP BY u.id;

7. Fonctions d'agrégation

COUNT, SUM, AVG, MIN, MAX

-- Compter le nombre d'utilisateurs SELECT COUNT(*) AS total_users FROM users; -- Nombre d'utilisateurs actifs SELECT COUNT(*) FROM users WHERE actif = 1; -- Nombre d'articles par utilisateur SELECT u.nom, COUNT(a.id) AS nb_articles FROM users u LEFT JOIN articles a ON u.id = a.user_id GROUP BY u.id; -- Utilisateurs avec plus de 5 articles SELECT u.nom, COUNT(a.id) AS nb_articles FROM users u LEFT JOIN articles a ON u.id = a.user_id GROUP BY u.id HAVING nb_articles > 5;

8. Modifier une table existante

ALTER TABLE

-- Ajouter une colonne ALTER TABLE users ADD telephone VARCHAR(20); -- Modifier une colonne ALTER TABLE users MODIFY telephone VARCHAR(15); -- Renommer une colonne ALTER TABLE users CHANGE telephone tel VARCHAR(15); -- Supprimer une colonne ALTER TABLE users DROP tel; -- Supprimer une table DROP TABLE articles;
Note : MySQL stocke les données de manière persistante sur le disque dur, contrairement aux variables PHP qui disparaissent après l'exécution du script. C'est essentiel pour les applications web !

Froggiesplaining

Froggie

Ribbit ribbit ! 🐸

Les bases de données, c'est comme mon journal de chasse aux mouches ! Chaque table est comme une catégorie (mouches bleues, mouches vertes...), et chaque ligne est une mouche que j'ai attrapée avec ses caractéristiques (taille, goût, heure de capture).

Types de données :

  • INT = Nombre de mouches attrapées (1, 2, 3...)
  • VARCHAR = Type de mouche ("bleue", "verte")
  • TEXT = Mes commentaires détaillés sur chaque mouche
  • DATETIME = Quand j'ai attrapé la mouche

Clé primaire (PRIMARY KEY) : C'est comme le numéro unique de chaque mouche dans mon journal - impossible d'avoir deux mouches avec le même numéro !

Clé étrangère (FOREIGN KEY) : Si j'ai une table "mares" et une table "mouches", la clé étrangère relie chaque mouche à sa mare d'origine. Comme ça, je sais d'où vient chaque mouche !

Astuce SQL : Testez toujours vos requêtes UPDATE et DELETE avec un SELECT d'abord ! Comme moi, je regarde bien avant de sauter sur un nénuphar !