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;
Résultat — 5 premières lignes sur 20
| order_number | status | total |
|---|---|---|
| ORD-2025-002767 | shipped | 30906.66 |
| ORD-2022-001901 | shipped | 28151.01 |
| ORD-2023-001772 | paid | 26797.87 |
| ORD-2024-001907 | shipped | 26648.91 |
| ORD-2025-002847 | paid | 25837.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;
Résultat — 5 premières lignes sur 20
| order_number | status | total |
|---|---|---|
| ORD-2025-002767 | shipped | 30906.66 |
| ORD-2022-001901 | shipped | 28151.01 |
| ORD-2023-001772 | paid | 26797.87 |
| ORD-2024-001907 | shipped | 26648.91 |
| ORD-2025-002847 | paid | 25837.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;
Résultat — 5 premières lignes sur 20
| order_number | status | total | ordered_at |
|---|---|---|---|
| ORD-2025-002480 | shipped | 6333.77 | 2025-12-28 23:52:14 |
| ORD-2025-000505 | delivered | 2276.51 | 2025-12-28 11:16:39 |
| ORD-2025-001581 | delivered | 2645.06 | 2025-12-28 06:12:38 |
| ORD-2025-000995 | delivered | 2584.02 | 2025-12-28 05:47:53 |
| ORD-2025-003219 | delivered | 561.48 | 2025-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;
Résultat — 5 premières lignes sur 20
| order_number | ordered_at | total |
|---|---|---|
| ORD-2025-003412 | 2025-01-01 00:18:52 | 2806.57 |
| ORD-2025-003616 | 2025-01-01 11:18:14 | 6955.62 |
| ORD-2025-001503 | 2025-01-01 23:43:34 | 5837.23 |
| ORD-2025-000317 | 2025-01-02 05:08:32 | 15130.7 |
| ORD-2025-001298 | 2025-01-02 18:36:32 | 5045.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;
Résultat — 5 premières lignes sur 20
| first_name | last_name | |
|---|---|---|
| Freya | Ahmed | freya.ahmed@inbox.example |
| Hugo | Ahmed | hugo.ahmed@inbox.example |
| Jonas | Ahmed | jonas.ahmed@inbox.example |
| Kenji | Ahmed | kenji.ahmed@inbox.example |
| Liam | Ahmed | liam.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;
Résultat — 5 premières lignes sur 20
| id | first_name | last_name | phone |
|---|---|---|---|
| 2 | Mateo | Costa | NULL |
| 9 | Sven | Smith | NULL |
| 21 | Layla | Fischer | NULL |
| 25 | Freya | Nguyen | NULL |
| 28 | Priya | Jang | NULL |
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;
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.