Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

🐬 MariaDB – Installation, SQL & Administration

Guide complet IDEO‑Lab pour maĂźtriser le SGBD relationnel, de l'installation Ă  la rĂ©plication.

1.1

Vue d'ensemble

Qu'est-ce que MariaDB ? Fork de MySQL.

SGBDR MySQL Fork Open Source
1.2

Architecture

Client/Serveur, Moteurs de stockage.

Client/Serveur InnoDB Aria
2.1

Installation Linux

Ubuntu/Debian (apt) & RHEL/CentOS (yum/dnf).

apt yum Linux
2.2

Installation Windows

Standalone (MSI) ou WAMP/XAMPP.

Windows WAMP MSI
2.3

Sécurisation (Importante)

Script mysql_secure_installation.

Sécurité root post-install
3.1

Connexion & Clients

Client CLI mysql, DBeaver, HeidiSQL.

CLI DBeaver GUI
3.2

Gestion des BDD (SQL)

CREATE DATABASE, USE, DROP.

DATABASE USE
3.3

Gestion des Utilisateurs

CREATE USER, GRANT, REVOKE.

GRANT USER PrivilĂšges
4.1

DDL : CREATE TABLE

Anatomie d'une table, Clés Primaires.

CREATE TABLE PRIMARY KEY
4.2

Types de Données

INT, VARCHAR, TEXT, DATETIME, JSON.

INT VARCHAR DATETIME
4.3

DDL : ALTER TABLE

ADD, MODIFY, DROP COLUMN.

ALTER MODIFY ADD
5.1

DML : INSERT

Ajouter des lignes dans une table.

INSERT INTO VALUES
5.2

DML : SELECT & WHERE

Lire les données, filtrer les résultats.

SELECT WHERE LIKE
5.3

DML : UPDATE & DELETE

Modifier et supprimer des lignes (avec WHERE !).

UPDATE DELETE TRUNCATE
6.1

SQL : Jointures (JOIN)

INNER JOIN, LEFT JOIN.

JOIN INNER LEFT
6.2

SQL : Agrégats

GROUP BY, COUNT, SUM, AVG.

GROUP BY COUNT HAVING
6.3

Index & Clés

Optimisation des SELECT, INDEX, EXPLAIN.

INDEX UNIQUE EXPLAIN
7.1

Backup (mysqldump)

Exporter des bases de données en SQL.

mysqldump backup
7.2

Restauration & Config

Restaurer un dump, fichier my.cnf.

restore my.cnf config
7.3

Réplication

Configuration Master/Slave (Primaire/Secondaire).

Replication Master/Slave
8.1

Cheat-sheet SQL

Commandes SQL et CLI fréquentes.

cheat SQL
1.1 Vue d'ensemble MariaDB
Qu'est-ce que MariaDB ?

MariaDB est un **SGBDR** (SystÚme de Gestion de Base de Données Relationnelle) open-source, créé par les fondateurs originaux de **MySQL**.

C'est un "fork" de MySQL, nĂ© en 2009 suite aux inquiĂ©tudes de la communautĂ© aprĂšs le rachat de MySQL par Oracle. MariaDB est conçu pour ĂȘtre un remplacement "drop-in" de MySQL, hautement compatible, mais avec plus de fonctionnalitĂ©s et un dĂ©veloppement communautaire.

Historique (Fork)
MySQL (Original, 1995)
    │
    ├─ Rachat par Sun Microsystems (2008)
    │
    ├─ Rachat de Sun par Oracle (2009)
    │   │
    │   ├─â–ș MySQL (DĂ©veloppement Oracle)
    │   │
    │   └─â–ș MariaDB (Fork par le fondateur "Monty" Widenius)
    │       (GĂ©rĂ© par la MariaDB Foundation)
MariaDB vs. MySQL (Post-Fork)

Bien qu'hautement compatibles, ils divergent :

CritĂšreMariaDBMySQL (par Oracle)
LicenceGPLv2 (Toujours open)GPLv2 / Commerciale
MoteursInnoDB (défaut), Aria, MyISAM...InnoDB (défaut), MyISAM...
FonctionnalitésPool de threads, ColumnStore, JSONPool de threads (Enterprise), JSON
DéveloppementCommunautaire et ouvert"Corporate" et plus fermé

En résumé : MariaDB est souvent vue comme l'alternative plus "pure", communautaire et riche en fonctionnalités à MySQL, tout en gardant une compatibilité quasi-totale.

1.2 Architecture MariaDB
Schéma Client/Serveur

MariaDB fonctionne sur un modĂšle client-serveur classique.

