← HUB ✦ Holberton School — Bases de données ✦

SQL
CRUD OPERATIONS

Créer · Lire · Mettre à jour · Supprimer

QU'EST-CE QUE SQL ?
🗄️ LE LANGAGE DES BASES DE DONNÉES

SQL (Structured Query Language) est le langage utilisé pour communiquer avec une base de données relationnelle. Il te permet de stocker, retrouver, modifier et supprimer des données de façon structurée.

🕹️ ANALOGIE GAMING

Une base de données, c'est ton fichier de sauvegarde de jeu. SQL, c'est le menu qui te permet d'y accéder. CRUD = les 4 actions fondamentales : créer un personnage, voir ses stats, changer son équipement, le supprimer. Sans SQL, tu ne peux pas toucher à la sauvegarde.

CRUD signifie Create, Read, Update, Delete — les 4 opérations de base sur n'importe quelle donnée.
CONCEPTS CLÉS
📦 BASE DE DONNÉES

Un ensemble organisé de données stockées sur un serveur. Elle contient plusieurs tables, comme un classeur Excel contient plusieurs feuilles.

MySQL, PostgreSQL, SQLite sont des systèmes qui gèrent ces bases.
📋 TABLE

Une table = un tableau avec des colonnes (les champs) et des lignes (les enregistrements). Chaque table représente un type d'objet : utilisateurs, produits, commandes...

Comme une feuille Excel : les en-têtes = colonnes, chaque ligne = une entrée.
🔑 CLÉ PRIMAIRE

Un identifiant unique pour chaque ligne. Généralement un id qui s'incrémente automatiquement. Il garantit qu'aucune ligne n'est identique.

C'est l'ID joueur dans un RPG — chaque perso en a un unique, même s'ils ont le même nom.
🔍 REQUÊTE (QUERY)

Une instruction SQL envoyée à la base de données. Elle retourne un résultat (SELECT) ou modifie des données (INSERT, UPDATE, DELETE).

Pense à une requête comme une commande vocale : tu demandes, la BDD répond.
🎯 CONDITION WHERE

Un filtre qui précise sur quelles lignes la requête s'applique. Sans WHERE sur un UPDATE ou DELETE, toutes les lignes sont affectées.

WHERE = le ciblage dans un FPS. Sans lui, tu tires dans toutes les directions.
⚙️ TYPE DE DONNÉE

Chaque colonne a un type : INT (entier), VARCHAR(n) (texte limité), TEXT (texte long), BOOLEAN, DATE... Le type définit ce qu'on peut stocker.

Comme les slots d'inventaire : certains n'acceptent que des armes, d'autres que des potions.
CREATE — INSÉRER DES DONNÉES
➕ INSERT INTO

Ajoute une nouvelle ligne dans une table. On crée d'abord la table avec CREATE TABLE, puis on y insère des données.

-- Créer la table d'abord
CREATE TABLE joueurs (
    id     INT AUTO_INCREMENT PRIMARY KEY,  -- id unique auto
    nom    VARCHAR(50) NOT NULL,              -- texte obligatoire
    level  INT DEFAULT 1,                    -- valeur par défaut
    classe VARCHAR(30)                        -- peut être NULL
);

-- Insérer un joueur
INSERT INTO joueurs (nom, level, classe)
VALUES ('Arthas', 60, 'Paladin');

-- Insérer plusieurs joueurs d'un coup
INSERT INTO joueurs (nom, level, classe)
VALUES
    ('Thrall', 60, 'Chaman'),
    ('Sylvanas', 60, 'Chasseur');
Tu n'as pas besoin de préciser id — il se génère automatiquement grâce à AUTO_INCREMENT.
READ — LIRE DES DONNÉES
🔎 SELECT

Récupère des données depuis une table. C'est la requête la plus utilisée en SQL.

-- Tout récupérer (toutes les colonnes, toutes les lignes)
SELECT * FROM joueurs;

-- Colonnes spécifiques seulement
SELECT nom, level FROM joueurs;

-- Filtrer avec WHERE
SELECT * FROM joueurs WHERE level = 60;
SELECT * FROM joueurs WHERE classe = 'Paladin';

-- Trier les résultats
SELECT * FROM joueurs ORDER BY level DESC;  -- du plus haut au plus bas

-- Limiter le nombre de résultats
SELECT * FROM joueurs LIMIT 5;

-- Conditions multiples
SELECT * FROM joueurs
WHERE level >= 50 AND classe = 'Paladin';
SELECT * retourne toutes les colonnes. En pratique, précise les colonnes dont tu as besoin — c'est plus rapide et plus lisible.
UPDATE — MODIFIER DES DONNÉES
✏️ UPDATE SET

Modifie des données existantes dans une table. Le WHERE est obligatoire.

-- Mettre à jour le level d'un joueur spécifique
UPDATE joueurs
SET level = 70
WHERE id = 1;

-- Modifier plusieurs colonnes à la fois
UPDATE joueurs
SET level = 70, classe = 'Chevalier de la mort'
WHERE nom = 'Arthas';
TOUJOURS mettre un WHERE sur un UPDATE. Sans WHERE, toutes les lignes de la table sont modifiées.
DELETE — SUPPRIMER DES DONNÉES
🗑️ DELETE FROM

