Section 11.2.4 : SQL — INSERT, UPDATE, DELETE et schéma
🎯 Objectif pédagogique
Maîtriser les opérations d'écriture SQL (INSERT, UPDATE, DELETE) et la définition de schéma (CREATE TABLE). Vous serez capable de créer des tables, insérer des données, les mettre à jour et les supprimer en toute sécurité.
Les opérations CRUD
CRUD = Create, Read, Update, Delete — les 4 opérations fondamentales sur les données :
| Opération | SQL | HTTP | Description |
|---|---|---|---|
| Create | INSERT | POST | Ajouter des données |
| Read | SELECT | GET | Lire des données |
| Update | UPDATE | PUT/PATCH | Modifier des données |
| Delete | DELETE | DELETE | Supprimer des données |
CREATE TABLE — Définir la structure
CREATE TABLE applications (
id SERIAL PRIMARY KEY, -- Auto-increment (PostgreSQL)
user_id INTEGER NOT NULL, -- Obligatoire
company VARCHAR(100) NOT NULL,
position VARCHAR(100) NOT NULL,
status VARCHAR(20) DEFAULT 'applied',
salary_min INTEGER,
salary_max INTEGER,
applied_date DATE DEFAULT CURRENT_DATE,
notes TEXT,
created_at TIMESTAMP DEFAULT NOW(),
-- Contrainte : user_id doit exister dans users
FOREIGN KEY (user_id) REFERENCES users(id),
-- Contrainte : salaire max > salaire min
CHECK (salary_max IS NULL OR salary_max >= salary_min)
);
Types de données courants :
| Type | Usage | Exemple |
|---|---|---|
| INTEGER | Nombres entiers | id, age, quantité |
| SERIAL | Auto-increment | id (clé primaire) |
| VARCHAR(n) | Texte limité à n caractères | name, email |
| TEXT | Texte illimité | description, notes |
| BOOLEAN | Vrai/Faux | is_active |
| DATE | Date | applied_date |
| TIMESTAMP | Date + heure | created_at |
| DECIMAL(10,2) | Nombre décimal précis | prix |
| JSONB | JSON binaire (PostgreSQL) | metadata |
INSERT — Ajouter des données
-- Insérer une ligne
INSERT INTO applications (user_id, company, position, status, salary_min)
VALUES (1, 'Mistral AI', 'ML Engineer', 'applied', 90000);
-- Insérer plusieurs lignes
INSERT INTO applications (user_id, company, position, salary_min) VALUES
(1, 'Datadog', 'Backend Python', 65000),
(1, 'Doctolib', 'Full-Stack', 60000),
(2, 'OVH', 'DevOps', 45000);
-- Insérer et retourner l'ID créé (PostgreSQL)
INSERT INTO applications (user_id, company, position)
VALUES (1, 'Vercel', 'Frontend')
RETURNING id, company;
UPDATE — Modifier des données
-- Modifier une candidature spécifique
UPDATE applications
SET status = 'interview', notes = 'Entretien le 20 mars'
WHERE id = 5;
-- Modifier plusieurs lignes
UPDATE applications
SET status = 'rejected'
WHERE applied_date < '2026-01-01' AND status = 'applied';
TOUJOURS un WHERE avec UPDATE et DELETE !
UPDATE applications SET status = 'rejected' sans WHERE modifie TOUTES les lignes. C'est l'erreur la plus destructrice en SQL. Marc a failli rejeter toutes ses candidatures par erreur. Règle de survie : écrivez le WHERE AVANT le SET.
DELETE — Supprimer des données
-- Supprimer une candidature
DELETE FROM applications WHERE id = 3;
-- Supprimer les candidatures anciennes refusées
DELETE FROM applications
WHERE status = 'rejected'
AND applied_date < '2026-01-01';
-- ⚠️ JAMAIS sans WHERE !
-- DELETE FROM applications; -- Supprime TOUT
ALTER TABLE — Modifier la structure
-- Ajouter une colonne
ALTER TABLE applications ADD COLUMN url TEXT;
-- Renommer une colonne
ALTER TABLE applications RENAME COLUMN url TO job_url;
-- Supprimer une colonne
ALTER TABLE applications DROP COLUMN job_url;
-- Ajouter un index (performance)
CREATE INDEX idx_applications_status ON applications(status);
CREATE INDEX idx_applications_user ON applications(user_id);
🏋️ Exercice pratique (20 minutes)
-- Pratiquez le CRUD complet
-- 1. Créez une table 'skills' (id, name, category, level)
-- 2. Insérez 5 compétences
-- 3. Modifiez le niveau de Python de 'beginner' à 'intermediate'
-- 4. Supprimez les skills avec level = 'unknown'
-- 5. Ajoutez une colonne 'learned_date'
Que se passe-t-il si vous exécutez : UPDATE users SET active = false; ?
Quel type de donnée est recommandé pour les prix en SQL ?