Documentation PostgreSQL 8.3.23 > Langage SQL > Fonctions et opĂ©rateurs > Expressions de sous-requĂȘtes | |
![]() |
Comparaisons de
lignes et de tableaux![]() |
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).
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);
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.
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.
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.
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.
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.