10 questions. Une seule bonne réponse par question, et
l'explication s'affiche dès que vous avez répondu.
Le cours · La fiche
0 / 10
1Un client passe plusieurs commandes. Où se place la clé étrangère ?
La clé étrangère descend du côté qui ne peut en avoir qu'un — parce qu'une colonne ne contient qu'une valeur. Une commande appartient à un seul client : id_client tient dans commandes. L'inverse obligerait à entasser plusieurs numéros dans une case.
2« Un USER possède 1 à N PC. » Comment se lit cette cardinalité ?
1,N se lit « au moins une fois, sans maximum » — c'est 0,N qui autorise le zéro. Et la cardinalité s'écrit toujours du côté opposé à ce qu'elle décrit, d'où l'intérêt de relire la relation dans les deux sens avant de conclure.
3Quel type choisir pour un prix ?
FLOAT est approché : en base 2, 0,10 n'a pas d'écriture exacte, et les centimes finissent par se perdre sur une somme. DECIMAL compte en décimal, donc juste. Quant à mettre un nombre en VARCHAR, cela fausse aussi bien les tris que les calculs — « 10 » y passe avant « 9 ».
4Comment retrouver les lignes dont la date est vide ?
NULL n'est pas une valeur, c'est une absence : aucune comparaison ne peut être vraie avec lui, pas même NULL = NULL. = NULL ne renvoie donc jamais rien, sans message d'erreur. Seuls IS NULL et IS NOT NULL le testent.
5UPDATE etudiants SET classe='X'; — sans WHERE. Que se passe-t-il ?
Sans WHERE, la portée est la table entière. Aucun avertissement, et rien à annuler hors d'une transaction. D'où le réflexe : écrire d'abord le SELECT avec le même WHERE, vérifier les lignes visées, puis transformer en UPDATE ou DELETE.
6Vous voulez lister tous les étudiants, y compris ceux sans aucune présence enregistrée :
INNER JOIN ne rend que l'intersection : un étudiant sans ligne en face disparaît du résultat — et c'est précisément lui qu'on cherchait. La question à se poser avant de choisir : « veux-je voir aussi ceux qui n'ont rien ? » Si oui, LEFT JOIN.
7Quelle est la différence entre WHERE et HAVING ?
WHERE agit avant le regroupement, sur chaque ligne ; HAVING agit après, sur le résultat des agrégats. C'est pourquoi WHERE COUNT(*) > 16 ne peut pas marcher : au moment où WHERE s'exécute, aucun groupe n'existe encore, donc aucun compte.
8Dans quel ordre le serveur exécute-t-il une requête ?
L'ordre d'écriture n'est pas l'ordre d'exécution : SELECT passe presque en dernier. Cela explique deux choses d'un coup — pourquoi un alias défini dans le SELECT n'est pas utilisable dans le WHERE, et pourquoi il l'est dans l'ORDER BY.
9Saisir ' OR '1'='1 dans un champ login connecte sans mot de passe. La parade :
Coller une variable dans une requête laisse le visiteur écrire du SQL. Une requête préparée envoie d'abord le squelette, puis les valeurs à part : elles ne peuvent plus être lues comme des instructions. Une variable dans une requête ?prepare() + execute(), sans exception.
10prepare(), htmlspecialchars(), password_hash() : quand intervient chacun ?
Chacun protège d'une chose précise, à un moment précis : injection SQL, XSS, fuite de mots de passe. Échapper trop tôt abîme la donnée — « O'Brien » finit stocké avec une entité HTML au milieu du nom, et il est alors trop tard pour le savoir.