Les clés
| PK | identifie la ligne : unique, non nulle, stable |
| FK | pointe vers la PK d'une autre table |
En pratique : id INT AUTO_INCREMENT PRIMARY KEY.
Recto-verso. À relire la veille. Le cours · Les exercices
| PK | identifie la ligne : unique, non nulle, stable |
| FK | pointe vers la PK d'une autre table |
En pratique : id INT AUTO_INCREMENT PRIMARY KEY.
| 1 — 1 | FK dans l'une des deux |
| 1 — N | FK du côté N |
| N — N | table intermédiaire portant les 2 FK |
Un client → plusieurs commandes : id_client est dans commandes.
presences (id, #id_etudiant,
date_presence, statut)0,1 | au plus une fois |
1,1 | exactement une fois |
0,N | autant qu'on veut, zéro compris |
1,N | au moins une fois, sans maximum |
Se lit dans les deux sens, la cardinalité étant celle du côté opposé : « un USER possède 1 à N PC » · « un PC est possédé par exactement un USER ».
| Maximums | Traduction |
|---|---|
| 1 et N | une FK, du côté 1,1 |
| N et N | une table intermédiaire (deux FK en PK) |
| 1 et 1 | fusion, ou FK UNIQUE |
⚠️ La FK descend du côté qui ne peut en avoir qu'un — une colonne ne contient qu'une valeur.
CREATE TABLE etudiants (
id INT AUTO_INCREMENT
PRIMARY KEY,
nom VARCHAR(50) NOT NULL,
classe VARCHAR(50) NOT NULL
);
FOREIGN KEY (id_etudiant)
REFERENCES etudiants(id)La table référencée se crée en premier.
INT | entier |
VARCHAR(n) | texte court |
TEXT | texte long |
DATE | AAAA-MM-JJ |
DECIMAL(10,2) | argent — pas FLOAT |
Un nombre en VARCHAR = tri et calculs faux.
WHERE oubliéUPDATE etudiants SET classe='X';
DELETE FROM etudiants;Touche toutes les lignes. Aucun avertissement, aucune annulation.
SELECT,DELETESELECT nom, prenom
FROM etudiants
WHERE classe = 'BTS1'
ORDER BY nom ASC
LIMIT 10;LIKE '%dup%' · IN (…) · BETWEEN … AND …
IS NULL, jamais = NULL.
SELECT e.nom, p.statut
FROM presences p
INNER JOIN etudiants e
ON p.id_etudiant = e.id;INNER | l'intersection |
LEFT | tout à gauche, même sans correspondance |
« Veux-je voir aussi ceux qui n'ont rien ? » → LEFT
SELECT classe, COUNT(*) AS nb
FROM etudiants
GROUP BY classe
HAVING COUNT(*) > 16;WHERE filtre les lignes, HAVING les groupes.
$pdo = new PDO(
"mysql:host=localhost;
dbname=base;charset=utf8mb4",
$user, $mdp);
$pdo->setAttribute(
PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);fetch() une ligne · fetchAll() toutes ·
fetchColumn() une valeur
"... WHERE login = '$login'"Saisir ' OR '1'='1 → connecté sans mot de passe.
$r = $pdo->prepare(
"... WHERE login = :login");
$r->execute([':login' => $x]);prepare() + execute()| Fonction | Contre | Quand |
|---|---|---|
prepare() | injection SQL | à l'écriture en base |
htmlspecialchars() | XSS | à l'affichage |
password_hash() | fuite de mots de passe | au stockage |
Échapper avant d'insérer abîme les données : « O'Brien » devient
O'Brien.