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

titreanneenotegenreoscar
Inception20108.8SFtrue
Le Parrain19729.2Drametrue
Pulp Fiction19948.9Crimefalse
Amélie Poulain20018.3Comédiefalse

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 :

La requête
SELECT * FROM films WHERE genre = 'Drame'
Résultat · 1 ligne
titreanneenotegenreoscar
Le Parrain19729.2Drametrue

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 :

La requête
SELECT titre, genre FROM films WHERE genre <> 'Drame'
Résultat · 3 lignes
titregenre
InceptionSF
Pulp FictionCrime
Amélie PoulainComé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 :

La requête
SELECT titre, annee FROM films WHERE annee > 2000
Résultat · 2 lignes
titreannee
Inception2010
Amélie Poulain2001

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 :

La requête
SELECT titre, oscar FROM films WHERE oscar = true
Résultat · 2 lignes
titreoscar
Inceptiontrue
Le Parraintrue

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.

La requête
SELECT titre FROM films WHERE annee > 2000 AND note > 8.5
Résultat · 1 ligne
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) :

La requête
SELECT titre FROM films WHERE genre = 'SF' AND note > 8
Résultat · 1 ligne
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 :

La requête
SELECT titre, genre, note FROM films WHERE genre = 'Drame' OR note > 8.9
Résultat · 1 ligne
titregenrenote
Le ParrainDrame9.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 :

📌 Filtrer avec WHERE — l'essentiel
WHERE condition→ après FROM, ne garde que les lignes qui passent le test
WHERE genre = 'Drame'→ texte entre apostrophes
WHERE genre <> 'Drame'→ différent de (garde tout sauf)
WHERE annee > 2000→ nombres sans apostrophes (> < >= <= =)
WHERE oscar = true→ colonne vrai/faux (booléen), sans apostrophes
AND→ les deux conditions exigées
OR→ au moins une condition suffit
Exemple complet
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.

← Tous les cours SQL