CodeGym /Cours /SQL SELF /Filtrage des données avec IN et NOT ...

Filtrage des données avec IN et NOT IN

SQL SELF
Niveau 13 , Leçon 2
Disponible

Imagine que tu bosses sur la base de données d’une université et que tu dois trouver les étudiants inscrits à certains cours précis. Par exemple, "Programmation", "Mathématiques" et "Physique". Bien sûr, tu pourrais écrire une requête longue avec plein de conditions du genre :

SELECT *
FROM students 
WHERE course = 'Programmation'
   OR course = 'Mathématiques'
   OR course = 'Physique';

Mais soyons honnêtes. Écrire ce genre de trucs, c’est relou et franchement pas très élégant. Heureusement, l’opérateur IN est là pour te simplifier la vie et rendre la requête bien plus compacte :

SELECT *
FROM students 
WHERE course IN ('Programmation', 'Mathématiques', 'Physique');

Ça fait un peu magie, non ? Au lieu de plein de OR, on dit juste à SQL de chercher les valeurs dans cette liste. Et si tu veux vérifier qu’une valeur n’est pas dans la liste, tu utilises NOT INtrouve tout ce qui n’est pas dans cette liste.

Syntaxe de l’opérateur IN

Voilà la syntaxe générale de IN :

SELECT colonnes
FROM table
WHERE colonne IN (valeur1, valeur2, valeur3, ...);

Maintenant, voyons quelques exemples.

Exemple 1 : Étudiants qui suivent plusieurs cours

Disons qu’on a une table students :

id name course
1 Anna Programmation
2 Mello Physique
3 Kate Mathématiques
4 Dan Chimie
5 Olly Biologie

On veut trouver tous les étudiants qui suivent "Programmation", "Mathématiques" ou "Physique". On utilise IN :

SELECT name, course
FROM students
WHERE course IN ('Programmation', 'Mathématiques', 'Physique');

Résultat :

name course
Anna Programmation
Mello Physique
Kate Mathématiques

Comme tu vois, l’opérateur IN a bien simplifié la tâche. Pas besoin d’écrire une longue liste de OR, tu mets juste les valeurs qui t’intéressent dans la liste.

Exemple 2 : Étudiants qui ne suivent pas certains cours

Maintenant, imaginons que tu veux trouver les étudiants qui ne suivent pas "Programmation", "Mathématiques" et "Physique". Là, NOT IN est parfait :

SELECT name, course
FROM students
WHERE course NOT IN ('Programmation', 'Mathématiques', 'Physique');

Résultat :

name course
Dan Chimie
Olly Biologie

Donc, NOT IN te renvoie toutes les lignes où la colonne course n’est pas dans la liste donnée.

Utiliser IN et NOT IN avec des sous-requêtes

Les opérateurs IN et NOT IN sont super utiles quand tu veux comparer des données entre deux tables. Par exemple, imaginons qu’on a deux tables :

Table students :

id name course_id
1 Anna 101
2 Mello 102
3 Kate 103
4 Dan 104

Table courses :

id name
101 Programmation
102 Physique
103 Mathématiques
105 Chimie

Imaginons qu’on veut trouver les étudiants inscrits à des cours qui existent dans la table courses. Là, une sous-requête avec IN est nickel :

SELECT name
FROM students
WHERE course_id IN (
    SELECT id
    FROM courses
);

Cette requête marche comme ça : la sous-requête SELECT id FROM courses renvoie la liste de tous les ids de cours. Ensuite, IN vérifie si course_id est dans cette liste.

Résultat :

name
Anna
Mello
Kate

Pourquoi Dan n’apparaît pas ? Parce que son course_id (104) n’existe pas dans la table courses.

Particularités avec NULL

L’opérateur IN a une particularité importante : si la liste de valeurs contient NULL, ça peut influencer le résultat de la requête. Voyons un exemple.

Table grades :

student_id course_id grade
1 101 A
2 102 NULL
3 103 B

Une requête qui cherche les étudiants avec une note dans ('A', 'B', 'C') pourrait ressembler à ça :

SELECT student_id
FROM grades
WHERE grade IN ('A', 'B', 'C');

Résultat :

student_id
1
3

La ligne avec NULL dans la colonne grade est ignorée, parce que NULL n’est jamais considéré comme faisant partie d’une liste.

Maintenant, imagine que tu utilises NOT IN. Par exemple :

SELECT student_id
FROM grades
WHERE grade NOT IN ('A', 'B', 'C');

Tu t’attends à voir la ligne avec student_id = 2, mais le résultat sera vide ! Pourquoi ? Parce que NULL comparé à chaque valeur de la liste donne toujours un résultat indéfini (UNKNOWN). Ce comportement peut surprendre, donc quand tu utilises NOT IN, fais gaffe aux colonnes qui peuvent contenir NULL. Le mieux, c’est de vérifier explicitement NULL :

SELECT student_id
FROM grades
WHERE grade NOT IN ('A', 'B', 'C')
   OR grade IS NULL;

Résultat :

student_id
2

Conseils pour utiliser IN et NOT IN

Utilise IN pour rendre ton code SQL plus lisible
Si tu dois vérifier si une colonne est dans une liste de valeurs, préfère toujours IN à une ribambelle de OR.

Fais attention à NOT IN et NULL
Si tes données peuvent contenir des NULL, ça peut donner des résultats bizarres. Pense à gérer NULL explicitement avec NOT IN.

Utilise des index pour accélérer les sous-requêtes
Si tu utilises IN avec une sous-requête, assure-toi que la colonne dans la sous-requête est indexée, sinon tu risques d’avoir des soucis de perf.

Exemple d’un cas réel

Imagine que tu bosses sur un site e-commerce. Tu as les tables orders et users. Tu veux trouver tous les utilisateurs qui n’ont jamais passé de commande.

Table users :

id name
1 Anna
2 Mello
3 Kate
4 Dan

Table orders :

id user_id total
1 1 500
2 3 300

On utilise NOT IN pour résoudre ce problème :

SELECT name
FROM users
WHERE id NOT IN (
    SELECT user_id
    FROM orders
);

Résultat :

name
Mello
Dan

Cette requête fonctionne comme ça : d’abord la sous-requête SELECT user_id FROM orders renvoie les ids de tous les utilisateurs qui ont passé une commande (1 et 3). Ensuite, NOT IN les exclut, et il ne reste que ceux qui n’ont jamais commandé (Mello et Dan).

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION