Filtrer les lignes : WHERE en entier

WHERE ne conserve que les lignes qui correspondent à une condition. Vous verrez comment combiner les conditions, définir des plages et des motifs, et traiter NULL.

Combiner des conditions

AND garde les lignes où les deux côtés sont vrais, OR celles où l’un des deux l’est. Écrit ainsi, cela demande les commandes payées ou expédiées, et de plus de 500.

1

SELECT order_number, status, total
FROM orders
WHERE (status = 'paid' OR status = 'shipped')
  AND total > 500
ORDER BY total DESC
LIMIT 20;
Ouvrir dans Planche

Résultat — 5 premières lignes sur 20

order_numberstatustotal
ORD-2025-002767shipped30906.66
ORD-2022-001901shipped28151.01
ORD-2023-001772paid26797.87
ORD-2024-001907shipped26648.91
ORD-2025-002847paid25837.57

Planche s’ouvre dans un onglet séparé, la base d’exemple déjà chargée et cette requête prête dans l’éditeur. Tous les exemples de la page réutilisent cet onglet, et rien ne s’exécute tant que vous n’appuyez pas sur F9.

Les parenthèses font un vrai travail. Exécutez les mêmes mots sans elles :

2

-- The same words without the brackets. AND binds tighter than OR,
-- so this reads as: paid (any total) OR shipped-and-over-500.
SELECT order_number, status, total
FROM orders
WHERE status = 'paid' OR status = 'shipped' AND total > 500
ORDER BY total DESC
LIMIT 20;
Ouvrir dans Planche

Résultat — 5 premières lignes sur 20

order_numberstatustotal
ORD-2025-002767shipped30906.66
ORD-2022-001901shipped28151.01
ORD-2023-001772paid26797.87
ORD-2024-001907shipped26648.91
ORD-2025-002847paid25837.57

Vous obtenez une autre réponse, parce que AND lie plus fort que OR — exactement comme × lie plus fort que +. Sans parenthèses, la base lit « payée, quel que soit le montant, ou expédiée et au-dessus de 500 » : toutes les petites commandes payées reviennent donc aussi.

Correspondre à l’une de plusieurs valeurs

Une chaîne de OR comparant la même colonne, c’est exactement ce à quoi sert IN.

3

SELECT order_number, status, total, ordered_at
FROM orders
WHERE status IN ('paid', 'shipped', 'delivered')
ORDER BY ordered_at DESC
LIMIT 20;
Ouvrir dans Planche

Résultat — 5 premières lignes sur 20

order_numberstatustotalordered_at
ORD-2025-002480shipped6333.772025-12-28 23:52:14
ORD-2025-000505delivered2276.512025-12-28 11:16:39
ORD-2025-001581delivered2645.062025-12-28 06:12:38
ORD-2025-000995delivered2584.022025-12-28 05:47:53
ORD-2025-003219delivered561.482025-12-28 03:20:37

status IN ('paid', 'shipped', 'delivered') dit ce que diraient trois OR, et le dit une seule fois. NOT IN est la négation — avec une arête coupante liée à NULL, à laquelle la leçon sur les sous-requêtes consacre une section.

Intervalles

BETWEEN a AND b est un raccourci pour >= a AND <= b. Les deux bornes sont incluses.

4

SELECT order_number, ordered_at, total
FROM orders
WHERE ordered_at BETWEEN '2025-01-01' AND '2025-01-31 23:59:59'
ORDER BY ordered_at
LIMIT 20;
Ouvrir dans Planche

Résultat — 5 premières lignes sur 20

order_numberordered_attotal
ORD-2025-0034122025-01-01 00:18:522806.57
ORD-2025-0036162025-01-01 11:18:146955.62
ORD-2025-0015032025-01-01 23:43:345837.23
ORD-2025-0003172025-01-02 05:08:3215130.7
ORD-2025-0012982025-01-02 18:36:325045.04

Motifs

LIKE compare à un motif où % représente une suite quelconque de caractères et _ exactement un.

5

