Maison > base de données > tutoriel mysql > Sous-requêtes MySQL/MariaDB : pourquoi le comportement ORDER BY change-t-il dans les versions plus récentes ?

Sous-requêtes MySQL/MariaDB : pourquoi le comportement ORDER BY change-t-il dans les versions plus récentes ?

DDD
Libérer: 2024-12-31 12:59:17
original
844 Les gens l'ont consulté

MySQL/MariaDB Subqueries: Why Does ORDER BY Behavior Change in Newer Versions?

MySQL/MariaDB : Trier par dans les sous-requêtes

Les versions récentes de MySQL et MariaDB ont introduit des changements dans la gestion de la commande par opérations dans les sous-requêtes.

Original Requête :

SELECT t2.Code from (select Country.Code from Country order by Country.Code desc ) AS t2;
Copier après la connexion

Problème :

Dans MySQL 5.5 et versions antérieures, la requête ci-dessus triait les résultats de la sous-requête par ordre décroissant comme spécifié. Cependant, dans les versions plus récentes de MySQL et MariaDB, les résultats des sous-requêtes ne sont plus triés par défaut par ordre décroissant.

Raison :

Le changement de comportement est dû à une respect de la norme SQL. Selon la norme, les résultats des sous-requêtes sont des ensembles de lignes non ordonnés. Par conséquent, l'application d'une clause order by dans une sous-requête peut ne pas garantir le tri souhaité.

Résolution :

Pour résoudre le problème, deux approches sont recommandées :

  • Ordre le plus externe par : Appliquer la clause order by au SELECT le plus externe déclaration :
SELECT t2.Code from (select Country.Code from Country) AS t2 ORDER BY t2.Code DESC;
Copier après la connexion
  • Limite dans la sous-requête : Si nécessaire, spécifiez une limite dans la sous-requête :
SELECT t2.Code from (select Country.Code from Country ORDER BY Country.Code DESC LIMIT 2) AS t2;
Copier après la connexion

Ceci garantit que la sous-requête produit un ensemble de résultats triés, qu'une clause order by soit appliquée ou non à la requête la plus externe. SELECT.

Comportement documenté :

MariaDB a officiellement documenté ce comportement, déclarant que la spécification d'une clause order by dans une sous-requête n'est pas autorisée par la norme SQL et devrait être traité comme un ensemble non ordonné de lignes. L'approche recommandée consiste à appliquer l'ordre par à la requête la plus externe ou à utiliser une limite si nécessaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal