Listes et intervalles

WHERE statut = 'livree' OR statut = 'en cours' OR statut = 'annulee' fonctionne, mais s'allonge vite. Et comparer une date à deux bornes dans le même WHERE, même chose. Il existe une syntaxe plus lisible pour chacun de ces cas très fréquents.

Quand OR devient trop long

Tu sais déjà combiner plusieurs conditions avec OR. Pour sélectionner les films de genre SF, Crime ou Comédie, on écrit WHERE genre = 'SF' OR genre = 'Crime' OR genre = 'Comédie'. Ça fonctionne — mais la liste grandit, la requête aussi. Voici à quoi ça ressemble sur notre table :

Table films

titreanneegenre
Inception2010SF
Le Parrain1972Drame
Pulp Fiction1994Crime
Amélie Poulain2001Comédie
SELECT titre, genre FROM films WHERE genre = 'SF' OR genre = 'Crime' OR genre = 'Comédie'

↑ trois lignes ressortent — mais chaque genre supplémentaire impose un OR de plus

SQL propose un raccourci bien plus lisible pour ce cas : IN. Au lieu de répéter la colonne et = pour chaque valeur, on liste toutes les valeurs entre parenthèses, séparées par des virgules, après le mot IN.

IN : appartenir à une liste

IN teste si une valeur appartient à une liste. On place les valeurs entre parenthèses, séparées par des virgules. La colonne n'est mentionnée qu'une seule fois, avant IN. Par exemple, les films dont le genre est SF ou Crime :

La requête
SELECT titre, genre FROM films WHERE genre IN ('SF', 'Crime')
Résultat · 2 lignes
titregenre
InceptionSF
Pulp FictionCrime

Deux films ressortent. On aurait pu écrire exactement la même requête avec WHERE genre = 'SF' OR genre = 'Crime' — le résultat serait identique. IN est juste plus concis : si la liste avait dix valeurs, la version OR ferait dix conditions répétées.

NOT IN : tout sauf la liste

Pour exclure une liste de valeurs, on ajoute NOT devant IN. La condition garde les lignes dont la valeur n'est dans aucune des valeurs de la liste. Par exemple, tous les films sauf ceux de genre Drame ou Comédie :

La requête
SELECT titre, genre FROM films WHERE genre NOT IN ('Drame', 'Comédie')
Résultat · 2 lignes
titregenre
InceptionSF
Pulp FictionCrime

Drame (Le Parrain) et Comédie (Amélie Poulain) sont exclus. Les deux films dont le genre n'est dans aucune des valeurs de la liste ressortent. Attention : si la colonne comparée peut contenir NULL, NOT IN peut donner des résultats surprenants — mais c'est un cas que tu verras plus loin dans le cursus.

BETWEEN : un intervalle continu

Pour filtrer une valeur dans un intervalle continu — toutes les notes entre 8.5 et 9.0, tous les films entre deux années — on utilise BETWEEN. La syntaxe : WHERE colonne BETWEEN borne_basse AND borne_haute. Les deux bornes sont incluses dans le résultat.

Par exemple, les films dont la note est entre 8.5 et 9.0 :

La requête
SELECT titre, note FROM films WHERE note BETWEEN 8.5 AND 9.0
Résultat · 2 lignes
titrenote
Inception8.8
Pulp Fiction8.9

Le Parrain (9.2) est exclu : sa note dépasse la borne haute. Amélie Poulain (8.3) aussi : elle est en dessous de la borne basse. La borne basse doit être écrite en premier : BETWEEN 9.0 AND 8.5 ne renverrait rien — PostgreSQL interprète l'intervalle comme vide dès que la borne gauche est supérieure à la borne droite.

BETWEEN avec des dates

BETWEEN fonctionne aussi avec les dates. On les écrit entre apostrophes, au format AAAA-MM-JJ. La table films a une colonne date_sortie qui enregistre la date de sortie officielle de chaque film :

Table films — date_sortie

titredate_sortie
Inception2010-07-16
Le Parrain1972-03-15
Pulp Fiction1994-10-14
Amélie Poulain2001-04-25
La requête
SELECT titre, date_sortie FROM films WHERE date_sortie BETWEEN '1990-01-01' AND '2005-12-31'
Résultat · 2 lignes
titredate_sortie
Pulp Fiction1994-10-14
Amélie Poulain2001-04-25

Deux films sortis entre 1990 et 2005 ressortent. La logique est identique à BETWEEN numérique : bornes incluses, borne basse en premier. Le format 'AAAA-MM-JJ' est le standard SQL pour les dates.

Récapitulatif

En résumé, pour filtrer par liste ou par intervalle :

📌 Listes et intervalles — l'essentiel
IN (a, b, c)→ appartient à la liste
NOT IN (a, b)→ n'est dans aucune des valeurs de la liste
BETWEEN x AND y→ entre x et y, bornes incluses (x ≤ y)
BETWEEN 'd1' AND 'd2'→ intervalle de dates (format 'AAAA-MM-JJ')
Exemple complet
SELECT titre, genre FROM films WHERE genre IN ('SF', 'Crime')

💡 Bon à savoir : IN fonctionne avec du texte, des entiers et des dates — partout où on a une liste de valeurs précises à tester.

Passe à la pratique

Cette leçon t'a montré la théorie. Pour maîtriser SQL, rien ne vaut la pratique : accède aux exercices et au bac à sable PostgreSQL réel.

← Tous les cours SQL