PostgreSQLLa base de données la plus sophistiquée au monde.

9.19. Expressions de sous-requĂȘtes

Cette section dĂ©crit les expressions de sous-requĂȘtes compatibles SQL disponibles sous PostgreSQLℱ. Toutes les formes d'expressions documentĂ©es dans cette section renvoient des rĂ©sultats boolĂ©ens (true/false).

9.19.1. EXISTS

EXISTS ( sous-requĂȘte )

L'argument d'EXISTS est une instruction SELECT arbitraire ou une sous-requĂȘte. La sous-requĂȘte est Ă©valuĂ©e pour dĂ©terminer si elle renvoie des lignes. Si elle en renvoie au moins une, le rĂ©sultat d'EXISTS est vrai (« true Â») ; si elle n'en renvoie aucune, le rĂ©sultat d'EXISTS est faux (« false Â»).

La sous-requĂȘte peut faire rĂ©fĂ©rence Ă  des variables de la requĂȘte englobante qui agissent comme des constantes Ă  chaque Ă©valuation de la sous-requĂȘte.

La sous-requĂȘte n'est habituellement pas exĂ©cutĂ©e plus qu'il n'est nĂ©cessaire pour dĂ©terminer si au moins une ligne est renvoyĂ©e. Elle n'est donc pas forcĂ©ment exĂ©cutĂ©e dans son intĂ©gralitĂ©. Il est de ce fait fortement dĂ©conseillĂ© d'Ă©crire une sous-requĂȘte qui prĂ©sente des effets de bord (tels que l'appel de fonctions de sĂ©quence) ; il est extrĂšmement difficile de prĂ©dire si ceux-ci se produisent.

Puisque le rĂ©sultat ne dĂ©pend que d'un Ă©ventuel retour de lignes, et pas de leur contenu, la liste des champs retournĂ©s par la sous-requĂȘte n'a normalement aucun intĂ©rĂȘt. Une convention de codage habituelle consiste Ă  Ă©crire tous les tests EXISTS sous la forme EXISTS(SELECT 1 WHERE ...). Il y a toutefois des exceptions Ă  cette rĂšgle, comme les sous-requĂȘtes utilisant INTERSECT.

L'exemple suivant, simpliste, ressemble Ă  une jointure interne sur col2 mais il sort au plus une ligne pour chaque ligne de tab1, mĂȘme s'il y a plusieurs correspondances dans les lignes de tab2 :

SELECT col1 FROM tab1
    WHERE EXISTS(SELECT 1 FROM tab2 WHERE col2 = tab1.col2);

9.19.2. IN

expression IN (sous-requĂȘte)

Le cĂŽtĂ© droit est une sous-expression entre parenthĂšses qui ne peut retourner qu'une seule colonne. L'expression de gauche est Ă©valuĂ©e et comparĂ©e Ă  chaque ligne du rĂ©sultat de la sous-requĂȘte. Le rĂ©sultat de IN est vrai (« true Â») si une ligne Ă©quivalente de la sous-requĂȘte est trouvĂ©e. Le rĂ©sultat est faux (« false Â») si aucune ligne correspondante n'est trouvĂ©e (ce qui inclut le cas spĂ©cial de la sous-requĂȘte ne retournant aucune ligne).

Si l'expression de gauche est NULL ou s'il n'existe pas de correspondance avec les valeurs du cÎté droit et qu'au moins une ligne du cÎté droit est NULL, le résultat de la construction IN est NULL, et non faux. Ceci est en accord avec les rÚgles normales du SQL pour les combinaisons booléennes de valeurs NULL.

Comme avec EXISTS, on ne peut pas assumer que la sous-requĂȘte est Ă©valuĂ©e complĂštement.

constructeur_ligne IN (sous-requĂȘte)

Le cĂŽtĂ© gauche de cette forme de IN est un constructeur de ligne comme dĂ©crit dans la Section 4.2.11, « Constructeurs de lignes Â». 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 le cĂŽtĂ© gauche. Les expressions cĂŽtĂ© gauche sont Ă©valuĂ©es et comparĂ©es ligne Ă  ligne au rĂ©sultat de la sous-requĂȘte. Le rĂ©sultat de IN est vrai (« true Â») si une ligne Ă©quivalente de la sous-requĂȘte est trouvĂ©e. Le rĂ©sultat est faux (« false Â») si aucune ligne correspondante n'est trouvĂ©e (ce qui inclut le cas spĂ©cial de la sous-requĂȘte ne retournant aucune ligne).

