🔗 Les JOIN Explained
INNER JOIN - Intersection
Retourne SEULEMENT les lignes qui matchent dans les 2 tables.
SELECT users.name, orders.total
FROM users
INNER JOIN orders ON users.id = orders.user_id;
-- users: 1:Alice, 2:Bob, 3:Charlie
-- orders: {user_id:1, total:100}, {user_id:2, total:200}
-- Résultat: Alice-100, Bob-200 (Charlie exclu !)
LEFT JOIN - Tout à Gauche
Retourne TOUTES les lignes de gauche + matches de droite (NULL si pas de match).
SELECT users.name, orders.total FROM users LEFT JOIN orders ON users.id = orders.user_id; -- Résultat: -- Alice-100 -- Bob-200 -- Charlie-NULL (même sans commande !)
RIGHT JOIN - Tout à Droite
Inverse de LEFT JOIN (rarement utilisé, on préfère LEFT).
SELECT users.name, orders.total FROM users RIGHT JOIN orders ON users.id = orders.user_id;
⚡ INDEX - Accélérer les Requêtes
Pourquoi les Index ?
Imagine un dictionnaire : tu cherches "Zèbre". Sans index alphabétique, tu lis TOUTES les pages ! Avec l'index, tu vas direct à Z. C'est pareil en SQL ! 📖➡️Z
Sans INDEX
Full Table Scan 🐌
1M lignes → 1M lectures
Avec INDEX
Index Seek ⚡
1M lignes → ~20 lectures
Créer des Index
-- Index simple CREATE INDEX idx_email ON users(email); -- Index composite (plusieurs colonnes) CREATE INDEX idx_name_city ON users(last_name, city); -- Index unique (email unique) CREATE UNIQUE INDEX idx_username ON users(username); -- Supprimer un index DROP INDEX idx_email;
⚠️ Attention !
Trop d'index ralentit les INSERT/UPDATE/DELETE ! Trouve l'équilibre entre rapidité des SELECT et coût des écritures. En général : indexe les colonnes utilisées dans WHERE, JOIN, ORDER BY.
🔒 Transactions ACID
ACID - Les 4 Propriétés
Atomicity (Atomicité)
Tout ou rien : soit tous les changements passent, soit aucun
Consistency (Cohérence)
Les contraintes BDD sont toujours respectées
Isolation (Isolation)
Les transactions concurrentes ne se perturbent pas
Durability (Durabilité)
Une fois committed, les données sont sauvées
Exemple : Transfert d'argent
BEGIN TRANSACTION; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- Si tout OK : COMMIT; -- Si erreur : ROLLBACK;
💡 Si la 2e UPDATE échoue, la 1e est annulée automatiquement (atomicité) !
👁️ Vues (Views)
C'est quoi une Vue ?
Une requête SQL enregistrée qu'on peut utiliser comme une table virtuelle !
-- Créer une vue CREATE VIEW active_users AS SELECT id, name, email FROM users WHERE status = 'active' AND deleted_at IS NULL; -- Utiliser la vue (comme une table !) SELECT * FROM active_users WHERE city = 'Paris'; -- Plus besoin de répéter le WHERE status = 'active' partout !
✅ Avantages
- ✅ Simplifier les requêtes complexes
- ✅ Sécurité : masquer certaines colonnes
- ✅ Abstraction : changer la structure sans casser le code
🚀 Optimisations SQL
1. Utiliser WHERE avant JOIN
Filtrer d'abord réduit les données à joindre
2. SELECT seulement les colonnes nécessaires
SELECT id, name (pas SELECT *)
3. LIMIT pour limiter les résultats
Pagination essentielle !
4. Utiliser EXPLAIN pour analyser
EXPLAIN SELECT * FROM users WHERE email = 'test';
🎮 Quiz Interactif !
Réponds aux questions et apprends en t'amusant !
💡 Feedback immédiat après chaque réponse