IWA-S04 · Bootcode Semaine 14

SQL Fondamental

CRUD, WHERE, ORDER BY et LIMIT

Jour 2 — Maîtriser les requêtes SQL de base

Objectifs de la leçon

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 !

Plan du cours

1

Les 4 opérations fondamentales : CRUD en SQL

INSERT, SELECT, UPDATE, DELETE

2

SELECT avec WHERE : filtrer les données

=, LIKE, AND, OR, IN

3

ORDER BY et LIMIT/OFFSET : trier et paginer

Trier les résultats et contrôler la pagination

4

UPDATE et DELETE : toujours avec WHERE !

Danger sans WHERE — l'erreur la plus coûteuse

5

Exercices interactifs en direct avec psql

Pratique sur une vraie base de données

Module 1

Les 4 opérations fondamentales

CRUD en SQL : INSERT, SELECT, UPDATE, DELETE

INSERT

Créer

SELECT

Lire

UPDATE

Modifier

DELETE

Supprimer

CRUD SQL ↔ Verbes HTTP

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 !

INSERT INTO — Syntaxe

Ajouter une nouvelle ligne dans une table

-- Syntaxe complète

INSERT INTO nom_table (colonne1, colonne2, colonne3)

VALUES ('valeur1', 'valeur2', 'valeur3');

Règles importantes :

  • • Les colonnes et les valeurs doivent être dans le même ordre
  • • Les chaînes de caractères utilisent des guillemets simples (')
  • • Les nombres n'ont pas de guillemets
  • • Les colonnes avec DEFAULT ou SERIAL peuvent être omises

INSERT INTO — Exemple avec articles

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');

Notre table de référence : articles

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

SELECT — Lire des données

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

SELECT — Exemples concrets

-- 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

SELECT — Alias avec AS

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

SELECT avec WHERE

Filtrer les données : =, LIKE, AND, OR, IN

WHERE = le filtre de votre requête

Sans WHERE, vous obtenez TOUTES les lignes

WHERE — Égalité avec =

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

WHERE — Recherche textuelle avec LIKE

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

WHERE — Combiner avec AND / OR

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

WHERE — L'opérateur IN

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

ORDER BY et LIMIT/OFFSET

Trier et paginer les résultats

ORDER BY

Trier par une colonne

LIMIT/OFFSET

Paginer les résultats

ORDER BY — Trier 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;

LIMIT / OFFSET — Paginer les résultats

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

Pagination — Exemple complet

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

UPDATE et DELETE

Toujours avec WHERE — ou jamais !

⚠️ L'erreur la plus dangereuse en SQL

UPDATE ou DELETE sans WHERE modifie/supprime TOUTES les lignes

UPDATE — Modifier des données

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'

DELETE — Supprimer des lignes

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é

❌ DANGER : sans WHERE

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

CRUD SQL ↔ API REST ↔ HTTP

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

Piège #1 : UPDATE ou DELETE sans WHERE

❌ 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

Piège #2 : Guillemets simples vs doubles

❌ 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

Piège #3 : Pagination sans ORDER BY

❌ 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

Exercices pratiques

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

Exercices — Consignes

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

À retenir !

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

Questions ?

SQL Fondamental — CRUD, WHERE, ORDER BY et LIMIT

Prochaine leçon : Jointures SQL et relations entre tables