IWA-S04 · Bootcode Semaine 14
CRUD, WHERE, ORDER BY et LIMIT
Jour 2 — Maîtriser les requêtes SQL de base
1. Insérer des données avec INSERT INTO
Ajouter des lignes dans une table
2. Filtrer avec WHERE
=, LIKE, AND, OR, IN
3. Trier et paginer avec ORDER BY, LIMIT
ASC, DESC, OFFSET pour la pagination
4. Modifier et supprimer en toute sécurité
UPDATE et DELETE — TOUJOURS avec WHERE !
Les 4 opérations fondamentales : CRUD en SQL
INSERT, SELECT, UPDATE, DELETE
SELECT avec WHERE : filtrer les données
=, LIKE, AND, OR, IN
ORDER BY et LIMIT/OFFSET : trier et paginer
Trier les résultats et contrôler la pagination
UPDATE et DELETE : toujours avec WHERE !
Danger sans WHERE — l'erreur la plus coûteuse
Exercices interactifs en direct avec psql
Pratique sur une vraie base de données
Module 1
CRUD en SQL : INSERT, SELECT, UPDATE, DELETE
INSERT
Créer
SELECT
Lire
UPDATE
Modifier
DELETE
Supprimer
Chaque opération SQL correspond exactement à un verbe HTTP
INSERT INTO
Créer une nouvelle ligne
→ HTTP POST
SELECT
Lire des données
→ HTTP GET
UPDATE
Modifier des données existantes
→ HTTP PUT / PATCH
DELETE
Supprimer des données
→ HTTP DELETE
💡 Quand vous construisez une API REST, chaque endpoint correspond à une requête SQL !
Ajouter une nouvelle ligne dans une table
-- Syntaxe complète
INSERT INTO nom_table (colonne1, colonne2, colonne3)
VALUES ('valeur1', 'valeur2', 'valeur3');
Règles importantes :
Table : articles(id, titre, contenu, auteur, date_creation)
-- Insérer un nouvel article
INSERT INTO articles (titre, contenu, auteur)
VALUES (
'Introduction à SQL',
'SQL est le langage des bases de données...',
'Marie Dupont'
);
✅ id est généré automatiquement (SERIAL)
✅ date_creation utilise DEFAULT NOW()
-- Insérer plusieurs lignes d'un coup
INSERT INTO articles (titre, auteur) VALUES
('Jointures SQL', 'Marie'),
('Sous-requêtes', 'Pierre'),
('Index et perf', 'Marie');
Tous les exemples du cours utilisent cette table
CREATE TABLE articles (
id SERIAL PRIMARY KEY,
titre VARCHAR(255) NOT NULL,
contenu TEXT,
auteur VARCHAR(100) NOT NULL,
categorie VARCHAR(50) DEFAULT 'general',
vues INTEGER DEFAULT 0,
publie BOOLEAN DEFAULT FALSE,
date_creation TIMESTAMP DEFAULT NOW()
);
💡 SERIAL = auto-incrément | DEFAULT = valeur par défaut | NOW() = date/heure actuelle
La requête la plus utilisée en SQL
Sélectionner TOUTES les colonnes
SELECT * FROM articles;
Sélectionner des colonnes précises
SELECT titre, auteur FROM articles;
⚠️ Évitez SELECT * en production — c'est plus lent et moins maintenable
Préférez nommer les colonnes dont vous avez besoin
-- Tous les articles
SELECT titre, auteur, date_creation
FROM articles;
-- Combien d'articles ?
SELECT COUNT(*) FROM articles;
-- Articles avec leur nombre de vues
SELECT titre, vues FROM articles;
💡 COUNT(*) compte le nombre de lignes — très utile pour les statistiques
Renommer les colonnes dans le résultat
-- Sans alias : noms de colonnes bruts
SELECT titre, vues FROM articles;
-- Avec alias : résultat plus lisible
SELECT titre AS "Titre de l'article",
vues AS "Nombre de vues"
FROM articles;
✅ Les alias rendent les résultats plus lisibles pour les humains
Utile aussi dans les sous-requêtes et les jointures
Module 2
Filtrer les données : =, LIKE, AND, OR, IN
WHERE = le filtre de votre requête
Sans WHERE, vous obtenez TOUTES les lignes
Filtrer pour une valeur exacte
-- Articles de Marie Dupont
SELECT * FROM articles
WHERE auteur = 'Marie Dupont';
-- Articles non publiés
SELECT titre FROM articles
WHERE publie = FALSE;
-- Articles avec 0 vues
SELECT titre FROM articles
WHERE vues = 0;
💡 Texte entre guillemets simples, nombres sans guillemets, booléens en majuscules
Le joker % remplace n'importe quelle suite de caractères
-- Titres qui contiennent 'SQL'
SELECT titre FROM articles
WHERE titre LIKE '%SQL%';
-- Titres qui commencent par 'Intro'
SELECT titre FROM articles
WHERE titre LIKE 'Intro%';
-- Auteurs dont le nom finit par 'pont'
SELECT auteur FROM articles
WHERE auteur LIKE '%pont';
'%SQL%'
Contient SQL
'Intro%'
Commence par Intro
'%pont'
Finit par pont
AND = toutes les conditions doivent être vraies
SELECT * FROM articles
WHERE auteur = 'Marie'
AND publie = TRUE;
Articles de Marie ET publiés
OR = au moins une condition doit être vraie
SELECT * FROM articles
WHERE auteur = 'Marie'
OR auteur = 'Pierre';
Articles de Marie OU de Pierre
⚠️ Priorité : AND est évalué avant OR — utilisez des parenthèses pour clarifier !
WHERE (auteur = 'Marie' OR auteur = 'Pierre') AND publie = TRUE
Raccourci pour plusieurs OR avec la même colonne
❌ Plusieurs OR — verbeux
SELECT * FROM articles
WHERE categorie = 'sql'
OR categorie = 'php'
OR categorie = 'js';
✅ IN — plus propre
SELECT * FROM articles
WHERE categorie IN ('sql', 'php', 'js');
💡 IN est plus lisible, plus facile à maintenir, et souvent plus performant
Fonctionne aussi avec des sous-requêtes : WHERE id IN (SELECT ...)
Module 3
Trier et paginer les résultats
ORDER BY
Trier par une colonne
LIMIT/OFFSET
Paginer les résultats
ASC — Croissant (par défaut)
SELECT titre, vues
FROM articles
ORDER BY vues ASC;
-- Du moins vu au plus vu
DESC — Décroissant
SELECT titre, vues
FROM articles
ORDER BY vues DESC;
-- Du plus vu au moins vu
-- Trier par auteur (A→Z), puis par date (récent d'abord)
SELECT * FROM articles
ORDER BY auteur ASC, date_creation DESC;
Contrôler le nombre de lignes retournées
-- Les 5 premiers articles
SELECT * FROM articles
ORDER BY date_creation DESC
LIMIT 5;
-- Les 5 articles suivants (page 2)
SELECT * FROM articles
ORDER BY date_creation DESC
LIMIT 5 OFFSET 5;
📐 Formule de pagination :
OFFSET = (page - 1) × taille_page
Page 1 (10 articles) → LIMIT 10 OFFSET 0
Page 2 (10 articles) → LIMIT 10 OFFSET 10
Page 3 (10 articles) → LIMIT 10 OFFSET 20
Afficher les articles publiés, 10 par page, du plus récent au plus ancien
-- Page 1 : les 10 premiers
SELECT titre, auteur, date_creation
FROM articles
WHERE publie = TRUE
ORDER BY date_creation DESC
LIMIT 10 OFFSET 0;
-- Page 3 : offset = (3 - 1) × 10 = 20
SELECT titre, auteur, date_creation
FROM articles
WHERE publie = TRUE
ORDER BY date_creation DESC
LIMIT 10 OFFSET 20;
⚠️ TOUJOURS un ORDER BY avec LIMIT/OFFSET — sans tri, la pagination est imprévisible !
Module 4
Toujours avec WHERE — ou jamais !
⚠️ L'erreur la plus dangereuse en SQL
UPDATE ou DELETE sans WHERE modifie/supprime TOUTES les lignes
Changer les valeurs d'une ou plusieurs lignes
-- Publier l'article id 5
UPDATE articles
SET publie = TRUE
WHERE id = 5;
-- Incrémenter les vues de l'article id 3
UPDATE articles
SET vues = vues + 1
WHERE id = 3;
-- Changer la catégorie de tous les articles de Marie
UPDATE articles
SET categorie = 'bases-de-donnees'
WHERE auteur = 'Marie Dupont';
✅ SET pour les nouvelles valeurs, WHERE pour cibler les lignes
On peut modifier plusieurs colonnes : SET col1 = 'a', col2 = 'b'
Retirer des lignes d'une table — définitivement
-- Supprimer l'article id 7
DELETE FROM articles
WHERE id = 7;
-- Supprimer tous les brouillons (non publiés)
DELETE FROM articles
WHERE publie = FALSE;
-- Supprimer les articles avec 0 vues et non publiés
DELETE FROM articles
WHERE vues = 0 AND publie = FALSE;
⚠️ DELETE est irréversible — pas de Ctrl+Z !
Astuce : faites d'abord un SELECT avec le même WHERE pour vérifier ce qui sera supprimé
L'erreur la plus coûteuse en SQL
❌ UPDATE sans WHERE
UPDATE articles
SET publie = TRUE;
→ TOUS les articles sont publiés !
→ Même les brouillons !
❌ DELETE sans WHERE
DELETE FROM articles;
→ TOUS les articles sont supprimés !
→ La table est vidée ! Irréversible !
Règle d'or : TOUJOURS vérifier votre WHERE avant d'exécuter !
Faites un SELECT d'abord pour voir les lignes affectées
La correspondance exacte entre base de données et API
Action
SQL
HTTP
Route REST
Exemple
Créer
INSERT
POST
/articles
Nouvel article
Lire
SELECT
GET
/articles/:id
Voir article 5
Modifier
UPDATE
PUT
/articles/:id
Changer titre
Supprimer
DELETE
DELETE
/articles/:id
Suppr. article 7
💡 Quand vous construisez une API, chaque route traduit une requête SQL
❌ Sans WHERE
UPDATE articles
SET auteur = 'Inconnu';
→ Tous les auteurs deviennent 'Inconnu' !
100% des lignes modifiées
✅ Avec WHERE
UPDATE articles
SET auteur = 'Inconnu'
WHERE id = 42;
→ Seul l'article 42 est modifié
1 seule ligne affectée
💡 Astuce de pro : commencez toujours par écrire le WHERE, puis ajoutez le SET au-dessus
❌ Guillemets doubles pour les valeurs
SELECT * FROM articles
WHERE auteur = "Marie";
-- En PostgreSQL, "Marie" est un
-- identifiant, pas une chaîne !
✅ Guillemets simples pour les valeurs
SELECT * FROM articles
WHERE auteur = 'Marie';
-- 'Marie' est bien une chaîne
-- de caractères
Règle : 'valeur' (simple) pour le texte | "identifiant" (double) pour les noms de colonnes/table
En pratique, on n'utilise presque jamais les guillemets doubles — sauf si un nom contient des espaces
❌ LIMIT sans ORDER BY
SELECT * FROM articles
LIMIT 10 OFFSET 0;
→ L'ordre n'est pas garanti !
Des lignes peuvent apparaître sur plusieurs pages
✅ LIMIT avec ORDER BY
SELECT * FROM articles
ORDER BY id ASC
LIMIT 10 OFFSET 0;
→ Résultats ordonnés et stables
Chaque page montre des lignes uniques
⚠️ Sans ORDER BY, PostgreSQL peut retourner les lignes dans n'importe quel ordre
Les bases de données ne garantissent aucun ordre par défaut — c'est dans la norme SQL !
Module 5
En direct avec psql
Exercice 1 : INSERT
Insérez 3 articles dans la table
Exercice 2 : SELECT + WHERE
Filtrez par auteur et catégorie
Exercice 3 : ORDER BY + LIMIT
Paginez les résultats
Exercice 4 : UPDATE + DELETE
Modifiez et supprimez avec WHERE
Ex 1 — INSERT INTO
Insérez un article avec titre='Mon premier SQL', auteur='Votre nom', categorie='sql'
Insérez un article avec titre='Les jointures', auteur='Votre nom', publie=TRUE
Ex 2 — SELECT + WHERE
Trouvez tous les articles de votre auteur
Trouvez les articles dont le titre contient 'SQL' (LIKE)
Trouvez les articles dans les catégories 'sql' ou 'php' (IN)
Ex 3 — ORDER BY + LIMIT
Les 5 articles les plus vus (ORDER BY vues DESC LIMIT 5)
Page 2 des articles publiés (10 par page, du plus récent)
Ex 4 — UPDATE + DELETE
Publiez l'article id 1 (UPDATE ... SET publie=TRUE WHERE id=1)
Supprimez les articles avec 0 vues et non publiés
CRUD = 4 verbes SQL
INSERT, SELECT, UPDATE, DELETE ↔ POST, GET, PUT, DELETE
⚠️ TOUJOURS un WHERE
UPDATE/DELETE sans WHERE = catastrophe sur TOUTE la table
OFFSET = (page - 1) × taille
Formule de pagination avec LIMIT et ORDER BY
LIKE + % = recherche texte
'%mot%' contient | 'mot%' commence | '%mot' finit
Guillemets : 'texte' (simple) vs "identifiant" (double)
En SQL, les valeurs texte utilisent toujours les guillemets simples
SQL Fondamental — CRUD, WHERE, ORDER BY et LIMIT
Prochaine leçon : Jointures SQL et relations entre tables