Oracle
 sql >> Base de données >  >> RDS >> Oracle

Pourquoi les comportements Group By de Mysql et Group by d'Oracle sont différents

Les concepteurs de MySQL ont ajouté leur extension non standard à GROUP BY dans le but de rendre le développement plus facile et certaines requêtes plus efficaces.

Voici leur justification.

https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html

Il existe un mode serveur appelé ONLY_FULL_GROUP_BY qui désactive les extensions non standard. Vous pouvez définir ce mode à l'aide de cette instruction.

 SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'  

Voici une citation de cette page, avec emphase ajoutée.

Si ONLY_FULL_GROUP_BY est désactivé, une extension MySQL à l'utilisation SQL standard de GROUP BY permet la liste de sélection, HAVING condition, ou ORDER BY list pour faire référence à des colonnes non agrégées même si les colonnes ne dépendent pas fonctionnellement de GROUP BY colonnes... Dans ce cas, le serveur est libre de choisir n'importe quelle valeur de chaque groupe , donc à moins qu'elles ne soient identiques, les valeurs choisies sont non déterministes , ce qui n'est probablement pas ce que vous voulez.

Le mot important ici est non déterministe. Qu'est-ce que cela signifie? Cela signifie au hasard, mais en pire. Si le serveur a choisi des valeurs aléatoires, cela implique qu'il renverrait des valeurs différentes dans différentes requêtes, vous avez donc une chance de détecter le problème lorsque vous testez votre logiciel. Mais non déterministe dans ce contexte signifie que le serveur choisit la même valeur à chaque fois, jusqu'à ce qu'il ne le fasse pas.

Pourquoi pourrait-il changer la valeur qu'il choisit ? Une mise à niveau du serveur est une des raisons. Une modification de la taille du tableau pourrait en être une autre. Le fait est que le serveur est libre de renvoyer la valeur qu'il souhaite.

Je souhaite que les nouveaux apprenants SQL définissent ce ONLY_FULL_GROUP_BY mode; ils obtiendraient des résultats beaucoup plus prévisibles de leurs requêtes et le serveur rejetterait les requêtes non déterministes.