Attention, il est impératif que la sous-requête ne renvoie qu'une seule ligne. Dans le cas contraire, la requête échouera.
Conditions avec IN et NOT IN
IN
Vous connaissez déjà l'opérateur IN, qui compare une colonne avec une liste de valeurs.
Exemple
Code : SQL
SELECT Animal.id, Animal.nom, Animal.espece_id
FROM Animal
INNER JOIN Espece
ON Espece.id = Animal.espece_id
WHERE Espece.nom_courant IN ('Tortue d''Hermann', 'Perroquet
amazone');
Cet opérateur peut également s'utiliser avec une sous-requête dont le résultat est une colonne ou une valeur. On peut donc
réécrire la requête ci-dessus en utilisant une sous-requête plutôt qu'une jointure :
Code : SQL
SELECT id, nom, espece_id
FROM Animal
WHERE espece_id IN (
SELECT id
FROM Espece
WHERE nom_courant IN ('Tortue d''Hermann', 'Perroquet amazone')
);
Le fonctionnement est plutôt facile à comprendre. La sous-requête donne les résultats suivants :
Code : SQL
SELECT id
-- On ne sélectionne bien qu'UNE SEULE
COLONNE.
FROM Espece
WHERE nom_courant IN ('Tortue d''Hermann', 'Perroquet amazone');
id
3
4
Ainsi, la requête principale sélectionnera les lignes qui ont un espece_id parmi ceux renvoyés par la sous-requête, donc 3 ou 4.
NOT IN
Si l'on utilise NOT IN, c'est bien sûr le contraire, on exclut les lignes qui correspondent au résultat de la sous-requête. La
requête suivante nous renverra donc les animaux dont l'espece_id n'est pas 3 ou 4.
Code : SQL
Partie 2 : Index, jointures et sous-requêtes
118/414
www.openclassrooms.com
Conditions avec IN et NOT IN
IN
Vous connaissez déjà l'opérateur IN, qui compare une colonne avec une liste de valeurs.
Exemple
Code : SQL
SELECT Animal.id, Animal.nom, Animal.espece_id
FROM Animal
INNER JOIN Espece
ON Espece.id = Animal.espece_id
WHERE Espece.nom_courant IN ('Tortue d''Hermann', 'Perroquet
amazone');
Cet opérateur peut également s'utiliser avec une sous-requête dont le résultat est une colonne ou une valeur. On peut donc
réécrire la requête ci-dessus en utilisant une sous-requête plutôt qu'une jointure :
Code : SQL
SELECT id, nom, espece_id
FROM Animal
WHERE espece_id IN (
SELECT id
FROM Espece
WHERE nom_courant IN ('Tortue d''Hermann', 'Perroquet amazone')
);
Le fonctionnement est plutôt facile à comprendre. La sous-requête donne les résultats suivants :
Code : SQL
SELECT id
-- On ne sélectionne bien qu'UNE SEULE
COLONNE.
FROM Espece
WHERE nom_courant IN ('Tortue d''Hermann', 'Perroquet amazone');
id
3
4
Ainsi, la requête principale sélectionnera les lignes qui ont un espece_id parmi ceux renvoyés par la sous-requête, donc 3 ou 4.
NOT IN
Si l'on utilise NOT IN, c'est bien sûr le contraire, on exclut les lignes qui correspondent au résultat de la sous-requête. La
requête suivante nous renverra donc les animaux dont l'espece_id n'est pas 3 ou 4.
Code : SQL
Partie 2 : Index, jointures et sous-requêtes
118/414
www.openclassrooms.com
