SELECT id, nom, espece_id
FROM Animal
WHERE espece_id NOT IN (
SELECT id
FROM Espece
WHERE nom_courant IN ('Tortue d''Hermann', 'Perroquet amazone')
);
Conditions avec ANY, SOME et ALL
Les conditions avec IN et NOT IN sont un peu limitées, puisqu'elles ne permettent que des comparaisons de type "est égal" ou
"est différent". Avec ANY et ALL, on va pouvoir utiliser les autres comparateurs (plus grand, plus petit, etc.).
Bien entendu, comme pour IN, il faut des sous-requêtes dont le résultat est soit une valeur, soit une colonne.
ANY : veut dire "au moins une des valeurs".
SOME : est un synonyme de ANY.
ALL : signifie "toutes les valeurs".
ANY (ou SOME)
La requête suivante signifie donc "Sélectionne les lignes de la table Animal, dont l'espece_id est inférieur à au moins une des
valeurs sélectionnées dans la sous-requête". C'est-à-dire inférieur à 3 ou à 4. Vous aurez donc dans les résultats toutes les lignes
dont l'espece_id vaut 1, 2 ou 3 (puisque 3 est inférieur à 4).
Code : SQL
SELECT *
FROM Animal
WHERE espece_id < ANY (
SELECT id
FROM Espece
WHERE nom_courant IN ('Tortue d''Hermann', 'Perroquet amazone')
);
ALL
Par contre, si vous utilisez ALL plutôt que ANY, cela signifiera "Sélectionne les lignes de la table Animal, dont l'espece_id est
inférieur à toutes les valeurs sélectionnées dans la sous-requête". Donc inférieur à 3 et à 4. Vous n'aurez donc plus que les lignes
dont l'espece_id vaut 1 ou 2.
Code : SQL
SELECT *
FROM Animal
WHERE espece_id < ALL (
SELECT id
FROM Espece
WHERE nom_courant IN ('Tortue d''Hermann', 'Perroquet amazone')
);
Remarque : lien avec IN
Remarquez que = ANY est l'équivalent de IN, tandis que <> ALL est l'équivalent de NOT IN. Attention cependant que ANY et
ALL (et SOME) ne peuvent s'utiliser qu'avec des sous-requêtes, et non avec des valeurs comme on peut le faire avec IN.
On ne peut donc pas faire ceci :
Partie 2 : Index, jointures et sous-requêtes
119/414
www.openclassrooms.com
Précédent

- 119/413

Suivant