Filtrer avec WHERE
SELECT * renvoie toute la table. La plupart du temps, on cherche moins que ça — les films d'un genre précis, les employés d'un département, les commandes au-dessus d'un montant. WHERE est la clause qui restreint le résultat à ce qui t'intéresse.
Filtrer, c'est choisir ses lignes
Dans la leçon précédente, tu as appris à afficher le contenu d'une table avec SELECT. Mais jusqu'ici, on récupérait toutes les lignes. Or, la plupart du temps, on ne veut pas tout : on cherche quelque chose de précis.
Par exemple, dans notre table de films, on pourrait vouloir uniquement les films sortis après 2000, ou seulement ceux notés au-dessus de 9. Bref, on veut filtrer les lignes selon une condition. C'est exactement le rôle du mot-clé WHERE.
Table films
| titre | annee | note | genre | oscar |
|---|---|---|---|---|
| Inception | 2010 | 8.8 | SF | true |
| Le Parrain | 1972 | 9.2 | Drame | true |
| Pulp Fiction | 1994 | 8.9 | Crime | false |
| Amélie Poulain | 2001 | 8.3 | Comédie | false |
WHERE : ne garder que certaines lignes
WHERE s'ajoute après le FROM, et introduit une condition. SQL parcourt alors chaque ligne de la table et ne garde que celles pour lesquelles la condition est vraie.
La structure devient donc : SELECT … FROM … WHERE condition. On continue de choisir les colonnes avec SELECT et la table avec FROM, et on ajoute simplement un filtre à la fin.
Voyons les différentes façons d'écrire une condition.
L'égalité = sur du texte
La condition la plus simple : garder les lignes où une colonne vaut une valeur précise. On utilise le signe égal =. En SQL, l'égalité s'écrit avec un seul signe égal = (et non == comme dans certains langages de programmation).
Pour le texte, la valeur se met entre apostrophes (des guillemets simples). Par exemple, pour ne garder que les films de genre Drame :
SELECT * FROM films WHERE genre = 'Drame'| titre | annee | note | genre | oscar |
|---|---|---|---|---|
| Le Parrain | 1972 | 9.2 | Drame | true |
SQL a examiné chaque film et n'a gardé que celui dont le genre est exactement « Drame ». Attention aux apostrophes autour du texte : sans elles, SQL croirait que Drame est un nom de colonne, et renverrait une erreur.
L'inverse : différent de (<>)
À l'inverse de l'égalité, pour garder tout sauf une valeur, on utilise l'opérateur différent de, qui s'écrit <>. Par exemple, tous les films qui ne sont pas des drames :
SELECT titre, genre FROM films WHERE genre <> 'Drame'| titre | genre |
|---|---|
| Inception | SF |
| Pulp Fiction | Crime |
| Amélie Poulain | Comédie |
Tous les films sont là, sauf Le Parrain (le seul drame). Note : tu rencontreras parfois != à la place de <> — les deux font la même chose en PostgreSQL, mais <> est la forme standard, celle qu'on privilégie.
Comparer des nombres
Sur une colonne numérique, on ne se limite pas à l'égalité : on peut comparer. Les opérateurs sont ceux des mathématiques : > (supérieur), < (inférieur), >= (supérieur ou égal), <= (inférieur ou égal), et = (égal).
Et pour les nombres, pas d'apostrophes — on écrit la valeur directement. Par exemple, les films sortis après 2000 :
SELECT titre, annee FROM films WHERE annee > 2000| titre | annee |
|---|---|
| Inception | 2010 |
| Amélie Poulain | 2001 |
Seuls les deux films postérieurs à 2000 sont conservés. La condition annee > 2000 a été évaluée pour chaque ligne ; les autres ont été écartées.
Filtrer une colonne vrai/faux (booléen)
Jusqu'ici, nos conditions comparaient des valeurs (un genre, une note). Mais certaines colonnes ne contiennent que deux valeurs possibles : vrai ou faux. On les appelle des colonnes booléennes.
Dans notre table, la colonne oscar est de ce type : un film a gagné un Oscar (true) ou non (false). Pour filtrer sur une telle colonne, on écrit directement la valeur true ou false — sans apostrophes, car ce ne sont ni du texte ni des nombres, mais des valeurs booléennes.
Par exemple, pour ne garder que les films oscarisés :
SELECT titre, oscar FROM films WHERE oscar = true| titre | oscar |
|---|---|
| Inception | true |
| Le Parrain | true |
Seuls les deux films dont oscar vaut true sont conservés. À l'inverse, WHERE oscar = false donnerait les deux autres. Attention : on écrit = true, pas = 'true' (sans apostrophes) — l'apostrophe en ferait du texte, ce qui provoquerait une erreur.
AND : exiger les deux
Souvent, un seul critère ne suffit pas. On veut, par exemple, les films à la fois récents et bien notés. On combine alors deux conditions avec AND : la ligne n'est gardée que si les deux sont vraies.
SELECT titre FROM films WHERE annee > 2000 AND note > 8.5| titre |
|---|
| Inception |
Inception est le seul film qui satisfait les deux conditions en même temps : sorti après 2000 *et* noté au-dessus de 8.5. Amélie Poulain est récent mais noté 8.3 (trop bas) ; il est donc écarté.
AND : texte et nombre ensemble
Un point important : AND et OR ne sont pas réservés aux nombres. Ils combinent tout type de condition — texte comme nombre. Tu peux donc parfaitement croiser un filtre sur du texte avec un filtre sur une valeur numérique.
Par exemple, les films de science-fiction notés au-dessus de 8 — une condition sur le genre (texte) et une sur la note (nombre) :
SELECT titre FROM films WHERE genre = 'SF' AND note > 8| titre |
|---|
| Inception |
Les deux conditions doivent être vraies : Inception est bien de genre « SF » (condition texte) *et* noté 8.8, au-dessus de 8 (condition nombre). Il est le seul à remplir les deux. Peu importe le type de la colonne : AND exige simplement que chaque condition soit vérifiée. Au passage, retrouve la règle des types : le texte 'SF' prend des apostrophes, le nombre 8 n'en prend pas (et un booléen non plus).
OR : l'une ou l'autre
À l'inverse, OR garde la ligne si au moins une des conditions est vraie. On élargit la sélection au lieu de la restreindre. Par exemple, les films qui sont soit des drames, soit notés au-dessus de 8.9 :
SELECT titre, genre, note FROM films WHERE genre = 'Drame' OR note > 8.9| titre | genre | note |
|---|---|---|
| Le Parrain | Drame | 9.2 |
Ici Le Parrain remplit même les deux critères, mais une seule condition aurait suffi à le garder. Retiens la nuance : AND restreint (les deux exigées), OR élargit (l'une ou l'autre suffit).
Récapitulatif
En résumé, pour filtrer des lignes :
SELECT titre FROM films WHERE annee > 2000 AND note > 8.5💡 Bon à savoir : on peut enchaîner autant de conditions qu'on veut. Quand on mélange AND et OR dans une même requête, on utilise des parenthèses pour lever toute ambiguïté — un peu comme en mathématiques. Tu verras ça plus en détail dans les parcours suivants.
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.