SQL ET POSTGRE 5.30 : Restriction et sortie de donnée avec IN et NOT IN
Jusqu'ici nous avons appris à sélectionner les lignes d'une table dont une colonne est égale à une valeur unique. Cette leçon montre comment écrire une condition de sélection qui accepte plusieurs valeurs à la fois grâce aux opérateurs IN et NOT IN de SQL.
Partons d'un exemple simple sur la table acteur. La requête SELECT prenom, nom FROM acteur WHERE prenom = 'Bruce'; renvoie tous les acteurs prénommés Bruce, comme Bruce Lee. Pour récupérer ceux qui se prénomment Bruce ou John, on pourrait être tenté d'écrire WHERE prenom = 'Bruce', 'John', mais cette syntaxe renvoie une erreur. La solution consiste à utiliser IN à la place du signe égal et à placer les valeurs entre parenthèses, séparées par des virgules.
Exemples avec IN et NOT IN
SELECT prenom, nom FROM acteur
WHERE prenom IN ('Bruce', 'John', 'Peter');
SELECT prenom, nom FROM acteur
WHERE prenom NOT IN ('Bruce', 'John', 'Peter');
La première requête retourne les acteurs prénommés Bruce, John ou Peter. La seconde exclut au contraire ces trois prénoms et affiche tous les autres acteurs. On peut ajouter autant de valeurs que nécessaire dans la liste, simplement en les séparant par des virgules.
- IN : sélectionne les lignes dont la colonne correspond à l'une des valeurs listées.
- NOT IN : sélectionne les lignes dont la colonne ne correspond à aucune des valeurs listées.
- Les valeurs textuelles sont entourées de guillemets simples.
- Les valeurs numériques (entiers, identifiants) s'écrivent sans guillemets.
IN et NOT IN fonctionnent aussi avec des entiers, par exemple sur la colonne acteur_id. La requête SELECT acteur_id, prenom, nom FROM acteur WHERE acteur_id IN (1, 2, 3, 4, 5); retourne les cinq premiers acteurs, tandis que la même condition avec NOT IN retourne tous les autres. Dans la prochaine vidéo, nous verrons la condition LIKE pour filtrer les chaînes de caractères selon un motif.
En résumé
Cette leçon enseigne comment filtrer et restreindre les résultats de sélection en SQL/PostgreSQL en utilisant les opérateurs IN et NOT IN. Plutôt que d'utiliser plusieurs conditions égales (impossibles à combiner avec =), IN permet de sélectionner des lignes dont une colonne correspond à l'une de plusieurs valeurs énumérées. NOT IN fait l'inverse : il exclut les lignes dont la colonne correspond à l'une des valeurs spécifiées. Ces opérateurs fonctionnent avec n'importe quel type de données (chaînes de caractères, entiers, etc.) et acceptent un nombre illimité de valeurs.
Points clés
- Utiliser IN plutôt que = pour comparer une colonne à plusieurs valeurs : WHERE prénom IN ('Bruce', 'John', 'Peter')
- NOT IN exclut les lignes correspondant à une liste de valeurs : WHERE prénom NOT IN ('John', 'Peter', 'Bruce') retourne tous les acteurs sauf ceux nommés
- Les valeurs sont énumérées entre parenthèses et séparées par des virgules, fonctionnant avec chaînes, entiers ou autres types
- IN et NOT IN permettent de filtrer sur des identifiants ou clés primaires : WHERE ID IN (1, 2, 3, 4, 5)
- NOT IN avec identifiants exclut les enregistrements correspondants : WHERE ID NOT IN (1, 2, 3, 4, 5) retourne tous les autres enregistrements
Questions fréquentes
Quelle est la différence entre = et IN en SQL ?
L'opérateur = permet de comparer une colonne à une seule valeur, tandis que IN permet de vérifier si une colonne correspond à l'une de plusieurs valeurs énumérées. Utiliser = avec plusieurs valeurs provoque une erreur syntaxique ; IN est la solution pour tester plusieurs conditions alternatives.
Comment exclure plusieurs valeurs avec NOT IN ?
Utiliser NOT IN suivi de la liste des valeurs à exclure entre parenthèses et séparées par des virgules. Par exemple, WHERE prénom NOT IN ('John', 'Peter', 'Bruce') retourne tous les enregistrements sauf ceux ayant ces trois prénoms.
Peut-on utiliser IN et NOT IN avec des identifiants numériques ?
Oui, IN et NOT IN fonctionnent avec tous les types de données. Par exemple, WHERE ID IN (1, 2, 3, 4, 5) sélectionne les enregistrements ayant ces identifiants, tandis que WHERE ID NOT IN (1, 2, 3, 4, 5) retourne tous les autres enregistrements.