🗄️ Introduction à MySQL

MySQL est le système de gestion de bases de données relationnelles (SGBDR) open-source le plus utilisé au monde. Il organise les données en tables liées par des clés étrangères.

Architecture

  • Serveur MySQL : processus qui gère les données (port 3306 par défaut)
  • Client : CLI (mysql), MySQL Workbench, phpMyAdmin, XAMPP
  • Base de données : collection de tables logiquement liées
MySQL 8.0+ est la version recommandée. Elle supporte les CTE, les fonctions de fenêtrage, et le mode strict par défaut.

Démarrer

-- Se connecter via CLI
mysql -u root -p

-- Commandes de base
SHOW DATABASES;
CREATE DATABASE IF NOT EXISTS formation_mysql;
USE formation_mysql;
SHOW TABLES;

📋 Types de données

Choisir le bon type pour chaque colonne est essentiel pour la performance et l'intégrité des données.

Types numériques

TypePlageUsage
TINYINT-128 à 127 (ou 0–255 UNSIGNED)Age, note sur 100
SMALLINT-32 768 à 32 767Année, code postal
INT±2 milliardsID, compteur
BIGINT±9 × 10¹⁸ID grande échelle
DECIMAL(p,s)Précision exacteMontants, prix
FLOAT / DOUBLEApprochéCalculs scientifiques
Utilisez toujours DECIMAL pour les montants financiers. FLOAT introduit des erreurs d'arrondi binaires (0.1 + 0.2 ≠ 0.3 exactement).

Types chaîne

CHAR(10)       -- longueur fixe, toujours 10 octets (complété d'espaces)
VARCHAR(255)   -- longueur variable, jusqu'à 255 caractères
TEXT           -- texte long sans limite pratique
MEDIUMTEXT     -- jusqu'à 16 Mo
LONGTEXT       -- jusqu'à 4 Go

Types date et heure

DATE           -- 'YYYY-MM-DD'                    ex: '2024-01-15'
TIME           -- 'HH:MM:SS'                      ex: '10:30:00'
DATETIME       -- 'YYYY-MM-DD HH:MM:SS'           ex: '2024-01-15 10:30:00'
TIMESTAMP      -- Stocké en UTC, converti selon fuseau horaire
YEAR           -- 1901 à 2155

Autres types courants

BOOLEAN        -- alias de TINYINT(1) : 0 = false, 1 = true
ENUM('a','b')  -- liste de valeurs prédéfinies
JSON           -- JSON natif (MySQL 5.7.8+)

🏗️ CREATE TABLE

La syntaxe de création de table inclut les colonnes, les types, et les contraintes.

-- Toujours précéder d'un DROP pour les scripts idempotents
DROP TABLE IF EXISTS produits;

CREATE TABLE produits (
  id           INT UNSIGNED    NOT NULL AUTO_INCREMENT,
  nom          VARCHAR(200)    NOT NULL,
  prix         DECIMAL(10, 2)  NOT NULL,
  stock        INT             NOT NULL DEFAULT 0,
  categorie_id INT UNSIGNED    NULL,
  created_at   DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (id),

  CONSTRAINT fk_produits_categories
    FOREIGN KEY (categorie_id)
    REFERENCES categories(id)
    ON DELETE SET NULL
    ON UPDATE CASCADE
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;
Utilisez toujours ENGINE=InnoDB : il supporte les transactions, les clés étrangères et le verrouillage au niveau des lignes. MyISAM (ancien moteur) ne supporte aucune de ces fonctionnalités.

Afficher la structure

-- Structure résumée
DESCRIBE produits;

-- DDL complet (colonnes + index + FK)
SHOW CREATE TABLE produits;

🔒 Contraintes d'intégrité

PRIMARY KEY

Identifie chaque ligne de façon unique. Combine UNIQUE + NOT NULL. MySQL crée automatiquement un index sur la PK.

FOREIGN KEY

FOREIGN KEY (col) REFERENCES autre_table(col)
  ON DELETE CASCADE    -- supprime les lignes liées
  ON DELETE RESTRICT   -- interdit la suppression si des lignes existent
  ON DELETE SET NULL   -- met la FK à NULL
  ON UPDATE CASCADE    -- propage la mise à jour

UNIQUE

-- Colonne unique
email VARCHAR(200) UNIQUE,

-- Contrainte composite unique
UNIQUE KEY uniq_nom_ville (nom, ville)

CHECK (MySQL 8.0.16+)

prix DECIMAL(10,2) NOT NULL,
CONSTRAINT chk_prix_positif CHECK (prix >= 0)

DEFAULT

stock     INT      NOT NULL DEFAULT 0,
statut    VARCHAR(20)      DEFAULT 'actif',
created_at DATETIME        DEFAULT CURRENT_TIMESTAMP

📥 Premières données

-- INSERT simple
INSERT INTO categories (nom, description)
VALUES ('Electronique', 'Appareils et accessoires high-tech');

-- INSERT multi-lignes (plus efficace)
INSERT INTO produits (nom, prix, stock, categorie_id) VALUES
  ('Smartphone Pro 14', 899.00, 50, 1),
  ('Laptop UltraBook',  1299.00, 20, 1),
  ('Casque Bluetooth',  149.00, 80, 1);

-- Vérification
SELECT * FROM produits;
SELECT COUNT(*) AS total FROM produits;
Respectez l'ordre d'insertion : insérez d'abord les tables parentes (sans FK) avant les tables enfants. Ex: categories avant produits.