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 deGROUP BY
permet la liste de sélection,HAVING
condition, ouORDER BY
list pour faire référence à des colonnes non agrégées même si les colonnes ne dépendent pas fonctionnellement deGROUP 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.