PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 16.10 » Langage SQL » Fonctions et opĂ©rateurs » Expressions de sous-requĂȘtes

9.23. Expressions de sous-requĂȘtes #

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).

9.23.1. 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);
 

9.23.2. 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.

9.23.3. 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.

9.23.4. 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.

9.23.5. 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.

9.23.6. Comparaison de ligne simple #

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.