Retour à la liste des articles Articles
10 minutes de lecture

Comment écrire une clause WHERE en SQL

Nous expliquons comment utiliser la clause WHERE de SQL à l'aide d'exemples pratiques. Si vous venez de commencer à apprendre le langage SQL et que vous souhaitez savoir comment récupérer ou travailler uniquement avec une partie spécifique des données stockées dans vos tables, cet article est fait pour vous !

La clause SQL WHERE est un élément que vous devez maîtriser si vous souhaitez utiliser SQL pour travailler avec des données. Il s'agit sans doute de l'une des constructions les plus élémentaires et les plus indispensables de SQL.

En fait, d'après mon expérience, je n'ai pratiquement jamais trouvé de requêtes de sélection ou de manipulation de données qui n'utilisent pas la clause WHERE. Filtrer les détails des employés appartenant à un département particulier, sélectionner les commandes dont la valeur est supérieure à un certain montant, ou obtenir une liste de clients appartenant à une région géographique spécifique, tout cela nécessite l'utilisation de la clause WHERE d'une manière ou d'une autre dans vos requêtes.

Bien entendu, il ne s'agit que de quelques exemples. En général, vous pouvez utiliser la clause SQL WHERE pour filtrer n'importe quelle ligne de vos tables.

Alors, sans plus attendre, entrons dans le vif du sujet !

Syntaxe de base d'une requête SQL avec clause WHERE

La syntaxe de base d'une requête SQL utilisant la clause WHERE est la suivante :

SELECT <nom de colonnes>
FROM <nom de table>
WHERE <conditions>;

La clause WHERE suit les clauses SELECT et FROM. Alors que la clause SELECT spécifie les colonnes à renvoyer à partir de la ou des tables, la clause WHERE contient les conditions qui doivent être vérifiées pour qu'une ligne soit renvoyée en tant que résultat. Chaque condition est évaluée pour chaque ligne renvoyée par le(s) table(s). SQL dispose d'une variété d'opérateurs conditionnels pour spécifier comment filtrer les lignes dont vous avez besoin.

Permettez-moi de vous présenter quelques exemples de clause WHERE pour mieux vous expliquer.

La clause WHERE avec une seule condition

Imaginez que vous travaillez dans une entreprise multinationale qui possède des bureaux dans le monde entier. Les coordonnées de ces bureaux sont stockées dans une base de données, dans une table appelée bureaux.

La table bureaux :

code_bureauvilleetatpayscode_postalterritoire
1San FranciscoCAÉtats-Unis94080NA
2BostonMAÉtats-Unis02107NA
3NYCNYÉtats-Unis10022NA
4ParisNULLFrance75017EMEA
5TokyoChiyoda-KuJaponNULLJAPAC
6SydneyNULLAustralieNSW-2010JAPAC
7LondresNULLRoyaume-UniEC2N 1HNEMEA

Supposons que vous souhaitiez obtenir la liste des bureaux situés aux États-Unis. Vous pouvez utiliser une clause WHERE. Votre requête ressemble à ceci :

SELECT *
FROM bureaux
WHERE pays = 'États-Unis';

Le résultat :

code_bureauvilleetatpayscode_postalterritoire
1San FranciscoCAÉtats-Unis94080NA
2BostonMAÉtats-Unis02107NA
3NYCNYÉtats-Unis10022NA

Pour cette requête, SQL évalue d'abord chaque ligne et compare la valeur de la colonne pays à 'États-Unis'. Il ne renvoie ensuite que les lignes pour lesquelles la condition est vraie. Dans notre cas, nous avons trois lignes pour lesquelles le pays est les États-Unis.

(À ce stade, si vous ne savez pas comment écrire des requêtes, je vous encourage à suivre le cours SQL pour les débutants de LearnSQL.fr. Non seulement il est bien structuré, mais il contient également des exercices géniaux pour alimenter votre apprentissage et faire des progrès).

Vous pouvez également utiliser des opérateurs de comparaison tels que >, <, >=, <= et <> pour comparer des valeurs. Par exemple, supposons que vous souhaitiez extraire uniquement les lignes pour lesquelles la valeur code_bureau est supérieure à 5.

La requête :

SELECT *
FROM bureaux
WHERE code_bureau > 5;

Le résultat :

code_bureauvilleetatpayscode_postalterritoire
6SydneyNULLAustralieNSW-2010APAC
7LondresNULLRoyaume-UniEC2N 1HNEMEA

Ou, si vous voulez extraire toutes les lignes où le territoire n'est pas 'NA', la requête ressemble à ceci :

SELECT *
FROM bureaux
WHERE territoire <> 'NA';

Le résultat :

code_bureauvilleetatpayscode_postalterritoire
4ParisNULLFrance75017EMEA
5TokyoChiyoda-KuJaponNULLJAPAC
6SydneyNULLAustralieNSW-2010JAPAC
7LondresNULLRoyaume-UniEC2N 1HNEMEA

