IN est un opérateur qui vérifie si une valeur fait partie d'un ensemble de valeurs, c'est l'équivalent de l'opérateur mathématique que l'on note ∈.
Il fonctionne ainsi : valeur IN (ensemble de valeurs)
, il renvoie un booléen (vrai ou faux). La valeur à gauche de l'opérateur IN et les valeurs à droite de l'opérateur IN doivent être du même type.
Par exemple, quels élèves ont une adresse électronique chez Microsoft ?
Eleve | usr_email |
Romain Bonvalot | nikanoru_du_84@hotmail.com |
Florent Luck | luckflorent@hotmail.fr |
Johan Morales | championut@hotmail.com |
Cédric Torres | ced.torres@hotmail.fr |
Romain Dumas | zenenbru@hotmail.com |
Nicolas Bessac | tarba_supreme84@hotmail.com |
Yann Triboulat | dj_farfade@hotmail.com |
Arnaud Taelman | shinryu_666@hotmail.com |
Thomas Vivien | le_bastidon_chartrain@hotmail.com |
... | ... |
Exemple fictif : quels produits sont de catégorie "Bureautique" ou "SGBDR" ?
Ce qui simplifie la formulation suivante, complètement équivalente :
Toutes les questions sont basées sur le schéma relationnel suivant. Vous devrez écrire les requêtes SQL qui donnent le résultat demandé.
Donnez les clients qui ont été facturés le 2013-06-11, le 2013-06-12 ou le 2013-06-14. Le résultat attendu est :
Donnez la liste des factures des clients 41, 42, 43 Le résultat attendu est :
La liste de valeurs peut être fournie par une requête. Par exemple, quels sont les élèves qui ont des réponses fausses aux TP dynamiques :
Eleve |
Ysser Detest |
Abdellatif HSAINI |
Alexa Strozzi |
Oualid CHAOUQI EL MOUHIB |
Quentin COUTURIAUX |
Vincent Soubrat |
Guillaume Guibal |
Baptiste Buttigieg |
Steven Jeanne |
... |
On constate que dans ce cas, le IN remplace une jointure. En effet, la requête précédente aurait pu s'écrire :
Eleve |
Ysser Detest |
Ysser Detest |
Ysser Detest |
Adrien Guillermet |
Jorys Pascal |
Benjamin Petit |
Véran Bourgues |
Maxime Reynaud |
Hugo Benmeziane |
... |
Il reste à rajouter la clause DISTINCT pour obtenir exactement la même réponse. En effet, la première version (avec IN) ne multiplie pas les réponses, alors que la deuxième (avec la jointure) oui.
Eleve |
Ysser Detest |
Adrien Guillermet |
Jorys Pascal |
Benjamin Petit |
Véran Bourgues |
Maxime Reynaud |
Hugo Benmeziane |
Yohan Buttigieg |
Thomas Collard |
... |
Grâce à une jointure, donnez la liste des clients qui ont des factures supérieures ou égales à 1000 euros. Le résultat attendu est :
Faites la même chose, mais en utilisant le IN au lieu d'utiliser une jointure. Vous devez obtenir exactement le même résultat.
Le NOT IN sert à vérifier qu'une valeur donnée n'existe pas dans une liste de valeurs.
Exemple fictif, je veux les programmes télé sauf ceux de Canal+ et de TMC :
Ce qui simplifie la formulation suivante, complètement équivalente :
Donnez la liste des clients qui habitent ni Montfavet, ni Avignon. Le résultat attendu est :
Afficher toutes les factures sauf celles du 2013-06-11, du 2013-06-12 ni du 2013-06-14. Le résultat attendu est :
Voici la formulation la plus intéressante du IN, car elle permet de nouveaux types de questions à la base de données : qui n'a pas fait ça (au sens de : qui figure dans une table et pas dans une autre). Par exemple :
La formulation de ce genre de requête, très méthodique, pose souvent des problèmes à ceux qui débutent. Prenons l'exemple "Quel élève n'a pas commencé à répondre à ce TP" et voyons la méthode :
tp_usr_id |
1 |
504 |
513 |
514 |
522 |
523 |
524 |
525 |
526 |
... |
Eleve |
Ysser Detest |
Christophe Dubuisson |
Romain Bonvalot |
Florent Luck |
Alexandre Tran |
Georges Esquirol |
Abdellatif HSAINI |
Rémi Fort |
Alexa Strozzi |
... |
On remarque que la requête principale n'a pas besoin de DISTINCT puisqu'elle ne multiplie pas les résultats (on prend des élèves dans la table user). Le DISTINCT dans la requête imbriquée est facultatif (si la liste utilisée par le NOT IN contient plusieurs fois les mêmes valeurs, ça n'a aucune incidence sur l'affichage).
Attention à bien placer chaque condition de l'énoncé. Certaines sont dans la requête principale (elles correspondent à ceux qu'on veut afficher), d'autres sont dans la requête imbriquée (elles correspondent à ce que n'ont pas fait ceux qu'on veut afficher).
Par exemple : je veux afficher les élèves de SIO1 qui n'ont pas commencé ce TP :
Eleve |
Ysser Detest |
Kaïs BOUHAMED |
Ugo BIAGETTI |
Marc-Ange BITTON |
Hanane BAJDIKH |
Sulayman BOUIMOUH |
Julian CATALIN |
Natan CHARNET |
Stan CHIARELLI |
... |
Donnez la liste des prospects, c'est à dire les clients qui n'ont jamais été facturés. Le résultat attendu est :
Donnez la liste des clients qui n'ont pas été facturés en 2013 (YEAR(date_facture)=2013
). Le résultat attendu est :
Donnez la liste des clients qui habitent Avignon (ville_client = 'avignon'
) mais qui n'ont pas été facturés en 2013. Le résultat attendu est :