Comme d'habitude, les valeurs NULL dans les lignes sont combinĂ©es suivant les rĂšgles habituelles des expressions boolĂ©ennes SQL. Deux lignes sont considĂ©rĂ©es Ă©gales si tous leurs membres correspondant sont non nuls et Ă©gaux ; les lignes diffĂšrent si le contenu de leurs membres sont non nuls et diffĂ©rents ; sinon le rĂ©sultat de la comparaison de la ligne est inconnu, donc nul. Si tous les rĂ©sultats par lignes sont diffĂ©rents ou nuls, avec au moins un NULL, alors le rĂ©sultat de IN est nul.

9.19.3. NOT IN

expression NOT IN (sous-requĂȘte)

Le cĂŽtĂ© droit est une sous-requĂȘte entre parenthĂšses, qui doit retourner exactement une colonne. L'expression de gauche est Ă©valuĂ© et comparĂ©e Ă  chaque ligne de rĂ©sultat de la sous-requĂȘte. Le rĂ©sultat de NOT IN n'est « true Â» que si des lignes diffĂ©rentes de la sous-requĂȘte sont trouvĂ©es (ce qui inclut le cas spĂ©cial de la sous-requĂȘte ne retournant pas de ligne). Le rĂ©sultat est « false Â» si une ligne Ă©gale est trouvĂ©e.

Si l'expression de gauche est nulle, ou qu'il n'y a pas de valeur égale à droite et qu'au moins une ligne de droite est nulle, le résultat du NOT IN est nul, pas vrai. Cela concorde avec les rÚgles normales du SQL pour les combinaisons bouléennes de valeurs nulles.

Comme pour EXISTS, on ne peut assumer que la sous-requĂȘte est Ă©valuĂ©e dans son intĂ©gralitĂ©.

constructeur_ligne NOT IN (sous-requĂȘte)

Le cĂŽtĂ© gauche de cette forme de NOT IN est un constructeur de lignes, comme dĂ©crit dans la Section 4.2.11, « Constructeurs de lignes Â». 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 de gauche. Les expressions de gauche sont Ă©valuĂ©es et comparĂ©e ligne Ă  ligne au rĂ©sultat de la sous-requĂȘte. Le rĂ©sultat de NOT IN n'est vrai (« true Â») que si seules des lignes diffĂ©rentes de la sous-requĂȘte sont trouvĂ©es (ce qui inclut le cas spĂ©cial de la sous-requĂȘte ne retournant aucune ligne). Le rĂ©sultat est faux (« false Â») si une ligne Ă©gale est trouvĂ©e.

Comme d'habitude, les valeurs nulles des lignes sont combinĂ©es en accord avec les rĂšgles normales des expressions boulĂ©ennes SQL. Deux lignes sont considĂ©rĂ©es Ă©gales si tous leurs membres correspondants sont non-nuls et Ă©gaux ; les lignes sont diffĂ©rentes si les membres correspondants sont non-nuls et diffĂ©rents ; dans tous les autres cas, le rĂ©sultat de cette comparaison de ligne est inconnu (nul). Si tous les rĂ©sultats par ligne sont diffĂ©rents ou nuls, avec au minimum un nul, alors le rĂ©sultat du NOT IN est nul.

9.19.4. ANY/SOME

expression opĂ©rateur ANY (sous-requĂȘte)
expression opĂ©rateur SOME (sous-requĂȘte)

Le cĂŽtĂ© droit est une sous-requĂȘte entre parenthĂšses qui ne doit retourner qu'une seule colonne. L'expression du cĂŽtĂ© gauche est Ă©valuĂ©e et comparĂ©e Ă  chaque ligne du rĂ©sultat de la sous-requĂȘte Ă  l'aide de l'opĂ©rateur indiquĂ©, ce qui doit aboutir Ă  un rĂ©sultat boolĂ©en. Le rĂ©sultat de ANY est vrai (« true Â») si l'un des rĂ©sultats est vrai. Le rĂ©sultat est faux (« false Â») si aucun rĂ©sultat vrai n'est trouvĂ© (ce qui inclut le cas spĂ©cial de la requĂȘte ne retournant aucune ligne).

SOME est un synonyme de ANY. IN est équivalent à = ANY.

En l'absence de succÚs, mais si au moins une ligne du cÎté droit conduit à NULL avec l'opérateur, le résultat de la construction ANY est nul et non faux. Ceci est en accord avec les rÚgles standard SQL pour les combinaisons booléenne de valeurs NULL.

Comme pour EXISTS, on ne peut assumer que la sous-requĂȘte est Ă©valuĂ©e entiĂšrement.