La clause WHERE avec plusieurs conditions

Jusqu'à présent, j'ai abordé des exemples très simples de requêtes qui illustrent l'utilisation d'une clause WHERE avec une seule condition. Cependant, lorsque vous écrivez des requêtes pratiques et réelles, vous utilisez souvent plus d'une condition pour récupérer les résultats dont vous avez besoin.

Utilisation des opérateurs conditionnels

SQL dispose d'opérateurs conditionnels AND, OR et NOT pour étendre le nombre de conditions utilisées dans une requête. Vous pouvez relier des conditions à l'aide de l'opérateur AND lorsque vous souhaitez obtenir uniquement les lignes qui remplissent toutes les conditions. En revanche, vous utilisez l'opérateur OR lorsque vous souhaitez récupérer toutes les lignes pour lesquelles au moins l'une des conditions est vraie.

Par exemple, supposons que vous souhaitiez obtenir les villes et les pays de tous les bureaux situés au Royaume-Uni ou en France. Comme vous l'avez peut-être deviné, vous utilisez l'opérateur OR pour ce faire.

La requête :

SELECT ville, pays
FROM bureaux
WHERE pays = 'Royaume-Uni'
  OR pays = 'France';

Le résultat :

villepays
ParisFrance
LondresRoyaume-Uni

Ici, SQL renvoie les lignes pour lesquelles l'une ou les deux conditions sont vraies. En pratique, il existe une meilleure façon d'écrire cette requête en utilisant l'opérateur IN.

Utilisation de l'opérateur IN

L'opérateur IN vous permet de spécifier une liste de valeurs à vérifier. Regardez la requête suivante :

SELECT ville, pays
FROM bureaux
WHERE pays IN ('Royaume-Uni', 'France');

Le résultat :

villepays
ParisFrance
LondresRoyaume-Uni

Ici, toutes les lignes dont les pays figurent dans la liste des valeurs spécifiées (dans notre cas, le Royaume-Uni et la France) sont renvoyées.

Avec l'opérateur IN, vous pouvez spécifier une liste de plusieurs valeurs, et pas seulement deux.

L'opérateur NOT IN permet de renvoyer les lignes dont les valeurs ne figurent pas dans la liste. Par exemple, vous pouvez obtenir les codes postaux de tous les bureaux qui ne se trouvent pas dans le territoire JAPAC ou EMEA.

Utilisation de l'opérateur IN dans une sous-requête

L'opérateur IN peut également être utilisé dans une sous-requête pour générer une liste à partir d'une autre table. Pour mieux comprendre, imaginons que vous disposiez d'une autre table contenant le chiffre d'affaires de chaque bureau.

La table revenu_bureau :

code_bureaurevenu
1100002
2232221
3545556
4543432
5765678
6433433
7123245

Vous voulez savoir quels sont les bureaux qui ne génèrent pas suffisamment de revenus, et vous les définissez comme étant ceux dont les revenus sont inférieurs à 200 000. Cela signifie que vous devez trouver les villes où se trouvent les bureaux dont les recettes sont inférieures à 200 000 euros.

La requête :

SELECT ville
FROM bureaux
WHERE code_bureau IN (SELECT code_bureau
  FROM  revenu_bureau
  WHERE revenu < 200000);

Le résultat :

ville
San Francisco
Londres

Dans cette requête, SQL traite d'abord la sous-requête pour obtenir une liste des codes des bureaux dont le chiffre d'affaires est inférieur à 200 000. Les codes des bureaux dans la table bureaux sont ensuite comparés à cette liste pour renvoyer les lignes correspondant à celles de la liste.

Conditions plus complexes

Essayons un exemple un peu plus complexe.

Que faire si vous souhaitez obtenir les codes de bureau et les villes de tous les bureaux situés dans le territoire JAPAC ou EMEA, dont les codes postaux n'ont pas la valeur NULL, qui n'ont pas d'état spécifié et dont les codes de bureau sont supérieurs ou égaux à 5 ?

Une bonne approche pour écrire cette requête consiste à isoler les conditions une par une et à les relier aux colonnes disponibles :

  • La valeur de territoire est soit JAPAC, soit EMEA.
  • La valeur de code_postal n'est pas NULL.
  • L'état a une valeur NULL ou vide.
  • La valeur de code_bureau est supérieure ou égale à 5.

Maintenant que vous comprenez les conditions, l'écriture de la requête devient simple. Notez que toutes ces conditions doivent être remplies pour qu'une ligne soit renvoyée.

La requête :

SELECT code_bureau, ville
FROM bureaux
WHERE territoire IN ('JAPAC', 'EMEA')
AND code_postal IS NOT NULL
AND (etat IS NULL OR etat = '')
AND code_bureau >= 5;