[Image d'une architecture SGBD]
+----------------------+   (Réseau TCP/IP ou Socket UNIX)
| Clients              | 
| (ex: DBeaver, Web App) |  
| (ex: CLI `mysql`)    | 
+----------------------+
            |
            | RequĂȘte SQL (ex: SELECT * FROM users)
            ▌
+------------------------------------------------------+
| SERVEUR MariaDB (Processus `mysqld`)                 |
|                                                      |
|  +------------------+     +-----------------------+  |
|  | Analyseur SQL    | --> | Optimiseur de RequĂȘte |  |
|  +------------------+     +-----------------------+  |
|         (Cache)           |                          |
|                           ▌                          |
|  +------------------------------------------------+  |
|  | API Moteur de Stockage (Pluggable)             |  |
|  +------------------------------------------------+  |
|      |                  |                 |          |
|      ▌                  ▌                 ▌          |
| +----------+      +----------+      +----------+     |
| | InnoDB   |      | Aria     |      | MyISAM   |     |
| +----------+      +----------+      +----------+     |
| (ACID, Lignes)    (Crash-safe)      (Legacy, Table)  |
|                                                      |
|  +------------------------------------------------+  |
|  | SystĂšme de Fichiers (/var/lib/mysql/...)       |  |
|  +------------------------------------------------+  |
+------------------------------------------------------+
Les Moteurs de Stockage (Storage Engines)

La grande force de MariaDB/MySQL est son architecture "pluggable". Le moteur de stockage définit *comment* les données sont stockées, indexées et verrouillées.

Vous pouvez choisir le moteur par table.

MoteurDéfautTransactions (ACID)VerrouillageCas d'usage
InnoDBOui (Défaut)Oui (ACID)Ligne (Row-level)99% des cas. Sûr, rapide, gÚre les clés étrangÚres. Le standard absolu.
AriaNonNonTableAlternative "crash-safe" Ă  MyISAM. Plus rapide pour les `SELECT` complexes. Bon pour les tables internes.
MyISAMNon (Legacy)NonTable (rapide en lecture)Legacy. TrĂšs rapide pour les `SELECT` purs (data warehouse simple), mais non "crash-safe". À Ă©viter.
ColumnStoreNonNon-Stockage en colonnes. Pour l'analytique (Data Warehousing) massif.
-- Choisir un moteur à la création
CREATE TABLE ma_table (
  id INT PRIMARY KEY
) ENGINE=InnoDB;
Processus et Fichiers Clés
  • Processus : Le serveur MariaDB s'exĂ©cute en tant que daemon (service) unique appelĂ© mysqld.
  • Fichier de Configuration :
    • Linux: /etc/mysql/my.cnf ou /etc/my.cnf.d/server.cnf
    • Windows: C:\Program Files\MariaDB [Version]\data\my.ini
  • Socket UNIX : (Linux) Pour les connexions locales rapides sans passer par TCP/IP.
    • /var/run/mysqld/mysqld.sock
  • RĂ©pertoire de DonnĂ©es : (datadir)
    • Linux: /var/lib/mysql/
    • Windows: C:\Program Files\MariaDB [Version]\data\
    • C'est lĂ  que les BDD (dossiers) et les tables (fichiers .ibd) sont stockĂ©s.
  • Logs : (/var/log/mysql/)
    • error.log : Le plus important pour le debug (erreurs de dĂ©marrage, crashs).
    • slow-query.log : (Optionnel) Logue les requĂȘtes lentes.
    • binlog : (Optionnel) Log binaire pour la rĂ©plication.
2.1 Installation Linux (apt & yum)
Ubuntu 22.04+ / Debian 11+

Les dépÎts officiels de MariaDB sont recommandés pour avoir la version la plus récente (plutÎt que celle fournie par la distribution).

# 1. Mettre à jour et installer les prérequis
sudo apt update
sudo apt install -y curl gpg-agent

# 2. Ajouter la clé GPG de MariaDB
curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'

# 3. Ajouter le dépÎt (Ex: 10.11 pour Ubuntu 22.04)
# (Vérifiez sur mariadb.org/repositories/ pour votre version)
sudo sh -c "echo 'deb [signed-by=/etc/apt/keyrings/mariadb-keyring.pgp] https://dlm.mariadb.com/repo/mariadb-server/10.11/repo/ubuntu jammy main' \
    > /etc/apt/sources.list.d/mariadb.list"

# 4. Installer MariaDB
sudo apt update
sudo apt install -y mariadb-server mariadb-client
RHEL / CentOS 8+ / Fedora

Utilisation du script de configuration de dépÎt.

# 1. Installer les prérequis
sudo yum install -y curl

# 2. Télécharger et exécuter le script de configuration
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash

# 3. Installer MariaDB (dnf ou yum)
sudo dnf install -y MariaDB-server MariaDB-client MariaDB-backup
Vérification et Post-Installation

Une fois installé, le service mysql (ou mariadb) devrait démarrer.

# Activer le service au démarrage
sudo systemctl enable --now mariadb

# Vérifier le statut
sudo systemctl status mariadb

● mariadb.service - MariaDB 10.11.x database server
     Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; ...)
     Active: active (running) since Sat 2025-11-01 20:00:00 CET; 1h ago
...

# Vérifier la version
mysql --version
# mysql  Ver 15.1 Distrib 10.11.6-MariaDB, for debian-linux-gnu (x86_64)
Étape suivante OBLIGATOIRE

