Explication :
Il est important de comprendre comment cela fonctionne pour éviter les "gotchas" dans des cas d'utilisation similaires. Notez que union
La syntaxe de l'article est quelque peu "spéciale" :
<em>sous-statut </em>union all
<em>sous-statut </em>union all
<em>sous-statut </em> [ order by
-clause] [ limit
-clause]
où " sous-statut "peut éventuellement être entouré de (
y )
. Quelques exemples concrets :
- select 1 union all (select 2);
select 1 union all select 2 union all (select 3);
select 1 union all (select 2) union all select 3;
select 1 union all (select 2) union all (select 3);
select 1 union all (select 2) union all (select 3) union all select 4;
select 1 union all (select 2) union all select 3 union all (select 4);
Cependant si vous entourez le premier " sous-statut " avec un appareil dentaire, vous doit entourent tous les autres " sous-statut "s" avec des accolades :
- (select 1) union all (select 2) union all (select 3);
(A noter que le point ci-dessus n'est pas mentionné dans le document documents officiels .)
Ne pas le faire est une erreur de syntaxe :
- mysql> (select 1) union all select 2; -- error because not all "substatement"s are braced
ERROR 1064 (42000): You have an error in your SQL syntax; check the...
mysql> (select 1) union all (select 2) union all select 3; -- error because not all "substatement"s are braced
ERROR 1064 (42000): You have an error...
mysql> (select 1) union all select 2 union all (select 3); -- error because not all "substatement"s are braced
ERROR 1064 (42000): You have an error...
Ensuite, chaque " sous-statut "peut contenir where
, group by
, having
, join
, limit
mais pas order by
.
Si vous souhaitez utiliser order by
le " sous-statut "qui contient order by
doit être entouré d'accolades. (Ce qui signifie qu'elles ne sont plus facultatives).
Maintenant, si nous regardons à nouveau la syntaxe :
<em>sous-statut </em>union all
<em>sous-statut </em>union all
<em>sous-statut </em> [ order by
-clause] [ limit
-clause]
nous pouvons voir que l'ensemble de la union
se termine par une option order by
/ limit
. Ces deux mots-clés s'appliquent à l'ensemble du union
et pas seulement le dernier " sous-statut " :
Nous avons mentionné précédemment que le limit
Le mot-clé peut également être appliqué à des " sous-statut "s :
Si vous voulez appliquer limit
jusqu'au dernier " sous-statut "(par opposition à l'ensemble du union
déclaration), vous doit entourent le dernier " sous-statut " avec des accolades :
Pour postuler limit
jusqu'au dernier " sous-statut " et aussi à l'ensemble du union
déclaration, utiliser :
C'est la même chose avec order by
:
Mais notez qu'en appliquant order by
à " sous-statut "s est inutile parce que les docs ont explicitement a déclaré que order by
est seulement garanti ( cf. ) pour fonctionner lorsqu'il est appliqué à l'ensemble de la union
déclaration :
-§- ..l'utilisation de ORDER BY
pour les particuliers SELECT
Les déclarations n'impliquent rien quant à l'ordre dans lequel les lignes apparaissent dans le résultat final .
Le seul moyen order by
aurait un sens dans un " sous-statut "est si vous le combinez avec limit
:
-§- l'utilisation de ORDER BY dans ce contexte est typiquement en conjonction avec LIMIT
afin qu'il soit utilisé pour déterminer le sous-ensemble des lignes sélectionnées à récupérer pour l'opération de recherche. SELECT
même si elle n'est pas nécessairement l'ordre de ces lignes dans la version finale. UNION
résultat.
Aussi, si vous voulez combiner select **_into_**
con union
il y aura plus de "gotchas" à surveiller. Voir numéro 32858 à ce sujet.