Retour

📊 SQL Pratique

Maîtriser SQL en production

🔗 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

Glisser pour continuer vers NoSQL & Redis
⬇️