L'installation par défaut n'est **PAS** sécurisée (l'utilisateur root n'a pas de mot de passe ou utilise l'auth unix_socket).

Lancez immédiatement le script de sécurisation (voir section 2.3) :

sudo mysql_secure_installation
2.2 Installation Windows
Option 1 : Stack WAMP/XAMPP (Développement)

Pour le développement local (ex: PHP, WordPress), le plus simple est d'utiliser une stack "tout-en-un" :

  • WAMP : (Windows, Apache, MySQL/MariaDB, PHP)
  • XAMPP : (Cross-platform, Apache, MariaDB, PHP, Perl)

Avantages :

  • Installation en un clic.
  • Panneau de contrĂŽle graphique pour dĂ©marrer/arrĂȘter les services (Apache, MariaDB).
  • Inclut PhpMyAdmin pour la gestion web.
Inconvénients :
  • Non optimisĂ© pour la production.
  • Versions parfois en retard.

Option 2 : Installeur MSI (Production/Dédié)

Pour un vrai service de base de données (ex: accessible par d'autres machines), utilisez l'installeur officiel MSI.

  1. Allez sur mariadb.org/download/
  2. Téléchargez l'installeur MSI (stable).
  3. Exécutez l'installeur.
  4. Étape clĂ© : DĂ©finissez un mot de passe pour l'utilisateur root.
  5. Étape clĂ© : Cochez "Install as a service" (Installer en tant que service).
  6. Laissez le nom du service (ex: MariaDB).
  7. Activez "Use TCP/IP" (Port 3306).

Une fois installé, le service MariaDB tournera en arriÚre-plan.

Vérification

Ajoutez le dossier bin de MariaDB Ă  votre PATH (ex: C:\Program Files\MariaDB 10.11\bin).

(Dans cmd ou PowerShell)
mysql -u root -p
Enter password: [votre-mot-de-passe]
Welcome to the MariaDB monitor.
2.3 Sécurisation : mysql_secure_installation
Le script indispensable

Cette commande (à lancer en sudo) est l'étape obligatoire aprÚs toute nouvelle installation Linux.

sudo mysql_secure_installation

Ce script interactif va vous poser plusieurs questions pour "durcir" votre installation.

Authentification unix_socket (Linux)

Par défaut, les nouvelles installations (Ubuntu/Debian) utilisent l'authentification unix_socket pour root.
Cela signifie que l'utilisateur root du systĂšme peut se connecter Ă  MariaDB (en tant que root) sans mot de passe :

sudo mysql

Le script vous demandera si vous voulez changer cela pour un mot de passe classique. C'est recommandé si vous avez besoin d'un accÚs root depuis des applications externes (comme DBeaver).

Actions du script
Question (simplifiée)ActionRecommandation
Switch to unix_socket auth?Change l'auth root.Non (si vous préférez garder sudo mysql) ou Oui (si vous voulez un mot de passe).
Set root password?Définit un mot de passe pour root (si unix_socket est désactivé).Oui (Fort)
Remove anonymous users?Supprime les utilisateurs "anonymes".Oui
Disallow root login remotely?EmpĂȘche root de se connecter depuis une autre machine.Oui (Bonne pratique)
Remove test database?Supprime la BDD "test".Oui
Reload privilege tables?Applique les changements.Oui
3.1 Connexion & Clients (CLI, GUI)
Client CLI (mysql)

L'outil de base pour interagir avec le serveur. (MĂȘme pour MariaDB, l'exĂ©cutable s'appelle mysql pour la compatibilitĂ©).

# Connexion locale (via socket unix)
sudo mysql
# ou (si auth par mot de passe)
mysql -u root -p

# Connexion Ă  un serveur distant
# -h (host), -u (user), -p (password), -P (Port)
mysql -h 192.168.1.50 -u mon_user -p -P 3306

# Se connecter ET sélectionner une BDD
mysql -u mon_user -p ma_base_de_donnees

# Exécuter une commande rapide
mysql -u root -p -e "SHOW DATABASES;"
Dans le client (MariaDB [(none)]>)
-- Voir les bases de données
SHOW DATABASES;

-- Changer de base
USE ma_base_de_donnees;
-- (Le prompt devient: MariaDB [ma_base_de_donnees]>)

-- Voir les tables
SHOW TABLES;

-- Quitter
EXIT; (ou \q)
Clients GUI (Graphiques)

Pour la gestion visuelle, l'Ă©criture de requĂȘtes complexes et l'exploration des donnĂ©es, un client GUI est indispensable.

DBeaver (Recommandé)
  • Plateforme : Windows, macOS, Linux (Java).
  • CoĂ»t : Gratuit (Community Edition).
  • Points forts : Universel (supporte Postgres, SQLite, SQL Server...), autocomplĂ©tion puissante, gestion des schĂ©mas.
HeidiSQL
  • Plateforme : Windows (trĂšs lĂ©ger).
  • CoĂ»t : Gratuit.
  • Points forts : ExtrĂȘmement rapide, simple, gestion des utilisateurs facile, export de donnĂ©es.
PhpMyAdmin
  • Plateforme : Web (PHP).
  • CoĂ»t : Gratuit.
  • Points forts : Inclus dans WAMP/XAMPP, accessible de partout (navigateur), bon pour les tĂąches d'administration de base.
3.2 Gestion des Bases de Données (SQL)
Créer une Base de Données

Une base de données (ou "schéma") est un conteneur logique pour vos tables.

-- Syntaxe
CREATE DATABASE [IF NOT EXISTS] nom_database
    [CHARACTER SET utf8mb4]
    [COLLATE utf8mb4_unicode_ci];

-- Exemple simple
CREATE DATABASE ideo_lab_prod;

-- Exemple complet (Recommandé pour UTF-8)
CREATE DATABASE ideo_lab_crm
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;

utf8mb4 est essentiel pour supporter tous les caractùres, y compris les emojis 😉.

Lister les BDD
SHOW DATABASES;

+--------------------+
| Database           |
+--------------------+
| ideo_lab_crm       |
| ideo_lab_prod      |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

Les BDD information_schema, mysql, et performance_schema sont internes Ă  MariaDB. Ne pas les modifier.

Sélectionner une BDD

Avant de créer ou d'interroger des tables, vous devez sélectionner votre BDD "contexte".

USE ideo_lab_crm;
-- Réponse: Database changed
Supprimer une BDD

ATTENTION : Cette action est irréversible. Elle supprime la BDD et toutes les tables et données qu'elle contient.

DROP DATABASE [IF EXISTS] ideo_lab_prod;
Schéma de travail
1. CREATE DATABASE ideo_lab; (Fait une fois)
2. USE ideo_lab; (Fait Ă  chaque session)
3. CREATE TABLE users ...; (Fait une fois)
4. SELECT * FROM users; (Fait tout le temps)
3.3 Gestion des Utilisateurs & PrivilĂšges
1. CREATE USER

La bonne pratique est de ne **jamais** utiliser root pour une application. Créez un utilisateur dédié pour chaque application.

Un utilisateur est défini par son nom ET son hÎte de connexion ('user'@'host').

  • 'user'@'localhost' : Ne peut se connecter que depuis la machine locale (via socket ou 127.0.0.1).
  • 'user'@'192.168.1.10' : Ne peut se connecter que depuis l'IP 192.168.1.10.
  • 'user'@'%' : Peut se connecter depuis n'importe quelle IP (Non recommandĂ© si Ă©vitable).
-- Crée un utilisateur pour une app web locale
CREATE USER 'app_web'@'localhost'
    IDENTIFIED BY 'un_mot_de_passe_tres_fort';

-- Crée un utilisateur pour un accÚs distant (ex: DBeaver)
CREATE USER 'dev_admin'@'%'
    IDENTIFIED BY 'un_autre_pass_complique';
2. GRANT (Accorder des privilĂšges)

Un utilisateur nouvellement créé n'a **aucun** droit (mĂȘme pas SELECT). Vous devez lui accorder des privilĂšges sur des BDD spĂ©cifiques.

-- Syntaxe
GRANT [PRIVILÈGES] ON [BASE].[TABLE] TO [UTILISATEUR];

-- Exemple 1: Donner tous les droits Ă  'app_web' sur la BDD 'ideo_lab_crm'
GRANT ALL PRIVILEGES ON ideo_lab_crm.* TO 'app_web'@'localhost';

-- Exemple 2: Donner des droits limitĂ©s (Lecture/Écriture)
GRANT SELECT, INSERT, UPDATE, DELETE ON ideo_lab_prod.* TO 'app_prod'@'localhost';

-- Exemple 3: Donner un droit de lecture seule sur UNE seule table
GRANT SELECT ON ideo_lab_prod.clients TO 'analyste'@'%';

-- Exemple 4: Donner des droits admin globaux (type 'root')
GRANT ALL PRIVILEGES ON *.* TO 'dev_admin'@'%' WITH GRANT OPTION;
-- (WITH GRANT OPTION lui permet de donner des droits Ă  d'autres)

-- Appliquer les changements (important sur les anciennes versions)
FLUSH PRIVILEGES;
3. Gérer les droits existants
-- Voir les droits d'un utilisateur
SHOW GRANTS FOR 'app_web'@'localhost';

+------------------------------------------------------------------+
| Grants for app_web@localhost                                     |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'app_web'@'localhost' ...                  |
| GRANT ALL PRIVILEGES ON `ideo_lab_crm`.* TO 'app_web'@'localhost' |
+------------------------------------------------------------------+
REVOKE (Retirer des privilĂšges)
-- Retirer le droit de suppression
REVOKE DELETE ON ideo_lab_prod.* FROM 'app_prod'@'localhost';

-- Retirer tous les droits
REVOKE ALL PRIVILEGES ON ideo_lab_prod.* FROM 'app_prod'@'localhost';
DROP USER (Supprimer un utilisateur)
DROP USER 'app_web'@'localhost';
4.1 DDL : CREATE TABLE
Anatomie d'une Table

La table est la structure centrale. Elle est définie par ses **colonnes** et leurs **types**.

CREATE TABLE [IF NOT EXISTS] nom_table (
    colonne_1  TYPE_DONNEE  [OPTIONS],
    colonne_2  TYPE_DONNEE  [OPTIONS],
    ...
    [CONTRAINTES DE TABLE (ex: PRIMARY KEY)]
) ENGINE=InnoDB; -- (Toujours spécifier le moteur)
Options de Colonne
  • NOT NULL : La colonne ne peut pas ĂȘtre vide (NULL).
  • NULL : La colonne peut ĂȘtre vide (dĂ©faut).
  • DEFAULT [valeur] : Valeur utilisĂ©e si INSERT n'en fournit pas.
  • AUTO_INCREMENT : Pour les clĂ©s primaires. MariaDB gĂšre l'incrĂ©mentation (1, 2, 3...).
  • UNIQUE : Garantit que chaque valeur dans cette colonne est unique.
Contraintes de Table
  • PRIMARY KEY (colonne) : DĂ©finit l'identifiant unique de la ligne. C'est la contrainte la plus importante.
  • FOREIGN KEY (col_locale) REFERENCES autre_table(col_externe) : Garantit l'intĂ©gritĂ© rĂ©fĂ©rentielle (Lien).
Exemple : Table "utilisateurs"
-- Assurez-vous d'avoir fait 'USE ideo_lab_crm;'
CREATE TABLE utilisateurs (
    
    -- La Clé Primaire (ID)
    id INT(11) NOT NULL AUTO_INCREMENT,
    
    -- Colonnes de données
    email VARCHAR(255) NOT NULL,
    nom VARCHAR(100) NOT NULL,
    prenom VARCHAR(100) NULL,
    
    -- Valeur par défaut
    actif BOOLEAN NOT NULL DEFAULT TRUE,
    
    -- Timestamps (bonne pratique)
    date_creation DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    
    -- Contraintes
    PRIMARY KEY (id),
    UNIQUE KEY (email) -- Garantit un email unique

) ENGINE=InnoDB CHARACTER SET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Voir la structure d'une table
DESCRIBE utilisateurs;
4.2 Types de Données (Les plus courants)
Types Numériques
TypeDescriptionUsage
INTEntier standard (-2 milliards à +2 milliards). INT(11) ne limite *pas* la taille, c'est un hint d'affichage.Clés primaires (ID), quantités.
BIGINTEntier large (trĂšs gros chiffres).ID sur des tables trĂšs volumineuses.
SMALLINTEntier court (-32k Ă  +32k).Petits nombres (ex: statut, Ăąge).
TINYINTEntier trÚs court (-128 à 127).Booléen (TINYINT(1)) ou flags.
DECIMAL(P, S)Nombre à virgule fixe (précision exacte). Ex: DECIMAL(10, 2) = 10 chiffres au total, 2 aprÚs la virgule.Monétaire (prix, finance). Ne *jamais* utiliser FLOAT pour de l'argent.
FLOAT / DOUBLENombre à virgule flottante (approximatif).Calculs scientifiques, coordonnées GPS.
BOOLEANAlias pour TINYINT(1). Stocke 0 (false) ou 1 (true).Flags (ex: `actif`).
Types Texte (String)
TypeDescriptionUsage
VARCHAR(N)Chaßne de longueur variable (max N caractÚres). Ex: VARCHAR(255).Le plus courant. Noms, emails, titres. Utilise juste l'espace nécessaire.
CHAR(N)Chaßne de longueur fixe (N caractÚres). Si vous stockez "abc" dans un CHAR(10), il stocke "abc " (7 espaces).Codes (ex: code pays 'FR'), MD5. Rarement utilisé.
TEXTTexte long (max 65k caractĂšres).Descriptions, commentaires, articles de blog.
MEDIUMTEXTTexte trĂšs long (max 16Mo).Logs, contenu de corps d'email.
LONGTEXTTexte massif (max 4Go).Documents volumineux.

VARCHAR vs TEXT : VARCHAR est stocké "in-line" (plus rapide) si la taille est raisonnable. TEXT est stocké "off-page". Préférez VARCHAR si vous connaissez la limite (ex: < 5000 chars).

Types Date & Heure
TypeFormat StockéUsage
DATETIME'YYYY-MM-DD HH:MM:SS'Date et heure d'un événement (ex: date_creation).
TIMESTAMP'YYYY-MM-DD HH:MM:SS' (UTC)Similaire, mais gĂšre les fuseaux horaires (convertit en UTC au stockage). Bon pour date_modification (ON UPDATE CURRENT_TIMESTAMP).
DATE'YYYY-MM-DD'Date seule (ex: date de naissance).
TIME'HH:MM:SS'Heure seule (ex: heure d'ouverture).
YEAR'YYYY'Année seule.
-- Utiliser les fonctions natives
INSERT INTO commandes (date_commande) VALUES (NOW());
-- (NOW() insĂšre un DATETIME)

-- Utiliser CURRENT_TIMESTAMP par défaut
CREATE TABLE posts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    contenu TEXT,
    cree_le DATETIME DEFAULT CURRENT_TIMESTAMP,
    modifie_le TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Autres Types
TypeDescriptionUsage
JSONStocke un document JSON. MariaDB a des fonctions pour interroger ce JSON (JSON_EXTRACT).Données non structurées, métadonnées, settings.
ENUM(...)Liste de valeurs prédéfinies. Ex: ENUM('bas', 'moyen', 'haut').Statuts fixes. Force la validation des données.
SET(...)Similaire Ă  ENUM, mais permet de choisir 0, 1 ou plusieurs valeurs.Options, tags (ex: SET('email', 'sms', 'push')).
BLOBDonnées binaires (Binary Large Object).Stocker des images, PDF (Généralement une mauvaise idée, préférez stocker le *chemin* du fichier).
4.3 DDL : ALTER TABLE (Modifier une table)

Permet de modifier la structure d'une table existante. Attention : Sur des tables volumineuses (millions de lignes), un ALTER peut verrouiller la table et prendre des heures.

Ajouter une colonne
ALTER TABLE utilisateurs
    ADD COLUMN telephone VARCHAR(20) NULL
    AFTER prenom;
Supprimer une colonne
ALTER TABLE utilisateurs
    DROP COLUMN telephone;
Renommer une table
ALTER TABLE utilisateurs
    RENAME TO clients;
Modifier une colonne (Type, Options)
-- Changer le type (ex: de INT Ă  BIGINT)
ALTER TABLE utilisateurs
    MODIFY COLUMN id BIGINT NOT NULL AUTO_INCREMENT;

-- Changer le nom ET le type
ALTER TABLE utilisateurs
    CHANGE COLUMN nom nom_complet VARCHAR(200) NOT NULL;
Ajouter/Supprimer un Index
-- Ajouter un index pour accélérer les recherches sur 'nom'
ALTER TABLE utilisateurs
    ADD INDEX idx_nom (nom);

-- Supprimer un index
ALTER TABLE utilisateurs
    DROP INDEX idx_nom;
5.1 DML : INSERT (Ajouter des données)
Syntaxe ComplĂšte

L'ordre des colonnes doit correspondre Ă  l'ordre des valeurs.

-- (Table 'utilisateurs' de l'exemple 4.1)
INSERT INTO utilisateurs (id, email, nom, prenom, actif, date_creation)
VALUES (
    NULL, -- Pour l'AUTO_INCREMENT
    'jean.dupont@mail.com',
    'Dupont',
    'Jean',
    TRUE,
    NOW()
);
Syntaxe Courte (Colonnes implicites)

Si vous ne spécifiez pas les colonnes, vous DEVEZ fournir une valeur pour CHAQUE colonne, dans l'ordre de la table. Risqué.

INSERT INTO utilisateurs
VALUES (
    NULL, 'marie.martin@mail.com', 'Martin', 'Marie',
    TRUE, NOW()
);
Syntaxe Recommandée (Colonnes spécifiées)

Permet d'omettre des colonnes (si elles sont NULL ou ont une valeur DEFAULT). L'ordre n'a pas d'importance.

-- On omet 'id' (géré par AUTO_INCREMENT)
-- On omet 'actif' (géré par DEFAULT TRUE)
-- On omet 'date_creation' (géré par DEFAULT NOW())
INSERT INTO utilisateurs (email, nom, prenom)
VALUES (
    'luc.durand@mail.com',
    'Durand',
    'Luc'
);
Insertion Multiple
INSERT INTO utilisateurs (email, nom)
VALUES
    ('alice@mail.com', 'Alice'),
    ('bob@mail.com', 'Bob'),
    ('charlie@mail.com', 'Charlie');
5.2 DML : SELECT & WHERE (Lire les données)
SELECT (Quelles colonnes ?)
-- Sélectionner TOUTES les colonnes (à éviter en prod)
SELECT * FROM utilisateurs;

-- Sélectionner des colonnes spécifiques
SELECT email, nom, date_creation FROM utilisateurs;

-- Utiliser un alias (AS)
SELECT
    id,
    email,
    CONCAT(prenom, ' ', nom) AS nom_complet
FROM utilisateurs;
DISTINCT (Valeurs uniques)
-- Obtenir la liste des noms uniques
SELECT DISTINCT nom FROM utilisateurs;
WHERE (Quelles lignes ?)

Le filtre WHERE est la partie la plus importante pour optimiser une requĂȘte.

-- ÉgalitĂ© (utilise un index si 'id' est ClĂ© Primaire)
SELECT * FROM utilisateurs WHERE id = 5;

-- Texte (sensible à la casse par défaut selon le Collate)
SELECT * FROM utilisateurs WHERE nom = 'Dupont';

-- Opérateurs
SELECT * FROM utilisateurs WHERE actif = TRUE;
SELECT * FROM commandes WHERE montant > 100;
SELECT * FROM commandes WHERE statut != 'livre';

-- AND / OR (Utiliser des parenthĂšses)
SELECT * FROM utilisateurs
WHERE (nom = 'Dupont' AND actif = TRUE)
   OR email = 'admin@mail.com';

-- LIKE (Recherche partielle)
-- % = N'importe quel caractĂšre (0 ou plus)
SELECT * FROM utilisateurs WHERE email LIKE '%@mail.com'; -- Finit par
SELECT * FROM utilisateurs WHERE email LIKE 'jean%'; -- Commence par
SELECT * FROM utilisateurs WHERE email LIKE '%dupont%'; -- Contient

-- IN (Liste de valeurs)
SELECT * FROM utilisateurs WHERE id IN (1, 5, 10);

-- BETWEEN (Plage)
SELECT * FROM commandes WHERE date_creation BETWEEN '2025-01-01' AND '2025-01-31';

-- IS NULL (Vérifier si c'est vide)
SELECT * FROM utilisateurs WHERE prenom IS NULL;
ORDER BY (Trier les résultats)

Trie le rĂ©sultat final. Peut ĂȘtre lent sur de grands datasets sans index.

-- Trier par date (plus récent d'abord)
SELECT * FROM utilisateurs
ORDER BY date_creation DESC;

-- Trier par nom (alphabétique)
SELECT * FROM utilisateurs
ORDER BY nom ASC; -- ASC est le défaut

-- Tri multiple
SELECT * FROM utilisateurs
ORDER BY nom ASC, prenom ASC;
LIMIT & OFFSET (Pagination)

Essentiel pour la pagination (ex: afficher 20 résultats par page).

-- Obtenir les 10 utilisateurs les plus récents
SELECT * FROM utilisateurs
ORDER BY date_creation DESC
LIMIT 10;

-- Obtenir la "Page 3" (20 résultats par page)
-- (Page 1: LIMIT 20 OFFSET 0)
-- (Page 2: LIMIT 20 OFFSET 20)
SELECT * FROM utilisateurs
ORDER BY id
LIMIT 20 OFFSET 40; -- (20 * (Page 3 - 1))
5.3 DML : UPDATE & DELETE (Modifier/Supprimer)
UPDATE (Modifier des lignes)

⚠ ATTENTION : Toujours, toujours, TOUJOURS utiliser une clause WHERE avec UPDATE.

Sans WHERE, la commande mettra Ă  jour **TOUTES** les lignes de la table.

-- Syntaxe
UPDATE nom_table
SET colonne_1 = nouvelle_valeur,
    colonne_2 = autre_valeur
WHERE condition;

-- Exemple : Mettre Ă  jour un utilisateur
UPDATE utilisateurs
SET
    email = 'jean.dupont.new@mail.com',
    actif = FALSE
WHERE id = 1;

-- Exemple : Augmenter tous les prix de 10%
UPDATE produits
SET prix = prix * 1.10
WHERE categorie = 'electronique';
DELETE (Supprimer des lignes)

⚠ DANGER EXTRÊME : Sans WHERE, DELETE supprime **TOUT** le contenu de la table (lentement).

-- Syntaxe
DELETE FROM nom_table
WHERE condition;

-- Exemple : Supprimer un utilisateur
DELETE FROM utilisateurs
WHERE id = 5;

-- Exemple : Nettoyer les logs de plus d'un an
DELETE FROM logs
WHERE date_log < '2024-01-01';
TRUNCATE (Vider une table)

Si votre but est de vider *entiĂšrement* une table (ex: logs, imports temporaires), n'utilisez pas DELETE. Utilisez TRUNCATE.

TRUNCATE TABLE logs;

TRUNCATE est beaucoup plus rapide (il recrée la table vide) et réinitialise l'AUTO_INCREMENT.

6.1 SQL : Jointures (JOIN)

Les jointures permettent de combiner les lignes de deux (ou plus) tables basĂ©es sur une condition (gĂ©nĂ©ralement la liaison ClĂ© Primaire / ClĂ© ÉtrangĂšre).

Table 1 : utilisateurs
id | nom
---|----------
1  | Alice
2  | Bob
3  | Charlie
Table 2 : commandes
id_cmd | utilisateur_id | montant
-------|----------------|---------
101    | 2              | 50.00
102    | 1              | 75.00
103    | 2              | 25.00
104    | 4              | 100.00 (Utilisateur 4 n'existe pas)
1. INNER JOIN (Intersection)

Ne retourne que les lignes qui ont une correspondance dans les **deux** tables.

[utilisateurs]      [commandes]
 (1) Alice ------+---- (102) 75.00
 (2) Bob   ------+---- (101) 50.00
                 `---- (103) 25.00
 (3) Charlie --- (Aucune commande)
                 
 (Utilisateur 4 n'existe pas) --- (104) 100.00
SELECT
    u.nom,
    c.id_cmd,
    c.montant
FROM utilisateurs AS u
INNER JOIN commandes AS c ON u.id = c.utilisateur_id;
Résultat :
nom   | id_cmd | montant
------|--------|---------
Bob   | 101    | 50.00
Alice | 102    | 75.00
Bob   | 103    | 25.00

Charlie (3) n'apparaĂźt pas (pas de commande). La commande 104 n'apparaĂźt pas (pas d'utilisateur).

2. LEFT JOIN (Garde toute la table de gauche)

Retourne **toutes** les lignes de la table de gauche (utilisateurs), et les correspondances de la table de droite (commandes). S'il n'y a pas de correspondance, les colonnes de droite sont NULL.

SELECT
    u.nom,
    c.id_cmd,
    c.montant
FROM utilisateurs AS u
LEFT JOIN commandes AS c ON u.id = c.utilisateur_id;
Résultat :
nom     | id_cmd | montant
--------|--------|---------
Alice   | 102    | 75.00
Bob     | 101    | 50.00
Bob     | 103    | 25.00
Charlie | NULL   | NULL

Charlie (3) apparaßt, avec NULL pour ses commandes. C'est parfait pour trouver "les utilisateurs n'ayant jamais commandé" (WHERE c.id_cmd IS NULL).

6.2 SQL : Agrégats & GROUP BY
Fonctions d'Agrégat

Ces fonctions "résument" plusieurs lignes en une seule valeur.

  • COUNT(col) : Compte le nombre de lignes (non-null).
  • SUM(col) : Additionne les valeurs d'une colonne.
  • AVG(col) : Calcule la moyenne.
  • MAX(col) : Trouve la valeur maximale.
  • MIN(col) : Trouve la valeur minimale.
-- Compter le nombre total d'utilisateurs
SELECT COUNT(id) FROM utilisateurs;

-- Compter le nombre d'utilisateurs actifs
SELECT COUNT(id) FROM utilisateurs WHERE actif = TRUE;

-- Obtenir le montant total de toutes les commandes
SELECT SUM(montant) FROM commandes;
GROUP BY (Regrouper)

GROUP BY combine les agrégats avec des catégories.

-- (Table 'commandes' de l'exemple 6.1)

-- Compter le nombre de commandes PAR utilisateur
SELECT
    utilisateur_id,
    COUNT(id_cmd) AS nb_commandes
FROM commandes
GROUP BY utilisateur_id;

-- Résultat:
-- utilisateur_id | nb_commandes
-- ----------------|--------------
-- 1 (Alice)      | 1
-- 2 (Bob)        | 2
-- 4 (Inconnu)    | 1

-- Calculer le CA total PAR utilisateur
SELECT
    utilisateur_id,
    SUM(montant) AS ca_total,
    AVG(montant) AS panier_moyen
FROM commandes
GROUP BY utilisateur_id;
HAVING (Filtrer *aprĂšs* le GROUP BY)

WHERE filtre les lignes *avant* l'agrégat. HAVING filtre les groupes *aprÚs* l'agrégat.

-- Afficher les utilisateurs ayant dépensé plus de 60
SELECT
    utilisateur_id,
    SUM(montant) AS ca_total
FROM commandes
GROUP BY utilisateur_id
HAVING ca_total > 60; -- (ou SUM(montant) > 60)

-- Résultat:
-- utilisateur_id | ca_total
-- ----------------|----------
-- 1 (Alice)      | 75.00
-- 4 (Inconnu)    | 100.00
6.3 Index & Clés (Optimisation)
À quoi sert un Index ?

Un index est une structure de donnĂ©es (gĂ©nĂ©ralement un Arbre B+) qui permet de trouver des lignes **extrĂȘmement rapidement**, sans avoir Ă  scanner toute la table.

Analogie : Un index de base de données est l'index à la fin d'un livre.
Sans index, pour trouver le mot "MariaDB" dans un livre de 500 pages, vous devez lire les 500 pages (Full Table Scan).
Avec un index, vous allez Ă  la lettre 'M', trouvez "MariaDB: p. 5, p. 45, p. 210" et sautez directement aux bonnes pages (Index Seek).

Quand indexer ?
  • Sur les ClĂ©s Primaires (automatiquement indexĂ©es).
  • Sur les ClĂ©s ÉtrangĂšres (FOREIGN KEY) (essentiel pour les JOIN).
  • Sur les colonnes utilisĂ©es dans les WHERE (ex: `WHERE email = ...`).
  • Sur les colonnes utilisĂ©es dans les ORDER BY.

InconvĂ©nient : Les index prennent de la place disque et ralentissent les INSERT et UPDATE (car l'index doit aussi ĂȘtre mis Ă  jour). N'indexez pas tout !

Types d'Index (Contraintes)
TypeDescriptionSQL
PRIMARY KEYL'identifiant unique de la ligne. Ne peut pas ĂȘtre NULL. Une seule par table. Toujours indexĂ©.PRIMARY KEY (id)
UNIQUEGarantit que toutes les valeurs sont uniques (mais peut accepter *plusieurs* NULL).UNIQUE KEY (email)
INDEXUn index "normal", pour accélérer les recherches. Les doublons sont autorisés.INDEX idx_nom (nom)
CompositeUn index sur plusieurs colonnes (ex: pour WHERE nom='A' AND prenom='B').INDEX idx_nom_prenom (nom, prenom)
Vérifier si un Index est utilisé (EXPLAIN)

EXPLAIN est l'outil le plus important pour l'optimisation. Il vous montre le "plan d'exĂ©cution" (comment MariaDB va exĂ©cuter votre requĂȘte).

EXPLAIN SELECT * FROM utilisateurs WHERE email = 'jean.dupont@mail.com';
Résultat (Bon) :
id | select_type | table        | type | possible_keys | key   | key_len | ref   | rows | Extra
---|-------------|--------------|------|---------------|-------|---------|-------|------|-------
1  | SIMPLE      | utilisateurs | ref  | email         | email | 258     | const | 1    | Using index

type: ref et rows: 1. MariaDB a utilisé l'index "email" et a trouvé 1 ligne. TrÚs rapide.

EXPLAIN SELECT * FROM utilisateurs WHERE nom = 'Durand';
-- (En supposant qu'il n'y a PAS d'index sur 'nom')
Résultat (Mauvais) :
id | select_type | table        | type  | possible_keys | key  | key_len | ref   | rows   | Extra
---|-------------|--------------|-------|---------------|------|---------|-------|--------|----------------
1  | SIMPLE      | utilisateurs | ALL   | NULL          | NULL | NULL    | NULL  | 150000 | Using where

type: ALL (Full Table Scan) et rows: 150000. MariaDB a dĂ» lire toute la table. TrĂšs lent.
Solution : CREATE INDEX idx_nom ON utilisateurs (nom);

7.1 Backup (mysqldump)
mysqldump

mysqldump est l'outil CLI standard pour créer un "dump" (export) logique de votre BDD. Il génÚre un gros fichier .sql contenant les CREATE TABLE et INSERT nécessaires pour recréer la base.

Sauvegarder UNE base de données
mysqldump -u [USER] -p [NOM_DB] > backup_db.sql

# Exemple
mysqldump -u root -p ideo_lab_crm > crm_backup_20251101.sql
Sauvegarder TOUTES les bases
mysqldump -u root -p --all-databases > all_dbs_backup.sql
Sauvegarder (compressé)

(Linux) Il est fortement recommandé de compresser le dump à la volée.

mysqldump -u root -p ideo_lab_crm | gzip > crm_backup.sql.gz
Options importantes
# Dump pour InnoDB avec transactions (recommandé)
mysqldump -u root -p \
  --single-transaction \
  --routines \
  --triggers \
  ideo_lab_crm > crm_backup.sql
  • --single-transaction : (Pour InnoDB) Prend un "snapshot" transactionnel de la BDD. Permet de faire le backup sans verrouiller les tables (backup "Ă  chaud").
  • --routines : Inclut les procĂ©dures stockĂ©es et fonctions.
  • --triggers : Inclut les triggers.
Sauvegarder juste la structure (sans données)
mysqldump -u root -p --no-data ideo_lab_crm > structure_seule.sql
7.2 Restauration & Configuration (my.cnf)
Restauration depuis mysqldump

La restauration se fait via le client mysql standard, en utilisant une redirection d'entrée.

# 1. Créez une BDD vide (si elle n'existe pas)
mysql -u root -p -e "CREATE DATABASE ideo_lab_crm;"

# 2. Importez le dump
mysql -u root -p ideo_lab_crm < crm_backup_20251101.sql
Restauration (compressée)
(Linux)
gunzip < crm_backup.sql.gz | mysql -u root -p ideo_lab_crm
Configuration (my.cnf / my.ini)

Le comportement du serveur mysqld est contrÎlé par ce fichier. (Linux: /etc/mysql/my.cnf ou /etc/my.cnf.d/server.cnf).

Toute modification nécessite un redémarrage du service (sudo systemctl restart mariadb).

[mysqld]
# Le 'datadir' (oĂč sont les donnĂ©es)
datadir=/var/lib/mysql

# Networking
bind-address = 127.0.0.1
# (Mettre '0.0.0.0' pour écouter sur toutes les interfaces)
port = 3306
max_connections = 151 # (Augmenter si besoin)

# InnoDB (Le plus important)
# La RAM allouée au cache InnoDB (cache des données et index)
# Mettre 50-70% de la RAM totale du serveur
innodb_buffer_pool_size = 4G

# Logs
log_error = /var/log/mysql/error.log
# (Décommenter pour le debug de performance)
# slow_query_log_file = /var/log/mysql/slow.log
# slow_query_log = 1
# long_query_time = 2

# (Pour la réplication)
# server-id = 1
# log-bin = /var/log/mysql/mariadb-bin
7.3 Réplication (Master/Slave)
Schéma Primaire/Secondaire (Master/Slave)

La réplication asynchrone permet de copier (presque) en temps réel les données d'un serveur "Primaire" (Master) vers un ou plusieurs serveurs "Secondaires" (Slaves).

[Applications (Écriture)]
       |
       | INSERT, UPDATE, DELETE
       ▌
+-----------------------+
| MASTER (Primaire)     |
| (Serveur A)           |
|                       |
|  1. Écrit dans son    |
|     "Binary Log"      |
|     (binlog)          |
+-----------------------+
       |
       | 2. Le Slave demande les nouveaux
       |    événements du binlog
       ▌
+-----------------------+
| SLAVE (Secondaire)    |
| (Serveur B)           |
|                       |
|  3. Écrit dans son    |
|     "Relay Log"       |
|                       |
|  4. "Rejoue" le SQL   |
|     sur ses données   |
+-----------------------+
       |
       | 5. Lecture seule (Reporting, Backup)
       ▌
[Applications (Lecture)]
[Outils de BI]
[Backups]
Cas d'usage de la réplication
  • ScalabilitĂ© en lecture (Read Scaling) : L'application Ă©crit sur le Master, mais lit depuis 3 Slaves (rĂ©partit la charge de SELECT).
  • Analyse / BI (Reporting) : Les requĂȘtes analytiques lourdes (GROUP BY, JOIN complexes) sont exĂ©cutĂ©es sur un Slave dĂ©diĂ©, sans impacter la production (le Master).
  • Sauvegarde (Backup) : On peut faire le mysqldump sur le Slave, sans verrouiller ni stresser le Master.
  • Haute DisponibilitĂ© (Failover) : Si le Master tombe, on peut "promouvoir" manuellement (ou via un outil) le Slave pour qu'il devienne le nouveau Master. (Note: la rĂ©plication standard est *asynchrone*, une perte de donnĂ©es de quelques secondes est possible).
Étapes de configuration (RĂ©sumĂ©)
1. Sur le MASTER (Serveur A)
# a. Modifier my.cnf
[mysqld]
server-id = 1
log-bin = /var/log/mysql/mariadb-bin
binlog_format = ROW

# b. Redémarrer MariaDB
sudo systemctl restart mariadb

# c. Créer un utilisateur pour la réplication
CREATE USER 'repl_user'@'[IP_DU_SLAVE]' IDENTIFIED BY 'pass_repl';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'[IP_DU_SLAVE]';
FLUSH PRIVILEGES;

# d. Noter la position du log
SHOW MASTER STATUS;
-- (Notez le 'File' et 'Position')
2. Sur le SLAVE (Serveur B)
# a. Modifier my.cnf
[mysqld]
server-id = 2 # (DOIT ĂȘtre diffĂ©rent du Master)
relay-log = /var/log/mysql/relay-bin
read_only = 1 # (Bonne pratique)

# b. Redémarrer MariaDB

# c. Configurer le Slave
CHANGE MASTER TO
  MASTER_HOST='[IP_DU_MASTER]',
  MASTER_USER='repl_user',
  MASTER_PASSWORD='pass_repl',
  MASTER_LOG_FILE='[File de SHOW MASTER STATUS]',
  MASTER_LOG_POS=[Position de SHOW MASTER STATUS];

# d. Démarrer la réplication
START SLAVE;

# e. Vérifier
SHOW SLAVE STATUS\G

Cherchez Slave_IO_Running: Yes et Slave_SQL_Running: Yes.

8.1 Cheat-sheet MariaDB / SQL
CLI (Ligne de commande)
# Connexion
mysql -u [user] -p
mysql -u [user] -p -h [host] [database]

# Sécurisation
sudo mysql_secure_installation

# Backup
mysqldump -u [user] -p [database] > backup.sql
mysqldump -u [user] -p --all-databases > all.sql

# Restore
mysql -u [user] -p [database] < backup.sql
Gestion BDD (dans le client mysql)
SHOW DATABASES;
CREATE DATABASE nom_db;
DROP DATABASE nom_db;
USE nom_db;
SHOW TABLES;
DESCRIBE nom_table; -- (ou DESC nom_table)
SHOW CREATE TABLE nom_table;
EXIT; (\q)
DDL (Data Definition Language) - Structure
-- Créer une table
CREATE TABLE nom_table (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    nom VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE,
    age INT DEFAULT 18,
    categorie_id INT,
    FOREIGN KEY (categorie_id) REFERENCES categories(id)
) ENGINE=InnoDB;

-- Modifier une table
ALTER TABLE nom_table
    ADD COLUMN date_ajout DATETIME,
    MODIFY COLUMN nom VARCHAR(150),
    DROP COLUMN age;

-- Ajouter un index
CREATE INDEX idx_nom ON nom_table (nom);

-- Vider une table (rapide)
TRUNCATE TABLE nom_table;

-- Supprimer une table
DROP TABLE nom_table;
DML (Data Manipulation Language) - Données
-- Insérer
INSERT INTO nom_table (col1, col2) VALUES ('val1', 'val2');
INSERT INTO nom_table (col1, col2) VALUES ('a', 1), ('b', 2);

-- Lire
SELECT * FROM nom_table;
SELECT col1, col2 FROM nom_table;
SELECT * FROM nom_table WHERE col1 = 'val1';
SELECT * FROM nom_table WHERE col2 > 10 AND col1 LIKE 'A%';
SELECT * FROM nom_table WHERE col3 IN ('A', 'B', 'C');
SELECT * FROM nom_table WHERE col4 IS NOT NULL;
SELECT * FROM nom_table ORDER BY col1 DESC LIMIT 10 OFFSET 20;

-- Mettre Ă  jour (TOUJOURS avec WHERE)
UPDATE nom_table SET col1 = 'new_val' WHERE id = 5;

-- Supprimer (TOUJOURS avec WHERE)
DELETE FROM nom_table WHERE id = 5;

-- Jointures
SELECT *
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.t1_id;

SELECT *
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.t1_id
WHERE t2.t1_id IS NULL; -- (Lignes de t1 sans t2)

-- Agrégats
SELECT col1, COUNT(id), SUM(montant)
FROM nom_table
WHERE col2 = 'val'
GROUP BY col1
HAVING COUNT(id) > 2;
DCL (Data Control Language) - Utilisateurs
-- Créer un utilisateur
CREATE USER 'user'@'host' IDENTIFIED BY 'password';

-- Donner des droits
GRANT ALL PRIVILEGES ON db_name.* TO 'user'@'host';
GRANT SELECT, INSERT ON db_name.table_name TO 'user'@'host';
GRANT USAGE ON *.* TO 'user'@'host'; -- (Droit de connexion seul)

-- Appliquer les droits
FLUSH PRIVILEGES;

-- Voir les droits
SHOW GRANTS FOR 'user'@'host';

-- Retirer des droits
REVOKE DELETE ON db_name.* FROM 'user'@'host';

-- Supprimer un utilisateur
DROP USER 'user'@'host';