Fiche à trous · Terminale · NSI
Bases de données relationnelles — SQL
Complétez de mémoire, puis vérifiez avec la page de corrigé.
Interroger deux tables de mille lignes chacune en oubliant la condition qui les relie ne produit pas une erreur : cela produit un million de lignes. La requête est valide, elle s'exécute, et son résultat n'a aucun sens. C'est la faute la plus fréquente du chapitre, et la plus silencieuse.
Le modèle relationnel
Définition — Clé primaire et clé étrangère :
L'intérêt de cette organisation est d'éviter la redondance : une information n'est stockée qu'à un seul endroit, et les autres tables y renvoient. Sans cela, modifier une donnée obligerait à la corriger partout où elle figure, et la moindre omission produirait deux versions contradictoires dans la même base.
Interroger une table
Propriété
3La distinction entre WHERE et HAVING découle de l'ordre d'exécution : les lignes sont d'abord filtrées, puis regroupées, puis les groupes filtrés. Une condition portant sur un agrégat — « les clients ayant passé plus de trois commandes » — ne peut donc pas figurer dans un WHERE : au moment où il s'applique, les groupes n'existent pas encore.
Joindre deux tables
Règle
5Piège
Interroger deux tables ensemble en oubliant la condition qui relie la clé étrangère de l'une à la clé primaire de l'autre.
Compter les tables jointes : il faut une condition de moins que de tables.
L'injection SQL
Propriété
La parade est structurelle, non cosmétique : les requêtes préparées déclarent d'abord la structure de la requête, puis y passent les valeurs séparément. Le moteur sait alors que ces valeurs sont des données et ne les interprète jamais comme du code, quel que soit leur contenu. Filtrer les caractères « dangereux » est une parade partielle — elle suppose qu'on a pensé à tous les cas, ce qui n'est jamais démontrable.
Construire une requête sur plusieurs tables
- 7.
- 8.
- 9.
- 10.
- 11.
- Chaque JOIN a-t-elle sa condition de rapprochement ?
- Ai-je une condition de moins que de tables jointes ?
- Mon filtre porte-t-il sur des lignes (WHERE) ou des groupes (HAVING) ?
- Ai-je vérifié le nombre de lignes du résultat ?
- Mes requêtes construites avec une saisie utilisateur sont-elles préparées ?
- Ai-je évité de concaténer une saisie dans une requête ?