WHERE condition garde seulement les lignes où la condition est vraie. Textes entre apostrophes : 'Chartres'.
Comparaisons : = <> < > <= >= ; combinaisons : AND, OR, BETWEEN … AND …, IN (…).
AND passe avant OR : mets des parenthèses.
LIKE 'D%' : commence par D ; % = n'importe quels caractères. IS NULL pour une case vide.
ORDER BY colonne ASC/DESC trie, LIMIT n garde n lignes. Ordre : SELECT … FROM … WHERE … ORDER BY … LIMIT.
Mémo
SELECT prenom, age FROM eleves
WHERE (ville = 'Dreux' OR ville = 'Paris') AND age >= 19
ORDER BY age DESC
LIMIT 3;
SELECT prenom FROM eleves WHERE nom LIKE '%in';
SELECT prenom FROM eleves WHERE classe_id IS NULL;
Pièges à éviter
Écrire = NULL au lieu de IS NULL.
Oublier les parenthèses autour d'un OR combiné avec un AND.
INSERT INTO table (col1, col2) VALUES (v1, v2); ajoute une ligne (valeurs dans le même ordre que les colonnes).
UPDATE table SET col = valeur WHERE …; modifie ; on peut calculer à partir de l'ancienne valeur (age = age + 1).
DELETE FROM table WHERE …; supprime.
Sans WHERE, UPDATE et DELETE touchent toutes les lignes : on teste d'abord avec un SELECT.
On filtre de préférence sur l'id, qui est unique.
Mémo
INSERT INTO eleves (prenom, nom, age, ville)
VALUES ('Nina', 'Robert', 18, 'Chartres');
UPDATE eleves SET ville = 'Lucé' WHERE id = 2;
UPDATE eleves SET age = age + 1 WHERE ville = 'Chartres';
DELETE FROM notes WHERE note < 10;
Pièges à éviter
Oublier le WHERE d'un UPDATE ou d'un DELETE.
Donner les valeurs dans un autre ordre que les colonnes.
Filtrer sur un prénom alors que plusieurs élèves peuvent l'avoir.
PRIMARY KEY identifie chaque ligne ; AUTO_INCREMENT la numérote tout seul.
NOT NULL (obligatoire), UNIQUE (pas de doublon), DEFAULT (valeur par défaut).
Mémo
CREATE TABLE inscrits (
id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(120) NOT NULL UNIQUE,
ville VARCHAR(80) DEFAULT 'Chartres',
inscrit_le DATE
);
Pièges à éviter
Une virgule après la dernière colonne.
Oublier une virgule entre deux colonnes.
Stocker un prix en FLOAT : des arrondis bizarres apparaissent ; DECIMAL est exact.
On range chaque chose une seule fois dans sa table, et on relie les tables avec une clé étrangère (classe_id contient l'id d'une classe).
JOIN table ON a.colonne = b.colonne met côte à côte les lignes qui correspondent.
JOIN (= INNER JOIN) ne garde que les lignes qui ont une correspondance ; LEFT JOIN garde toutes celles de la table de gauche (avec NULL sinon).
Quand deux tables ont une colonne du même nom, on précise table.colonne, ou un surnom : FROM eleves e.
Mémo
SELECT e.prenom, c.nom
FROM eleves e
JOIN classes c ON e.classe_id = c.id;
SELECT e.prenom
FROM eleves e
LEFT JOIN classes c ON e.classe_id = c.id
WHERE c.id IS NULL;
Pièges à éviter
Oublier le ON : chaque élève serait associé à chaque classe.
Écrire id tout seul quand les deux tables en ont un.
Utiliser JOIN quand on veut aussi les lignes sans correspondance (il faut LEFT JOIN).