Retour à la liste des articles Articles
10 minutes de lecture

Le guide complet de la clause WHERE en SQL

Apprenez à utiliser la clause SQL WHERE pour filtrer les lignes. Dans cet article complet, nous abordons les opérateurs de comparaison et les opérateurs BETWEEN, IN, LIKE, AND, OR et NOT.

Le filtrage des lignes de sortie est l'une des premières choses que vous devez apprendre lorsque vous commencez votre voyage en SQL. Dans ce guide, nous allons voir comment utiliser la clause WHERE de SQL pour filtrer les lignes dans différents scénarios. Nous couvrirons les cas d'utilisation de base et certains cas plus avancés.

La clause WHERE en SQL

Imaginons que vous travaillez sur l'un de vos premiers projets SQL et que vous exécutez vos premières requêtes SQL. Vous connaissez déjà la syntaxe de base de l'instruction SELECT et savez comment extraire des colonnes d'une ou deux tables de votre base de données. Mais vous avez remarqué que, très souvent, vous n'avez pas besoin de tous les enregistrements d'une table. Vous souhaitez apprendre à filtrer votre résultat afin de ne renvoyer que quelques enregistrements répondant à certains critères.

Voulez-vous uniquement les enregistrements correspondant à un client spécifique ? Ou bien avez-vous besoin de récupérer la liste des produits dont le stock est faible (par exemple, moins de 10 articles) ? Ou peut-être voulez-vous obtenir la liste des représentants commerciaux qui travaillent dans la succursale X et qui ont réalisé des ventes supérieures à la moyenne au cours du dernier mois ?

Dans tous ces cas, vous aurez besoin de la clause SQL WHERE pour filtrer vos résultats. Cette clause introduit certaines conditions, comme :

  • quantity < 100
  • price BETWEEN 100 AND 500
  • customer_name = ‘John Smith’.

Pour que les conditions de filtrage soient exécutées correctement, la clause WHERE doit être placée après FROM et JOIN et avant GROUP BY, HAVING et ORDER BY.

Par exemple, voici une requête SQL pour obtenir des informations sur les livres publiés depuis 2020, classés par nom d'auteur :

SELECT b.title, a.name, b.year
FROM books b
JOIN authors a
ON books.author_id = authors.id
WHERE b.year >= 2020
ORDER BY a.name;

Notez que nous avons combiné des informations provenant de deux tables (books et authors) et placé la clause WHERE après la condition de jonction ON et avant la clause ORDER BY. Vous pouvez en savoir plus sur la syntaxe correcte de la clause WHERE dans ce guide destiné aux débutants.

Il peut également être judicieux de commencer à pratiquer WHERE dès maintenant. Dans ce cas, je vous recommande notre cours interactif SQL pour les débutants interactif. Ses 129 exercices interactifs couvrent les principaux concepts SQL, notamment les conditions simples et complexes de WHERE.

Si vous souhaitez d'abord avoir une vue d'ensemble, poursuivons en explorant les opérateurs que vous pouvez utiliser dans la clause WHERE.

Opérateurs à utiliser avec SQL WHERE

Vous pouvez construire des conditions de filtrage aussi bien basiques que complexes dans WHERE grâce à un large éventail d'opérateurs qui peuvent être utilisés pour comparer des valeurs en SQL. Nous allons passer en revue les principaux opérateurs qui permettent de filtrer par des valeurs numériques, des chaînes de caractères, des valeurs NULL et une liste de valeurs.

Valeurs numériques

Pour les valeurs numériques, vous pouvez utiliser ces opérateurs de comparaison :

  • = Égal à.
  • != (ou <>) Non égal à.
  • < Inférieur à.
  • <= Inférieur ou égal à.
  • > Supérieur à.
  • >= Supérieur ou égal à.

Pour voir comment ces opérateurs fonctionnent en pratique, nous allons prendre quelques exemples. Pour nos exemples, nous allons utiliser le tableau suivant qui comprend des informations sur les vendeurs : ID, prénom, nom, salaire annuel, taux de commission, commission qu'ils ont reçue en 2021, et ID de leur branche.

