Une caractéristique puissante de SQL est la possibilité qu'un
critère de
recherche employé dans une clause WHERE (expression à droite d'un
opérateur
de comparaison) soit lui-même le résultat d'un SELECT ; c'est ce qu'on appelle
une sous-interrogation.
Exemple :
Quels sont les employés ayant la même fonction que CODD?
Remarques
une sous-interrogation qui ne ramène aucune ligne se termine avec
un code d'erreur.
une sous-interrogation ramenant plusieurs lignes provoquera aussi,
dans ce cas, une erreur (pour traiter correctement ce cas, voir paragraphe
ci-dessous)
Une sous-interrogation peut ramener plusieurs lignes à condition que
l'opérateur de comparaison admette à sa droite un ensemble de valeurs.
Les opérateurs permettant de comparer une valeur à un ensemble de valeurs
sont :
l'opérateur IN
les opérateurs
obtenus en ajoutant
ANY ou ALL à la suite d'un opérateur de
comparaison classique (=, !=, >, >=, <,
<=)
ANY: la comparaison est vraie si
elle est vraie pour au moins un
des éléments de l'ensemble.
ALL: la comparaison sera vraie si
elle est vraie pour tous les éléments de
l'ensemble.
Exemple :
Quels sont les employés gagnant plus que tous les
employés du département 30.
Il est possible de comparer le résultat d'un SELECT ramenant plusieurs colonnes à une
liste de colonnes. La liste de colonnes figurera entre parenthèses à
gauche de l'opérateur de comparaison.
Exemple :
Quels sont les employés ayant même fonction et même supérieur que
CODD?
Dans les exemples précédents, la sous-interrogation était évaluée d'abord,
puis le résultat pouvait être utilisé pour exécuter l'interrogation
principale. SQL sait également traiter une sous-interrogation faisant
référence à une colonne de la table de l'interrogation principale. Le
traitement dans ce cas est plus complexe car il faut évaluer la
sous-interrogation pour chaque ligne de l'interrogation principale.
Exemple :
Quels sont les employés ne travaillant pas dans le même département que
leur supérieur hiérarchique.
Il a fallu ici renommer la table emp de l'interrogation
principale pour
pouvoir la référencer dans la sous-interrogation.
n_sup IS NOT NULL est nécessaire car dans
le cas de JOUBERT la
colonne n_sup est NULL
et la sous-requête ne ramène alors aucune valeur.