constructeur_ligne operator ANY (sous-requĂȘte)
constructeur_ligne operator SOME (sous-requĂȘte)

Le cĂŽtĂ© gauche de cette forme ANY est un constructeur de ligne, tel que dĂ©crit dans la Section 4.2.11, « Constructeurs de lignes Â». 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 de gauche. Les expressions du cĂŽtĂ© gauche sont Ă©valuĂ©es et comparĂ©es ligne Ă  ligne au rĂ©sultat de la sous-requĂȘte Ă  l'aide de l'opĂ©rateur donnĂ©. Le rĂ©sultat de ANY est « true Â» si la comparaison renvoie true pour une ligne quelconque de la sous-requĂȘte. Le rĂ©sultat est « false Â» si la comparaison renvoie false pour chaque ligne de la sous-requĂȘte (ce qui inclut le cas spĂ©cial de la sous-requĂȘte ne retournant aucune ligne). Le rĂ©sultat est NULL si la comparaison ne renvoie true pour aucune ligne, et renvoie NULL pour au moins une ligne.

Voir Section 9.20.5, « Comparaison de lignes entiĂšres Â» pour la signification dĂ©taillĂ©e d'une comparaison ligne Ă  ligne.

9.19.5. ALL

expression opérateur ALL
(sous-requĂȘte)

Le cĂŽtĂ© droit est une sous-requĂȘte entre parenthĂšses qui ne doit renvoyer qu'une seule colonne. L'expression gauche est Ă©valuĂ©e et comparĂ©e Ă  chaque ligne du rĂ©sultat de la sous-requĂȘte Ă  l'aide de l'opĂ©rateur, ce qui doit renvoyer un rĂ©sultat boolĂ©en. Le rĂ©sultat de ALL est vrai (« true Â») si toutes les lignes renvoient true (ce qui inclut le cas spĂ©cial de la sous-requĂȘte ne retournant aucune ligne). Le rĂ©sultat est faux (« false Â») si un rĂ©sultat faux est dĂ©couvert. Le rĂ©sultat est NULL si la comparaison ne renvoie false pour aucune ligne, mais NULL pour au moins une ligne.

NOT IN est équivalent à <> ALL.

Comme pour EXISTS, on ne peut assumer que la sous-requĂȘte est Ă©valuĂ©e entiĂšrement.

constructeur_ligne opĂ©rateur ALL (sous-requĂȘte)

Le cĂŽtĂ© gauche de cette forme de ALL est un constructeur de lignes, tel que dĂ©crit dans la Section 4.2.11, « Constructeurs de lignes Â». Le cĂŽtĂ© droit est une sous-requĂȘte entre parenthĂšses qui doit renvoyer exactement le mĂȘme nombre de colonnes qu'il y a d'expressions dans la colonne de gauche. Les expressions du cĂŽtĂ© gauche sont Ă©valuĂ©es et comparĂ©es ligne Ă  ligne au rĂ©sultat de la sous-requĂȘte Ă  l'aide de l'opĂ©rateur donnĂ©. Le rĂ©sultat de ALL est « true Â» si la comparaison renvoie true pour toutes les lignes de la sous-requĂȘte (ce qui inclut le cas spĂ©cial de la sous-requĂȘte ne retournant aucune ligne). Le rĂ©sultat est « false Â» si la comparaison renvoie false pour une ligne quelconque de la sous-requĂȘte. Le rĂ©sultat est NULL si la comparaison ne renvoie false pour aucune ligne de la sous-requĂȘte, mais NULL pour au moins une ligne.

Voir Section 9.20.5, « Comparaison de lignes entiĂšres Â» pour la signification dĂ©taillĂ©e d'une comparaison ligne Ă  ligne.

9.19.6. Comparaison de lignes

constructeur_ligne opĂ©rateur (sous-requĂȘte)

Le cĂŽtĂ© gauche est un constructeur de lignes, tel que dĂ©crit dans la Section 4.2.11, « Constructeurs de lignes Â». 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. De plus, la sous-requĂȘte ne peut pas renvoyer plus d'une ligne. (Si elle ne renvoie aucune ligne, le rĂ©sultat est considĂ©rĂ© nul.) Le cĂŽtĂ© gauche est Ă©valuĂ© et comparĂ© ligne complĂšte avec la ligne de rĂ©sultat de la sous-requĂȘte.

Voir Section 9.20.5, « Comparaison de lignes entiĂšres Â» pour plus de dĂ©tails sur la signification d'une comparaison ligne Ă  ligne.