Supprime des lignes dans une table. Irréversible — à utiliser avec précaution.

-- Supprimer un joueur spécifique
DELETE FROM joueurs WHERE id = 2;

-- Supprimer tous les joueurs de level 1
DELETE FROM joueurs WHERE level = 1;
TOUJOURS mettre un WHERE sur un DELETE. Sans WHERE, toute la table est vidée — irréversible.
Pour vider entièrement une table, TRUNCATE TABLE joueurs est plus rapide que DELETE FROM joueurs sans WHERE.
TABLEAU RÉCAP CRUD
ACTION COMMANDE SQL EXEMPLE MINIMAL RISQUE SANS WHERE
CREATE INSERT INTO INSERT INTO t (col) VALUES (val) Aucun
READ SELECT SELECT * FROM t WHERE id = 1 Retourne tout
UPDATE UPDATE SET UPDATE t SET col = val WHERE id = 1 Modifie tout ⚠️
DELETE DELETE FROM DELETE FROM t WHERE id = 1 Vide la table ⚠️
BOSS FIGHTS
👾 BOSS 1 — LVL 1 : CRÉER ET PEUPLER UNE TABLE
⭐ LVL 1 — FACILE

Crée une table personnages avec les colonnes id, nom et hp. Insère 3 personnages.

CREATE TABLE personnages (
    id  INT AUTO_INCREMENT PRIMARY KEY,
    nom VARCHAR(50) NOT NULL,
    hp  INT DEFAULT 100
);

INSERT INTO personnages (nom, hp)
VALUES
    ('Guerrier', 200),
    ('Mage', 80),
    ('Voleur', 120);
👹 BOSS 2 — LVL 2 : FILTRER ET TRIER
⭐⭐ LVL 2 — INTERMÉDIAIRE

Récupère tous les personnages avec plus de 100 HP, triés du plus résistant au moins résistant. Affiche uniquement nom et hp.

SELECT nom, hp
FROM personnages
WHERE hp > 100
ORDER BY hp DESC;
Résultat attendu : Guerrier (200), Voleur (120) — le Mage à 80 HP est exclu du filtre.
💀 BOSS FINAL — LVL 3 : HOLBERTON STYLE
⭐⭐⭐ LVL 3 — HOLBERTON

Le Mage a été blessé, ses HP tombent à 40. Le Voleur quitte la partie. Affiche l'état final de la table.

-- Le mage prend des dégâts
UPDATE personnages
SET hp = 40
WHERE nom = 'Mage';

-- Le voleur quitte
DELETE FROM personnages
WHERE nom = 'Voleur';

-- État final de la table
SELECT * FROM personnages ORDER BY hp DESC;
ERREURS CLASSIQUES
❌ MAUVAIS
-- UPDATE sans WHERE = catastrophe
UPDATE joueurs
SET level = 1;
-- Tous les joueurs repassent level 1 !
✅ CORRECT
-- Toujours cibler avec WHERE
UPDATE joueurs
SET level = 1
WHERE id = 3;
-- Seulement le joueur id=3 est affecté
❌ MAUVAIS
-- Comparer NULL avec =
SELECT * FROM joueurs
WHERE classe = NULL;
-- Retourne toujours 0 résultat !
✅ CORRECT
-- NULL se teste avec IS NULL
SELECT * FROM joueurs
WHERE classe IS NULL;
-- IS NOT NULL pour l'inverse
❌ MAUVAIS
-- Chaîne avec mauvaise casse
SELECT * FROM joueurs
WHERE nom = 'arthas';
-- Peut retourner 0 résultat si la BDD
-- est sensible à la casse
✅ CORRECT
-- Respecter la casse ou utiliser LOWER()
SELECT * FROM joueurs
WHERE LOWER(nom) = 'arthas';
-- Fonctionne quelle que soit la casse
SKILL TREE SQL
CREATE TABLE — Définir la structure de tes données
INSERT INTO — Ajouter des lignes dans la table
SELECT * — Lire toutes les données d'une table
SELECT + WHERE — Filtrer précisément les résultats
ORDER BY / LIMIT — Trier et paginer les résultats
UPDATE + WHERE — Modifier des données en sécurité
DELETE + WHERE — Supprimer sans tout effacer
RÉSUMÉ
📜 LES 4 RÈGLES D'OR
-- ══════════════════════════════════════════════════
--  SQL CRUD — Règles à ne jamais oublier
-- ══════════════════════════════════════════════════

-- 1. TOUJOURS un WHERE sur UPDATE et DELETE
UPDATE table SET col = val WHERE id = X;   -- ✅
DELETE FROM table WHERE id = X;            -- ✅

-- 2. NULL ne se compare pas avec =
WHERE col IS NULL     -- ✅ correct
WHERE col = NULL      -- ❌ retourne toujours rien

-- 3. SELECT * c'est bien pour déboguer, pas en production
SELECT nom, level FROM table;   -- ✅ précis et rapide
SELECT * FROM table;            -- OK pour explorer

-- 4. AUTO_INCREMENT gère l'id — ne jamais l'insérer manuellement
INSERT INTO t (nom) VALUES ('X');  -- ✅ id généré auto