Cette section dĂ©crit les expressions de sous-requĂȘtes, compatible SQL, et disponible dans PostgreSQL. Toutes les formes d'expression documentĂ©es dans cette section renvoient des rĂ©sultats boolĂ©ens (true/false).
EXISTS
#EXISTS (subquery
)
L'argument de EXISTS
est une requĂȘte
SELECT
arbitraire ou une
sous-requĂȘte. La sous-requĂȘte est Ă©valuĂ©e pour
déterminer si elle renvoie des lignes. Si elle renvoie au moins une ligne,
le résultat de EXISTS
est « true » ; si la
sous-requĂȘte ne renvoie aucune ligne, le rĂ©sultat de EXISTS
est « false ».
La sous-requĂȘte peut faire rĂ©fĂ©rence Ă des variables provenant de la requĂȘte englobante, qui agira comme constantes lors de toute Ă©valuation de la sous-requĂȘte.
La sous-requĂȘte s'exĂ©cutera seulement suffisamment longtemps pour dĂ©terminer qu'au moins une ligne sera renvoyĂ©e. Elle ne sera donc pas exĂ©cutĂ© entiĂšrement. Il est dĂ©conseillĂ© d'Ă©crire une sous-requĂȘte qui a des effets secondaires (tels qu'appeler des fonctions de sĂ©quence) le fait que les effets secondaires surviennent n'est pas prĂ©visible.
Comme le résultat dépend seulement du fait que des lignes sont renvoyées ou
pas, et non pas sur le contenu de ces lignes, la liste en sortie de la
sous-requĂȘte n'a pas d'importance. Une convention commune de codage est
d'écrire tous les tests EXISTS
sous la forme
EXISTS(SELECT 1 WHERE ...)
. Il existe néanmoins des
exceptions Ă cette rĂšgle, comme les sous-requĂȘtes qui utilisent
INTERSECT
.
Cet exemple simple est comme une jointure interne sur
col2
, mais il produit au plus une ligne pour chaque
ligne de tab1
, mĂȘme s'il existe plus lignes
correspondantes dans tab2
:
SELECT col1 FROM tab1 WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
IN
#expression
IN (subquery
)
Le cĂŽtĂ© droit est une sous-requĂȘte entre parenthĂšses, qui doit renvoyer
exactement une ligne. L'expression cĂŽtĂ© gauche est Ă©valuĂ©e et comparĂ©e Ă
chaque ligne du rĂ©sultat de la sous-requĂȘte. Le rĂ©sultat de
IN
vaut « true » si au moins une ligne identique
est trouvĂ©e dans la sous-requĂȘte. Le rĂ©sultat est « false » si
aucune ligne identique n'a Ă©tĂ© trouvĂ©e (y compris dans le cas oĂč la
sous-requĂȘte ne renvoie aucune ligne).
Notez que si l'expression cÎté gauche renvoie NULL ou s'il y a aucune
valeur identique cÎté droit et au moins une ligne renvoyant NULL cÎté
droit, le résultat de la construction IN
sera NULL, et non
pas false. Ceci est en accord avec les rĂšgles normales du SQL pour les
combinaisons booléennes de valeurs NULL.
Comme avec EXISTS
, il est déconseillé de supposer que la
sous-requĂȘte sera complĂštement Ă©valuĂ©e.
row_constructor
IN (subquery
)
Le cÎté gauche de cette syntaxe de IN
est un constructeur de
ligne, comme décrit dans Section 4.2.13. Le
cĂŽtĂ© droit est une sous-requĂȘte entre parenthĂšses, qui doit renvoyer
exactement autant de colonnes qu'il y a d'expressions cÎté gauche. Les
expressions du cĂŽtĂ© gauche sont Ă©valuĂ©es et comparĂ©es, ligne par ligne, Ă
chaque ligne du rĂ©sultat de la sous-requĂȘte. Le rĂ©sultat de
IN
vaut « true » si au moins une ligne identique
est trouvĂ©e dans la sous-requĂȘte. Le rĂ©sultat est « false » si
aucune ligne identique n'est trouvĂ©e (y compris le cas oĂč la sous-requĂȘte
ne renvoie aucune ligne).
Comme d'habitude, les valeurs NULL dans les lignes sont combinées par les
rÚgles habituelles des expressions SQL booléennes. Deux lignes sont
considérées égales si tous leurs membres correspondance sont non NULL et
égaux ; les lignes ne sont pas égales si au moins un membre
correspondant est non NULL et différent ; sinon le résultat de cette
comparaison de ligne est inconnue (NULL). Si tous les résultats ligne par
ligne sont soit différents soit NULL, avec au moins un NULL, alors le
résultat de IN
est NULL.
NOT IN
#expression
NOT IN (subquery
)
Le cĂŽtĂ© droit est une sous-requĂȘte entre parenthĂšses, qui doit renvoyer
exactement une colonne. L'expression cĂŽtĂ© gauche est Ă©valuĂ©e et comparĂ©e Ă
chaque ligne du rĂ©sultat de la sous-requĂȘte. Le rĂ©sultat de NOT
IN
vaut « true » si seulement des lignes différentes
sont trouvĂ©es dans la sous-requĂȘte (y compris dans le cas oĂč la
sous-requĂȘte ne renvoie pas de lignes). Le rĂ©sultat vaut
« false » si au moins une ligne identique est trouvée.
Notez que si l'expression cÎté gauche renvoie NULL ou s'il n'existe pas de
valeurs identiques cÎté droit et qu'au moins une ligne cÎté droit renvoie
NULL, le résultat de la construction NOT IN
sera NULL, et
non pas true. Ceci est en accord avec les rĂšgles standards du SQL pour les
combinaisons booléennes de valeurs NULL.
Tout comme EXISTS
, il est déconseillé de supposer que la
sous-requĂȘte sera totalement Ă©valuĂ©e.
row_constructor
NOT IN (subquery
)
Le cÎté gauche de cette syntaxe pour NOT IN
est un
constructeur de lignes, comme dĂ©crit dans Section 4.2.13. Le cĂŽtĂ© droit est une sous-requĂȘte
entre parenthĂšses, qui doit renvoyer exactement autant de colonnes qu'il y
a d'expressions du cÎté gauche. Les expressions du cÎté gauche sont
évaluées et comparées ligne par ligne pour chaque ligne du résultat de la
sous-requĂȘte. Le rĂ©sultat de NOT IN
vaut « true »
si seules des lignes diffĂ©rentes sont trouvĂ©es dans la sous-requĂȘte (y
compris dans le cas oĂč la sous-requĂȘte ne renvoie aucune ligne). Le
résultat vaut « false » si aucune ligne identique n'est trouvée.
Comme d'habitude, les valeurs NULL dans les lignes sont combinées d'aprÚs
les rÚgles standards en SQL pour les expressions booléennes. Deux lignes
sont considérées identiques si tous leurs membres correspondant sont non
NULL et égaux ; les lignes sont différentes si au moins un membre
correspondant est non NULL et différent ; sinon le résultat de cette
comparaison de lignes est inconnu (NULL). Si tous les résultats ligne par
ligne sont soit différentes soit NULL, avec au moins un NULL, alors le
résultat de NOT IN
is NULL.
ANY
/SOME
#expression
operator
ANY (subquery
)expression
operator
SOME (subquery
)
Le cĂŽtĂ© droit est une sous-requĂȘte entre parenthĂšses, qui doit renvoyer
exactement une colonne. L'expression cĂŽtĂ© gauche est Ă©valuĂ©e et comparĂ©e Ă
chaque ligne du rĂ©sultat de la sous-requĂȘte en utilisant l'opĂ©rateur
operator
indiquée, qui doit renvoyer un résultat
booléen. Le résultat de ANY
vaut « true » si au
moins une valeur true est obtenue dans le résultat. Le résultat vaut
« false » si aucun résultat true n'est trouvé (y compris dans le
cas oĂč la sous-requĂȘte ne renvoie aucune ligne).
SOME
est un synonyme pour ANY
.
IN
est équivalent à = ANY
.
Notez qe s'il n'y a pas de succÚs et qu'au moins une ligne cÎté droit
renvoie NULL comme résultat de l'opérateur, le résultat de la construction
ANY
sera NULL, et non pas false. Ceci est en accord avec les
rÚgles SQL habituelles sur les combinaisons booléennes de valeurs NULL.
Comme avec EXISTS
, il est déconseillé de supposer que la
sous-requĂȘte sera totalement Ă©valuĂ©e.
row_constructor
operator
ANY (subquery
)row_constructor
operator
SOME (subquery
)
Le cÎté gauche de cette syntaxe de ANY
est un constructeur
de lignes, comme décrit dans Section 4.2.13.
Le cĂŽtĂ© droit est une sous-requĂȘte entre parenthĂšses, qui doit renvoyer
autant de colonnes qu'il y a d'expressions sur la ligne cÎté gauche. Les
expressions cÎté gauche sont évaluées et comparées ligne par ligne pour
chaque ligne du rĂ©sultat de la sous-requĂȘte, en utilisant l'opĂ©rateur
operator
indiqué. Le résultat de
ANY
vaut « true » si la comparaison renvoie true
pour au moins une ligne de la sous-requĂȘte. Le rĂ©sultat vaut
« false » si la comparaison renvoie false pour chaque ligne de
la sous-requĂȘte (y compris dans le cas oĂč la sous-requĂȘte ne renvoie aucune
ligne). Le résultat est NULL si aucune comparaison avec une ligne de la
sous-requĂȘte ne renvoie true, et qu'au mpoins une comparaison renvoie NULL.
Voir Section 9.24.5 pour les détails sur la signification de la comparaison d'un constructeur de ligne.
ALL
#expression
operator
ALL (subquery
)
Le cĂŽtĂ© droit est une sous-requĂȘte entre parenthĂšses, qui doit renvoyer
exactement une colonne. L'expression cĂŽtĂ© gauche est Ă©valuĂ©e, et comparĂ©e Ă
chaque ligne du rĂ©sultat de la sous-requĂȘte en utilisant l'opĂ©rateur
operator
indiqué, qui doit renvoyer un résultat
booléen. Le résultat de ALL
vaut « true » si
toutes les lignes renvoient true (y compris dans le cas oĂč la sous-requĂȘte
ne renvoie aucune ligne). Le résultat vaut « false » si un
résultat false est trouvé. Le résultat est NULL si aucune comparaison avec
une ligne de la sous-requĂȘte renvoie false et au moins une comparaison
renvoie NULL.
NOT IN
est équivalent à <> ALL
.
Comme avec EXISTS
, il est déconseillé de supposer que la
sous-requĂȘte sera totalement Ă©valuĂ©e.
row_constructor
operator
ALL (subquery
)
Le cÎté gauche de cette forme de ALL
est un constructeur de
lignes, comme décrit dans Section 4.2.13. Le
cĂŽtĂ© droit est une sous-requĂȘte entre parenthĂšses, qui doit renvoyer
exactement autant de colonnes qu'il y a d'expressions dans la ligne cÎté
gauche. Les expressions cÎté gauche sont évaluées et comparées ligne par
ligne Ă chaque ligne du rĂ©sultat de la sous-requĂȘte, en utilisant
l'opérateur operator
donné. Le résultat de
ALL
vaut « true » si la comparaison renvoie true
pour toutes les lignes de la sous-requĂȘte (y compris le cas oĂč la
sous-requĂȘte ne renvoie aucune ligne). Le rĂ©sultat est « false »
si la comparaison renvoie false pour une ligne de la sous-requĂȘte. Le
rĂ©sultat est NULL si aucune comparaison avec une ligne de la sous-requĂȘte
renvoie false et au moins une comparaison renvoie NULL.
Voir Section 9.24.5 pour les détails sur la signification d'une comparaison de constructeur de ligne.
row_constructor
operator
(subquery
)
Le cĂŽtĂ© gauche est un constructeur de lignes, comme dĂ©crit dans Section 4.2.13. Le cĂŽtĂ© droit est une sous-requĂȘte entre parenthĂšses, qui doit renvoyer exactement autant de colonnes qu'il y a d'expressions dans la ligne cĂŽtĂ© gauche. De plus, la sous-requĂȘte ne peut pas renvoyer plus d'une ligne. (Si elle renvoie zĂ©ro ligne, le rĂ©sultat est pris pour NULL.) Le cĂŽtĂ© gauche est Ă©valuĂ© et comparĂ© ligne par ligne Ă la ligne seule du rĂ©sultat de la sous-requĂȘte.
Voir Section 9.24.5 pour plus de détails sur la signification d'une comparaison de constructeur de lignes.