14.1.8 Sous-sélections ( SubSELECT )
14.1 Manipulation de données : SELECT , INSERT , UPDATE , DELETE
14 Syntaxe des commandes SQL
Manuel de Référence MySQL 4.1 : Version Française
. Les sous-requêtes comme opérateur scalaire . Comparaisons avec les sous-requêtes . Sous-requêtes avec les clauses ANY , IN et SOME ->Sous-requêtes avec ALL . Sous-requêtes corrélées . EXISTS et NOT EXISTS . Sous-requêtes de ligne . Sous-requêtes dans la clause FROM . Erreurs de sous-requêtes . Optimisation des sous-requêtes . Se passer des sous-requêtes avec les premières versions de MySQL
|
14.1.8.4 Sous-requêtes avec ALL Syntaxe :
<operand> <comparison operator> ALL (<subquery>)
|
Le mot
ALL
, qui doit suivre immédiatement l'opérateur de comparaison, signifie
``retourne
TRUE
si la comparaison est
TRUE
pour
TOUTES
les
lignes que la sous-requête retourne''.Par exemple :
SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);
|
Supposons qu'il y ait une ligne dans la table
t1
contenant {10}.
L'expression est
TRUE
si la table
t2
contient {-5,0,+5}
car les trois valeurs de
t2
sont inférieures à 10.
L'expression est
FALSE
si la table
t2
contient
{12,6,
NULL
,-100} car il y a une des valeurs de la table
t2
,
ici 12, qui est plus grande que 10.
L'expression est
UNKNOWN
si la table
t2
contient {0,
NULL
,1}.Finalement, si la table
t2
est vide, le résultat est
TRUE
.
Vous pouvez pensez que le résultat doit être indéterminé (
UNKNOWN
), mais
c'est bien
TRUE
. Ce qui fait que, bizarrement,
SELECT * FROM t1 WHERE 1 > ALL (SELECT s1 FROM t2);
|
est
TRUE
si la table
t2
est vide, mais
SELECT * FROM t1 WHERE 1 > (SELECT s1 FROM t2);
|
est
UNKNOWN
si la table
t2
est vide. De plus,
SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2);
|
est
UNKNOWN
si la table
t2
est vide.
En général,
les tables avec des
NULL
et les
tables vides
sont
des cas particuliers
: lorsque vous écrivez vos sous-requêtes, pensez
bien à les prendre en compte.
|