1. Qu'est-ce que SQL ?
SQL est un langage déclaratif : tu décris quelles données tu veux, et le moteur (PostgreSQL, etc.) décide comment les récupérer. On l'utilise pour :
- interroger des données (analytics, back-office, API) ;
- insérer, modifier, supprimer des lignes ;
- définir la structure (tables, index, contraintes).
Chaque SGBD a des variantes (PostgreSQL ≠ MySQL sur certains détails), mais SELECT, WHERE, JOIN, GROUP BY couvrent l'essentiel du travail quotidien — data analyst, dev backend ou entretien technique.
2. Tables et clés
Une table = lignes (enregistrements) × colonnes (champs typés). Exemple métier :
-- Table clients | id | nom | pays | |----|--------|------| | 1 | Alice | FR | | 2 | Bob | US | -- Table commandes | id | client_id | montant | |----|-----------|---------| | 10 | 1 | 120 | | 11 | 1 | 45 | | 12 | 2 | 200 |
- Clé primaire (PK) : identifie une ligne de façon unique (
id). - Clé étrangère (FK) : référence une PK d'une autre table (
client_id→clients.id).
3. SELECT — lire des données
Syntaxe de base (comme sur 1Keydata — SELECT) :
-- Toutes les colonnes SELECT * FROM clients; -- Colonnes choisies SELECT nom, pays FROM clients; -- Alias de colonne (AS) SELECT nom AS client, pays AS code_pays FROM clients;
DISTINCT élimine les doublons : SELECT DISTINCT pays FROM clients;
4. WHERE — filtrer
WHERE garde uniquement les lignes qui respectent une condition :
SELECT nom, pays FROM clients WHERE pays = 'FR';
SELECT * FROM commandes WHERE montant >= 100;
SELECT * FROM clients
WHERE pays IN ('FR', 'BE', 'CH')
AND nom LIKE 'A%'; -- commence par A
SELECT email FROM users WHERE email IS NOT NULL;Opérateurs utiles : =, <>, AND, OR, IN, BETWEEN, LIKE, IS NULL.
5. ORDER BY — trier
SELECT nom, montant FROM commandes ORDER BY montant DESC; -- du plus grand au plus petit SELECT nom FROM clients ORDER BY pays ASC, nom ASC; SELECT * FROM clients LIMIT 10; -- PostgreSQL / MySQL
6. Agrégats et GROUP BY
Fonctions sur un ensemble de lignes :
COUNT(*)— nombre de lignes ;SUM(montant),AVG(montant),MIN,MAX.
-- Total des commandes par client SELECT client_id, SUM(montant) AS total FROM commandes GROUP BY client_id; -- Clients avec plus d'une commande SELECT client_id, COUNT(*) AS nb FROM commandes GROUP BY client_id HAVING COUNT(*) > 1;
WHERE filtre les lignes avant agrégation ; HAVING filtre les groupes après GROUP BY.
7. JOIN — plusieurs tables
Lier deux tables sur une clé commune :
-- INNER JOIN : seulement les lignes qui matchent SELECT c.nom, o.montant FROM clients c INNER JOIN commandes o ON c.id = o.client_id; -- LEFT JOIN : tous les clients, même sans commande SELECT c.nom, COALESCE(SUM(o.montant), 0) AS total FROM clients c LEFT JOIN commandes o ON c.id = o.client_id GROUP BY c.id, c.nom;
Évite le produit cartésien (JOIN sans condition ON) — source classique de bugs et de performances catastrophiques.
8. INSERT, UPDATE, DELETE
INSERT INTO clients (nom, pays) VALUES ('Clara', 'FR');
UPDATE clients SET pays = 'DE' WHERE id = 2;
DELETE FROM commandes WHERE montant = 0;En production : toujours un WHERE explicite sur UPDATE/DELETE, transactions (BEGIN … COMMIT), et jamais de concaténation de strings utilisateur dans la requête (→ injection SQL ; utiliser des requêtes préparées).
9. CREATE TABLE (aperçu)
Le DDL (Data Definition Language) crée la structure :
CREATE TABLE clients ( id SERIAL PRIMARY KEY, nom VARCHAR(100) NOT NULL, pays CHAR(2) NOT NULL DEFAULT 'FR', email VARCHAR(255) UNIQUE, created_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX idx_clients_pays ON clients (pays);
Voir aussi la normalisation (1NF, 2NF, 3NF) sur 1Keydata pour limiter la redondance.
10. Aller plus loin
Ordre recommandé pour pratiquer :
- Refaire les exemples sur SQLite ou PostgreSQL local (DB Browser, psql, Supabase SQL Editor).
- Passer le parcours payant SQL & bases de données (modèle relationnel approfondi, JOIN, intégrité, exercices).
- Réviser en QCM via Révision accélérée — Data ou Full-stack.
Ressources externes : commandes SQL (1Keydata), quiz 25 questions.