salespeople
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
11KatarinaRostova450000.1547345.601
12AlinaPark430000.1545678.902
13MeeraMalik500000.1539045.632
17SamarNavabi520000.1423023.452
18DonaldRessler400000.1441345.752
20ElisabethKeen590000.1445350.002
21TomKeen410000.1241560.751
22DembeZuma400000.1231540.705
23AramMojtabai500000.1229050.652
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
34RaymondReddington600000.1017570.805
35HaroldCooper570000.1015450.502
37IanGarvey430000.08NULL1
38IvanStepanov410000.08NULL1

Tout d'abord, nous voulons obtenir les enregistrements de tous les vendeurs dont le salaire annuel est égal ou supérieur à 50K$. Nous pouvons utiliser la requête suivante :

SELECT *
FROM salespeople
WHERE salary >= 50000;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
13MeeraMalik500000.1539045.632
17SamarNavabi520000.1423023.452
20ElisabethKeen590000.1445350.002
23AramMojtabai500000.1229050.652
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
34RaymondReddington600000.1017570.805
35HaroldCooper570000.1015450.502

Comme prévu, nous avons obtenu la liste des vendeurs dont le salaire est égal ou supérieur à 50 000 $.

Ensuite, voyons comment utiliser des nombres flottants plutôt que des nombres entiers avec les opérateurs de comparaison. Nous allons répertorier tous les vendeurs qui, grâce à leur longue expérience au sein de l'entreprise, ont un taux de commission supérieur à 0,12 :

SELECT *
FROM salespeople
WHERE commission_rate > 0.12;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
11KatarinaRostova450000.1547345.601
12AlinaPark430000.1545678.902
13MeeraMalik500000.1539045.632
17SamarNavabi520000.1423023.452
18DonaldRessler400000.1441345.752
20ElisabethKeen590000.1445350.002

Comme nous avons utilisé l'opérateur non inclusif > dans la clause WHERE, nous n'avons que les vendeurs dont le taux de commission est strictement supérieur à 0,12. Cela exclut ceux dont le taux est égal à 0,12.