Le résultat :

code_bureauville
6Sydney
7Londres

Les conditions sont évaluées de la manière suivante. Avec la première condition, SQL ne renvoie que les lignes dont les territoires sont JAPAC ou EMEA. Parmi ces lignes, il vérifie ensuite si le code postal a la valeur NULL. Ensuite, il considère la troisième condition dans laquelle nous utilisons les parenthèses. Les deux conditions entre parenthèses sont évaluées pour donner un résultat collectif : il vérifie la valeur de la colonne etat et renvoie un résultat positif si elle est vide ou NULL. Enfin, la dernière condition filtre les lignes dont la valeur de code_bureau est supérieure ou égale à 5. Ainsi, seuls les bureaux de Sydney et de Londres sont renvoyés dans le résultat.

Remarquez que nous n'utilisons pas code_postal <> NULL ou etat = NULL. Au lieu de cela, nous avons utilisé les opérateurs IS NOT et IS, respectivement, pour filtrer les valeurs avec la valeur NULL. En effet, NULL est quelque chose d'inconnu ou qui n'existe pas et qui ne peut donc jamais être assimilé à une autre valeur. SQL n'envoie pas d'erreur si vous utilisez = ou <>, mais au lieu de cela, vous recevez un ensemble vide comme résultat et aucune ligne n'est renvoyée. Il s'agit manifestement d'une erreur.

Supposons maintenant que vous ayez la même exigence, mais que vous souhaitiez obtenir tous les codes de bureau supérieurs ou égaux à 4 mais inférieurs ou égaux à 6. Vous pouvez utiliser l'opérateur BETWEEN pour cela.

La requête :

SELECT code_bureau, ville
FROM bureaux
WHERE territoire IN ('JAPAC', 'EMEA')
AND code_postal IS NOT NULL
AND (etat is NULL OR etat ='')
AND code_bureau BETWEEN 4 AND 6;

Le résultat :

code_bureauville
4Paris
6Sydney

L'opérateur BETWEEN recherche une plage de valeurs entre 4 et 6, y compris les limites. Deux lignes sont maintenant renvoyées : Paris et Sydney.

Ce que vous ne pouvez pas utiliser dans une clause WHERE

Vous ne pouvez pas utiliser les fonctions d'agrégation directement dans une clause WHERE. En effet, les conditions d'une clause WHERE sont évaluées ligne par ligne, alors que les fonctions d'agrégation agissent sur plusieurs lignes pour renvoyer un seul résultat.

Prenons l'exemple suivant. Vous souhaitez obtenir tous les codes de bureau dont le revenu est supérieur à la moyenne. Votre premier réflexe est peut-être d'écrire quelque chose comme ceci :

SELECT code_bureau
FROM revenu_bureau
WHERE revenu > AVG(revenu);

Cependant, cette requête renvoie une erreur :

ERROR 1111 (HY000): Invalid use of group function

Le filtrage des enregistrements à l'aide de fonctions agrégées peut être réalisé en utilisant une sous-requête. Jetez un coup d'œil :

SELECT code_bureau, revenu
FROM revenu_bureau
WHERE revenu > (SELECT AVG(revenu)
		     FROM revenu_bureau);

Le résultat :

code_bureaurevenu
3545556
4543432
5765678
6433433

Dans cette requête, SQL récupère d'abord le revenu moyen à partir de la sous-requête. Il compare ensuite cette valeur aux recettes de chaque ligne et ne renvoie que les codes de bureau dont les recettes correspondantes sont supérieures à la valeur moyenne.

Prêt à utiliser la clause WHERE dans vos requêtes ?

Après avoir lu cet article, vous avez maintenant une bonne idée de la manière d'utiliser la clause SQL WHERE. Les requêtes fournies dans cet article sont basiques et conviennent à un débutant.

Si vous avez récemment commencé votre apprentissage de SQL et que vous souhaitez accélérer votre croissance, je vous recommande ce parcours d'apprentissage de LearnSQL.fr. Je préfère celui-ci car il est très complet pour un débutant en SQL.

Il constitue une excellente base pour un analyste - ou toute autre personne utilisant SQL - et fournit une bonne base pour l'écriture de requêtes que vous utilisez au quotidien pour obtenir des informations à partir de données.

Mais je n'insisterai jamais assez sur la nécessité de la pratique et de la cohérence. C'est ce qui cimente tout l'apprentissage. Vous pouvez commencer par écrire 10 à 20 requêtes par jour à titre d'entraînement ; en trois mois, vous aurez écrit près de 1 800 requêtes !

Ce qui est formidable avec SQL, c'est qu'il est à la fois simple et puissant. Alors, qu'attendez-vous ? Mettez les mains dans le cambouis tout de suite !