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
| titre | annee | genre |
|---|---|---|
| Inception | 2010 | SF |
| Le Parrain | 1972 | Drame |
| Pulp Fiction | 1994 | Crime |
| Amélie Poulain | 2001 | Comé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 :
SELECT titre, genre FROM films WHERE genre IN ('SF', 'Crime')| titre | genre |
|---|---|
| Inception | SF |
| Pulp Fiction | Crime |
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 :
SELECT titre, genre FROM films WHERE genre NOT IN ('Drame', 'Comédie')| titre | genre |
|---|---|
| Inception | SF |
| Pulp Fiction | Crime |
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 :
SELECT titre, note FROM films WHERE note BETWEEN 8.5 AND 9.0| titre | note |
|---|---|
| Inception | 8.8 |
| Pulp Fiction | 8.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
| titre | date_sortie |
|---|---|
| Inception | 2010-07-16 |
| Le Parrain | 1972-03-15 |
| Pulp Fiction | 1994-10-14 |
| Amélie Poulain | 2001-04-25 |
SELECT titre, date_sortie FROM films WHERE date_sortie BETWEEN '1990-01-01' AND '2005-12-31'| titre | date_sortie |
|---|---|
| Pulp Fiction | 1994-10-14 |
| Amélie Poulain | 2001-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 :
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.