Question 1Comment la condition WHERE WHERE city = 'Tokyo' OR city = 'Osaka' AND salary >= 5000000 est-elle interprétée ?
WHERE en profondeur ① — AND, OR, NOT pour construire des conditions composées
Le premier article approfondi sur WHERE. Couvre la table de vérité de AND / OR / NOT, la précédence des opérateurs et l'usage des parenthèses pour rendre l'ordre d'évaluation explicite — le tout sur un jeu de données staff chargé depuis CSV.
Les données qu'on va utiliser — la table staff
À partir de cet article, on va passer trois articles à approfondir les patterns de filtrage WHERE. Le premier porte sur les opérateurs logiques pour construire des conditions composées — AND (et) / OR (ou) / NOT (non) — plus la précédence des opérateurs et les parenthèses qui entrent en jeu quand tu les mélanges.
Le jeu de données est la table staff (10 lignes) chargée depuis CSV, avec les colonnes name / city / salary / birthday. On va construire des conditions courantes du monde réel comme « Tokyo et bien payé », « Tokyo ou Osaka » et « pas à Kyoto » en utilisant chaque opérateur.
AND, OR, NOT — construire des conditions avec les opérateurs logiques
Les opérateurs logiques combinent plusieurs conditions dans un seul WHERE. Il y en a trois.
- `AND` : TRUE seulement quand les deux conditions sont TRUE
- `OR` : TRUE quand au moins une des conditions est TRUE
- `NOT` : nie la condition qui le suit (TRUE → FALSE / FALSE → TRUE)
La syntaxe consiste juste à insérer le mot-clé : WHERE cond1 AND cond2, WHERE cond1 OR cond2, WHERE NOT (cond). Tu peux chaîner AND / OR autant de fois que nécessaire, et NOT se place devant une condition unique.
| Condition A | Condition B | A AND B | A OR B |
|---|---|---|---|
| True | True | True | True |
| True | False | False | True |
| False | True | False | True |
| False | False | False | False |
La règle de base est : AND est TRUE seulement quand les deux sont TRUE ; OR est TRUE quand l'un ou l'autre est TRUE. Le comportement quand NULL se mêle à une comparaison sera couvert dans deux articles sous la logique à trois valeurs, mais pour cet article on reste dans le monde à 2 valeurs (TRUE / FALSE) et on apprend juste à composer des conditions.
-- 1) AND : satisfait les deux (Tokyo et bien payé)
SELECT name, city, salary FROM staff
WHERE city = 'Tokyo' AND salary >= 5000000;
-- 2) OR : satisfait l'un ou l'autre (Tokyo ou Osaka)
SELECT name, city FROM staff
WHERE city = 'Tokyo' OR city = 'Osaka';
-- 3) NOT : nie la condition (partout sauf Kyoto)
SELECT name, city FROM staff
WHERE NOT (city = 'Kyoto');
-- NOT peut aussi s'écrire avec != ou <>
SELECT name, city FROM staff
WHERE city != 'Kyoto';
Précédence des opérateurs — AND lie plus fort que OR
La seule règle que tu dois absolument connaître quand tu mélanges AND et OR, c'est que `AND` a une précédence plus haute que `OR`. Écrire A OR B AND C est interprété comme `A OR (B AND C)` — pas de gauche à droite dans l'ordre d'écriture.
Ça produit souvent des résultats qui ne correspondent pas à ton intention, donc quand tu mélanges AND et OR, rends toujours l'ordre d'évaluation explicite avec des parenthèses. Les parenthèses ne changent pas seulement la sémantique SQL — elles signalent aussi ton intention au lecteur — donc même quand le sens est le même avec ou sans, c'est une bonne habitude de les mettre.
`AND` est évalué avant `OR`
A OR B AND C est interprété comme `A OR (B AND C)`. AND lie plus fort que OR, donc ça ne se lit pas de gauche à droite dans l'ordre d'écriture.
Exemple : WHERE city = 'Tokyo' OR city = 'Osaka' AND salary >= 5000000 veut dire `city = 'Tokyo' OR (city = 'Osaka' AND salary >= 5000000)`, donc tout le staff de Tokyo reste indépendamment du salary (Alice Tokyo 4 500 000 est inclus). Si tu veux dire « bien payés parmi Tokyo ou Osaka », écris toujours (city = 'Tokyo' OR city = 'Osaka') AND salary >= 5000000 et rends l'ordre d'évaluation explicite avec des parenthèses.
Vérification des connaissances
Répondez à chaque question une par une.
Question 2Quelle forme renvoie le même résultat que WHERE NOT (city = 'Tokyo') ?
Question 3Quel parenthésage est équivalent à WHERE A AND B OR C ?