Accueil/Informatique & Développement /Chapitre 09 /Fiche de révision

Bases de données & SQL

Recto-verso. À relire la veille. Le cours · Les exercices

Les clés

PKidentifie la ligne :
unique, non nulle, stable
FKpointe vers la PK
d'une autre table

En pratique : id INT AUTO_INCREMENT PRIMARY KEY.

⚡ Où va la clé étrangère

Toujours du côté N
1 — 1FK dans l'une des deux
1 — NFK du côté N
N — Ntable intermédiaire
portant les 2 FK

Un client → plusieurs commandes : id_client est dans commandes.

MCD → MLD

  1. entité → table
  2. attribut → colonne
  3. définir la PK
  4. relations → FK (ou table intermédiaire)
  5. choisir les types
MLD
presences (id, #id_etudiant,
           date_presence, statut)

⚡ Les cardinalités

0,1au plus une fois
1,1exactement une fois
0,Nautant qu'on veut, zéro compris
1,Nau 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 ».

MaximumsTraduction
1 et Nune FK, du côté 1,1
N et Nune table intermédiaire (deux FK en PK)
1 et 1fusion, ou FK UNIQUE

⚠️ La FK descend du côté qui ne peut en avoir qu'un — une colonne ne contient qu'une valeur.

Créer

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

Les types

INTentier
VARCHAR(n)texte court
TEXTtexte long
DATEAAAA-MM-JJ
DECIMAL(10,2)argent — pas FLOAT

Un nombre en VARCHAR = tri et calculs faux.

⚡ Le WHERE oublié

sql
UPDATE etudiants SET classe='X';
DELETE FROM etudiants;

Touche toutes les lignes. Aucun avertissement, aucune annulation.

D'abord SELECT,
ensuite DELETE

Interroger

sql
SELECT nom, prenom
FROM etudiants
WHERE classe = 'BTS1'
ORDER BY nom ASC
LIMIT 10;

LIKE '%dup%' · IN (…) · BETWEEN … AND …

IS NULL, jamais = NULL.

Jointures

sql
SELECT e.nom, p.statut
FROM presences p
INNER JOIN etudiants e
        ON p.id_etudiant = e.id;
INNERl'intersection
LEFTtout à gauche,
même sans correspondance

« Veux-je voir aussi ceux qui n'ont rien ? » → LEFT

Agrégats

sql
SELECT classe, COUNT(*) AS nb
FROM etudiants
GROUP BY classe
HAVING COUNT(*) > 16;
FROM → WHERE → GROUP BY →
HAVING → SELECT → ORDER BY

WHERE filtre les lignes, HAVING les groupes.

PDO

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

⚡ Injection SQL

php — vulnérable
"... WHERE login = '$login'"

Saisir ' OR '1'='1 → connecté sans mot de passe.

php — sûr
$r = $pdo->prepare(
  "... WHERE login = :login");
$r->execute([':login' => $x]);
Une variable dans une requête ?
prepare() + execute()

⚡ Ne pas confondre

FonctionContreQuand
prepare()injection SQLà l'écriture en base
htmlspecialchars()XSSà l'affichage
password_hash()fuite de mots de passeau stockage

Échapper avant d'insérer abîme les données : « O'Brien » devient O'Brien.