Notez également que nous avons utilisé des opérateurs de comparaison avec des littéraux (c'est-à-dire 50000 et 0.12). Lors du filtrage des enregistrements, nous pouvons également utiliser des opérateurs de comparaison avec des expressions. Par exemple, dressons la liste des vendeurs dont les commissions perçues en 2021 étaient supérieures à leur salaire annuel :

SELECT *
FROM salespeople
WHERE commission_2021 > salary;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
11KatarinaRostova450000.1547345.601
12AlinaPark430000.1545678.902
18DonaldRessler400000.1441345.752
21TomKeen410000.1241560.751

La requête a fonctionné comme prévu ; nous voyons quatre vendeurs qui ont apparemment eu des ventes très élevées en 2021, de sorte que leurs revenus de commissions ont dépassé leur salaire.

À ce stade, vous devriez vous sentir plus ou moins à l'aise avec les opérateurs de comparaison présentés ci-dessus. Il est temps d'introduire un autre opérateur que vous pouvez utiliser avec des valeurs numériques dans WHERE: l'opérateur BETWEEN.

Pour lister tous les vendeurs dont le taux de commission est compris entre 0,10 et 0,14, vous pouvez utiliser la requête suivante :

SELECT *
FROM salespeople
WHERE commission_rate BETWEEN 0.10 AND 0.14;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
17SamarNavabi520000.1423023.452
18DonaldRessler400000.1441345.752
20ElisabethKeen590000.1445350.002
21TomKeen410000.1241560.751
22DembeZuma400000.1231540.705
23AramMojtabai500000.1229050.652
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
34RaymondReddington600000.1017570.805
35HaroldCooper570000.1015450.502

Notez que l'opérateur BETWEEN est inclusif sur les limites inférieure et supérieure, de sorte que le jeu de résultats comprend les enregistrements correspondant aux taux de commission de 0,10 et 0,14.

Passons maintenant aux opérateurs que vous pouvez utiliser avec des valeurs de texte.

Valeurs de texte

Tout d'abord, avec les valeurs textuelles, vous pouvez utiliser la série suivante d'opérateurs de comparaison qui fonctionnent de la même manière avec les chaînes de caractères qu'avec les valeurs numériques, mais dans le cas des valeurs textuelles, les enregistrements sont ordonnés et comparés par ordre alphabétique :

  • = Egal à.
  • != (ou <>) Non égal à.
  • < Inférieur à (se produit en premier dans l'ordre alphabétique, c'est-à-dire a < b).
  • <= Inférieur ou égal à.
  • > Supérieur à (se produit après dans l'ordre alphabétique, c'est-à-dire b > a).
  • >= -Plus grand que ou égal à.

Pour obtenir des informations sur tous les vendeurs dont le nom de famille (trié par ordre alphabétique) est antérieur à "Keen", nous utiliserons la requête suivante :

SELECT *
FROM salespeople
WHERE last_name < ‘Keen’;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
35HaroldCooper570000.1015450.502
37IanGarvey430000.08NULL1

Ces opérateurs de comparaison fonctionnent bien avec les valeurs textuelles. Cependant, notez que nous incluons toujours des guillemets aux chaînes de caractères utilisées dans les conditions de WHERE (par exemple, 'Keen'). De plus, alors que certaines bases de données ne sont pas sensibles à la casse par défaut (par exemple, SQL Server, MySQL), d'autres le sont (par exemple, Oracle) et ne renverront aucun enregistrement si vous recherchez 'keen' au lieu de 'Keen'.

Nous avons souvent besoin de beaucoup plus de souplesse avec les chaînes de caractères qu'avec les nombres, et c'est là que l'opérateur LIKE s'avère utile. Il permet d'effectuer un filtrage avancé des valeurs de texte, en particulier lorsqu'il est associé à un caractère générique SQL (par exemple, "_" pour un caractère manquant ou "%" pour un nombre quelconque de caractères).

Par exemple, si nous voulons répertorier tous les vendeurs dont le nom de famille commence par K, nous pouvons écrire la requête SQL suivante :

SELECT *
FROM salespeople
WHERE last_name LIKE ‘K%’;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
20ElisabethKeen590000.1445350.002
21TomKeen410000.1241560.751
30KateKaplan540000.1025760.455

Lisez cet article si vous voulez en savoir plus sur la façon dont les caractères génériques SQL peuvent être utilisés pour filtrer les enregistrements avec des valeurs de texte en SQL.

Comparaisons avec des valeurs NULL

La combinaison des opérateurs de comparaison et des valeurs NULL peut faire trébucher les débutants en SQL en raison de certains comportements contre-intuitifs. Par exemple, si nous testons qu'une certaine valeur est égale à NULL, le résultat sera inconnu même si la valeur de la colonne est NULL. Comme la clause WHERE requiert true vous obtiendrez zéro ligne avec une condition comme la suivante :

SELECT *
FROM salespeople
WHERE commission_2021 = NULL;

Result:
Query has no result

La solution consiste à utiliser les opérateurs IS NULL ou IS NOT NULL. Voici comment vous pouvez récupérer tous les enregistrements dont la colonne commision_2021 contient NULL:

SELECT *
FROM salespeople
WHERE commission_2021 IS NULL;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
37IanGarvey430000.08NULL1
38IvanStepanov410000.08NULL1

Consultez ce guide pour obtenir d'autres exemples du comportement de NULL avec divers opérateurs de comparaison.

Opérateur IN - Vérification par rapport à une liste de valeurs

Enfin, vous pouvez utiliser l'opérateur IN pour effectuer une vérification par rapport à une liste prédéfinie de valeurs. Par exemple, supposons que vous ayez une liste d'employés dont les revenus doivent être vérifiés. Vous pouvez récupérer les enregistrements nécessaires à l'aide d'une requête SQL comme celle-ci :

SELECT *
FROM salespeople
WHERE last_name IN (‘Kaplan’, ‘Gerard’, ‘Zuma’);
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
22DembeZuma400000.1231540.705
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005

C'est parfait ! Cependant, il y a souvent quelques nuances syntaxiques à noter lors de l'utilisation de divers opérateurs dans la clause WHERE. Pour vous faciliter la tâche, nous avons préparé un aide-mémoire de deux pages sur SQL pour les débutants qui comprend de nombreux exemples d'opérateurs utilisés pour filtrer le résultat d'une requête SQL.

Combinaison de conditions de filtrage dans la clause WHERE

Dans les missions du monde réel, il est souvent insuffisant d'avoir une seule condition dans la clause WHERE. Heureusement, vous pouvez combiner différentes conditions de filtrage avec les opérateurs AND, OR et NOT:

  • L'opérateur AND affiche un enregistrement si toutes les conditions sont vraies.
  • L'opérateur OR affiche un enregistrement si l' une des conditions est vraie.
  • L'opérateur NOT affiche un enregistrement si la condition correspondante n'est pas vraie.

Des exemples permettront de mieux comprendre leur fonctionnement.

Pour répertorier tous les vendeurs qui travaillent dans la branche n° 5 et dont le salaire est égal ou supérieur à 50 000 dollars, utilisez la requête suivante :

SELECT *
FROM salespeople
WHERE branch_id = 5 AND salary >= 50000;

Pour récupérer tous les enregistrements dont le nom de famille est 'Kaplan' ou 'Reddington', utilisez la requête suivante :

SELECT *
FROM salespeople
WHERE last_name = ‘Kaplan’ OR last_name = ‘Reddington’;

Enfin, pour obtenir des informations sur tous les vendeurs, à l'exception de ceux qui travaillent dans la branche n° 2, utilisez cette requête :

SELECT *
FROM salespeople
WHERE NOT branch_id = 2;

Si vous souhaitez obtenir d'autres exemples d'utilisation de AND, OR, et NOT, consultez cet article.

Pour créer des conditions de filtrage encore plus complexes, vous pouvez combiner plusieurs conditions en utilisant AND, OR et NOT dans la même instruction WHERE. Cependant, il est important de se rappeler la préséance de ces opérateurs en SQL : PAS → ET → OU. Pour une meilleure clarté, il est fortement recommandé d'utiliser des parenthèses, même si elles ne sont pas nécessaires dans un cas précis.

Disons que nous voulons récupérer tous les enregistrements où le nom de famille d'un employé est 'Keen' ou 'Park', où ses revenus de commission étaient supérieurs à son salaire en 2021 et où il ne travaille pas dans la branche #2. Voici une requête possible :

SELECT *
FROM salespeople
WHERE (last_name = ‘Keen’ OR last_name = ‘Park’) 
AND (commission_2021 > salary)
AND (NOT branch_id = 2);
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
21TomKeen410000.1241560.751

Et maintenant, nous en avons fini avec les exemples ! Si vous avez besoin de plus d'informations sur la clause WHERE et d'exemples supplémentaires, lisez nos autres guides destinés aux débutants. Et puis, pratiquez, pratiquez et pratiquez encore !

Il est temps d'utiliser la clause WHERE du langage SQL !

La meilleure façon de maîtriser un nouveau concept en SQL est de l'essayer dans plusieurs requêtes. Pour les débutants, je pense que l'environnement le plus confortable pour pratiquer quelque chose de nouveau est celui des cours interactifs en ligne - vous avez tous les exemples prêts pour vous et vous pouvez écrire des requêtes depuis le confort de votre navigateur.

Pour vous entraîner à utiliser SQL WHERE, je vous recommande de commencer par notre SQL pour les débutants interactif. Il couvre tout ce dont vous aurez besoin pour commencer à récupérer des données dans une base de données, y compris l'écriture de conditions de filtrage sophistiquées.

Pour encore plus d'exercices pratiques, consultez la La pratique du SQL piste d'apprentissage. Elle comprend 5 cours interactifs avec des centaines de défis de codage.

Merci de votre lecture et bon apprentissage !