SELECT first_name, last_name, email
FROM customers
WHERE email LIKE '%@inbox.example'
ORDER BY last_name
LIMIT 20;
Ouvrir dans Planche

Résultat — 5 premières lignes sur 20

first_namelast_nameemail
FreyaAhmedfreya.ahmed@inbox.example
HugoAhmedhugo.ahmed@inbox.example
JonasAhmedjonas.ahmed@inbox.example
KenjiAhmedkenji.ahmed@inbox.example
LiamAhmedliam.ahmed@inbox.example

Valeurs manquantes

279 de ces clients n’ont pas de numéro de téléphone enregistré. Les voici :

6

SELECT id, first_name, last_name, phone
FROM customers
WHERE phone IS NULL
LIMIT 20;
Ouvrir dans Planche

Résultat — 5 premières lignes sur 20

idfirst_namelast_namephone
2MateoCostaNULL
9SvenSmithNULL
21LaylaFischerNULL
25FreyaNguyenNULL
28PriyaJangNULL

Et voici la requête que la plupart écrivent d’abord :

7

-- 279 customers have no phone number, and this finds none of them.
SELECT id, first_name, last_name, phone
FROM customers
WHERE phone = NULL;
Ouvrir dans Planche

Aucune ligne

Zéro ligne. Pas d’erreur, pas d’avertissement — une grille vide.

NULL n’est pas une valeur, c’est l’absence de valeur : aucune comparaison avec lui ne peut être vraie. phone = NULL demande « cette chose inconnue est-elle égale à cette autre chose inconnue », et la réponse honnête est « inconnu », ce qui n’est pas vrai : la ligne est écartée. NULL = NULL n’est pas vrai non plus. Les seuls tests qui marchent sont IS NULL et IS NOT NULL.

Ce que vous savez faire maintenant

Vous savez exprimer presque n’importe quelle condition sur une table. La limite qui reste, c’est que tout tient dans une seule table — et les questions qui valent la peine d’être posées, en général, non.

À vous d’essayer

  1. Les clients en Corée ou au Japon qui ont accepté les e-mails marketing (marketing_opt_in vaut 1), triés par pays puis par nom de famille.

    Voir la réponse

    Voir la réponse

    SELECT first_name, last_name, country
    FROM customers
    WHERE country IN ('KR', 'JP')
      AND marketing_opt_in = 1
    ORDER BY country, last_name
    LIMIT 20;
    Ouvrir dans Planche

    Résultat — 5 premières lignes sur 20

    first_namelast_namecountry
    AishaAhmedJP
    IsabellaAhmedJP
    IsabellaBrownJP
    TheoBrownJP
    NoraChoiJP

    IN évite un OR, et aucune parenthèse n’est nécessaire ici puisqu’un seul AND relie deux conditions. Deux clés de tri donnent le pays d’abord, le nom à l’intérieur.

  2. Les commandes passées en 2024 qui ont fini annulées ou remboursées, les plus anciennes d’abord.

    Voir la réponse

    Voir la réponse

    SELECT order_number, status, ordered_at
    FROM orders
    WHERE ordered_at >= '2024-01-01'
      AND ordered_at <  '2025-01-01'
      AND status IN ('cancelled', 'refunded')
    ORDER BY ordered_at
    LIMIT 20;
    Ouvrir dans Planche

    Résultat — 5 premières lignes sur 20

    order_numberstatusordered_at
    ORD-2024-002563cancelled2024-01-02 11:41:56
    ORD-2024-002814cancelled2024-01-08 06:10:29
    ORD-2024-003123refunded2024-01-10 15:59:33
    ORD-2024-003024refunded2024-01-11 19:36:33
    ORD-2024-002258refunded2024-01-12 15:43:55

    Tout l’intérêt est dans l’intervalle semi-ouvert : >= '2024-01-01' AND < '2025-01-01' couvre l’année entière, dernier instant du 31 décembre compris, que BETWEEN '2024-01-01' AND '2024-12-31' couperait à minuit.