Pourquoi MySQL permettent de “group by” les requêtes SANS les fonctions d'agrégation?

Surprise -- c'est parfaitement valide requête MySQL:

select X, Y from someTable group by X

Si vous avez essayé cette requête dans la base de données Oracle ou SQL Server, vous devez obtenir l'naturelles message d'erreur:

Column 'Y' is invalid in the select list because it is not contained in 
either an aggregate function or the GROUP BY clause.

Alors, comment MySQL déterminer qui Y à afficher pour chaque X? Il choisit juste un. À partir de ce que je peux dire, il choisit juste le premier il Y trouve. Le raisonnement étant, si Y n'est ni une fonction d'agrégation, ni dans la clause group by, puis en spécifiant “sélectionnez-Y” dans votre requête n'a pas de sens pour commencer. Donc, j'ai comme le moteur de base de données sera de retour ce que je veux, et vous l'aimerez.

Il y a même une configuration de MySQL paramètre pour désactiver ce “relâchement”.
http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by

Cet article mentionne même comment MySQL a été critiqué pour être ANSI-SQL non conformes à cet égard.
http://www.oreillynet.com/databases/blog/2007/05/debunking_group_by_myths.html

Ma question est: Pourquoi a été MySQL conçu de cette façon? Ce qui était leur raison d'être pour rompre avec la norme ANSI-SQL?

  • Permettez-moi de cette façon. Je vois ce choix de conception comme étant équivalent à un langage de programmation le choix de permettre et d'ignorer, de dire, de laisser "null" être à gauche de la valeur. par exemple, la valeur "null = 3". Il n'y a aucune raison de laisser cela se produire. C'est le genre d'erreur qui est toujours et dangereusement erronée.
  • non-sens, qui peut avoir été le cas avant 5.x
  • Pouvez-vous donner une référence à votre affirmation?
  • Oh, l'homme, j'ai voulu quelque chose ressemblant à ceci, tant dans SQL Server. J'ai toujours imaginé comme "je veux que la "PICKANY(col)," la fonction d'agrégation, ou mieux encore le "UNIQUEVALUE(col) de la fonction", ce qui serait d'erreur si il s'avère ne PAS être constante dans l'ensemble du groupe. J'ai tendance à utiliser "MAX(col)" comme mon "toutes les valeurs sont les mêmes, me donner la valeur" fonction d'agrégation
  • Désolé, le commentaire ci-dessus a été un rambly façon de dire "de l'OMI, la réponse serait, car cette fonctionnalité est très utile. Mais je n'ai pas de citation, autres que les "parce que je le veux'".
InformationsquelleAutor Aaron Fi | 2009-08-03