Apprenez en lisant dans l'ordre

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éesAND (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.

Avant les exercices, confirme les définitions de colonnes et un échantillon des données de la table staff.

① Lance PRAGMA table_info(staff); pour vérifier les noms de colonnes, types et clés primaires.

② Lance SELECT * FROM staff LIMIT 5; pour prévisualiser les 5 premières lignes.

Éditeur SQL

Exécutez une requête pour voir les résultats

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 ACondition BA AND BA OR B
TrueTrueTrueTrue
TrueFalseFalseTrue
FalseTrueFalseTrue
FalseFalseFalseFalse

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.

Précédence des opérateurs logiques
NOT(le plus haut)AND(milieu)OR(le plus bas)ensuiteensuite
NOT lie le plus fort, puis AND, puis OR — c'est l'ordre d'évaluation. Quand tu les mélanges, les parenthèses te permettent de rendre l'ordre voulu explicite pour ne pas avoir à suivre la précédence dans ta tête.
-- 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';

Imagine qu'une revue de bonus a besoin de « staff basé à Tokyo avec salary d'au moins 5 000 000 ». (Une fois exécuté correctement, l'explication apparaîtra.)

① Depuis staff, extrais les colonnes name, city et salary.

② Filtre les lignes où `city` est `'Tokyo'` AND `salary` est au moins 5 000 000.

③ Confirme que le résultat fait 3 lignes (David Sato 6 800 000 / Grace Suzuki 5 500 000 / Jack Tanaka 5 900 000).

Éditeur SQL

Exécutez une requête pour voir les résultats

Imagine qu'un avis doit être envoyé à « du staff basé soit dans la région du Kanto (Tokyo) soit dans la région du Kansai (Osaka) ».

① Depuis staff, extrais les colonnes name et city.

② Filtre les lignes où `city` est `'Tokyo'` OR `'Osaka'` (utilise OR).

③ Confirme que le résultat fait 6 lignes (Alice Tokyo / Bob Osaka / David Tokyo / Frank Osaka / Grace Tokyo / Jack Tokyo).

Éditeur SQL

Exécutez une requête pour voir les résultats

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.

Comment les parenthèses changent le résultat
Sans parenthèses(s'écarte de l'intention)Avec parenthèses(correspond à l'intention)city = 'Tokyo'OR city = 'Osaka'AND salary >= 5000000(city = 'Tokyo' OR city = 'Osaka')AND salary >= 5000000Lu commeTokyo OR(Osaka AND bien payé)Évalué comme(Tokyo OR Osaka)AND bien payéRésultat : 6 lignes(inclut Alice Tokyo 4500k)Résultat : 5 lignes(exclut Alice Tokyo 4500k)
Une requête voulue comme « bien payés à Tokyo ou Osaka ». La position des parenthèses change le sens — et le résultat.

`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.

Imagine un besoin de « staff à Tokyo ou Osaka avec salary d'au moins 5 000 000 ». Dans une seule console, compare le résultat avec parenthèses versus sans pour voir comment ça change.

① Depuis staff, extrais les colonnes name, city et salary.

② D'abord, écris la forme avec parenthèses, voulue ((city = 'Tokyo' OR city = 'Osaka') AND salary >= 5000000).

③ Puis enlève délibérément les parenthèses (city = 'Tokyo' OR city = 'Osaka' AND salary >= 5000000).

④ Confirme que la première renvoie 5 lignes et la seconde 6 lignes (Alice Tokyo 4 500 000 est ajoutée) — le résultat change.

Éditeur SQL

Exécutez une requête pour voir les résultats

Imagine un besoin de « construire une liste de tout le staff sauf ceux basés à Kyoto ».

① Depuis staff, extrais les colonnes name et city.

② Filtre les lignes où `city` n'est pas `'Kyoto'` (utilise NOT (condition)).

③ Confirme que le résultat fait 8 lignes (Carol et Iris sont exclues).

Éditeur SQL

Exécutez une requête pour voir les résultats
QUIZ

Vérification des connaissances

Répondez à chaque question une par une.

Question 1Comment la condition WHERE WHERE city = 'Tokyo' OR city = 'Osaka' AND salary >= 5000000 est-elle interprétée ?

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 ?