Prévoir le résultat exact d'une requête
Exercice d'entraînement · niveau 3 (difficile) · mathématiques appliquées (ECG 2e année), chapitre 13 — Bases de données et travaux pratiques · Interroger une table
Énoncé
La table commande contient les lignes suivantes.
| id | client_id | montant |
|---|---|---|
| 1 | 1 | 40 |
| 2 | 2 | 150 |
| 3 | 1 | 200 |
| 4 | 3 | 90 |
| 5 | 2 | 60 |
Donner les identifiants rendus par la requête SELECT id FROM commande WHERE client_id = 1 OR client_id = 2 AND montant > 100; puis ceux rendus par la même requête où l'on a parenthésé la disjonction.
Corrigé
La règle de priorité. En SQL, AND est prioritaire sur OR, comme la multiplication l'est sur l'addition. La condition écrite se lit donc
Le passage en revue, ligne par ligne.
| id | client_id = 1 | client_id = 2 AND montant > 100 | retenue |
|---|---|---|---|
| 1 | vrai | faux | oui |
| 2 | faux | vrai () | oui |
| 3 | vrai | faux | oui |
| 4 | faux | faux (client ) | non |
| 5 | faux | faux () | non |
La requête rend donc les identifiants , et . On remarque que la commande est retenue bien que son montant ne dépasse pas : la condition de montant ne s'applique qu'au client .
Avec les parenthèses. La requête devient
SELECT id FROM commande
WHERE (client_id = 1 OR client_id = 2) AND montant > 100;
et se lit tout autrement : le client doit être ou , et le montant doit dépasser . On reprend le tableau :
| id | client ou | montant > 100 | retenue |
|---|---|---|---|
| 1 | oui | non () | non |
| 2 | oui | oui | oui |
| 3 | oui | oui () | oui |
| 4 | non | non | non |
| 5 | oui | non () | non |
La requête rend cette fois et .
Le point à retenir. Les deux requêtes ne diffèrent que par deux parenthèses, et rendent des résultats différents — sans qu'aucune erreur ne soit signalée. Dès qu'un AND et un OR cohabitent, on parenthèse, même quand la priorité donne le résultat voulu : c'est ce qui rend la requête relisible.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.