Adloun

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.

idclient_idmontant
1140
22150
31200
4390
5260

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.

idclient_id = 1client_id = 2 AND montant > 100retenue
1vraifauxoui
2fauxvrai ()oui
3vraifauxoui
4fauxfaux (client )non
5fauxfaux ()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 :

idclient ou montant > 100retenue
1ouinon ()non
2ouiouioui
3ouioui ()oui
4nonnonnon
5ouinon ()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.