73 votes

Pourquoi MySql autorise-t-il les requêtes "groupe par" SANS fonctions d'agrégat?

Surprise, c'est une 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 est-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.1/en/server-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?

26voto

Miroslav Genev Points 116

Selon cette page (le manuel en ligne 5.0), c’est pour de meilleures performances et un meilleur confort pour les utilisateurs.

23voto

Cebjyre Points 3946

Je pense que c'était pour gérer le cas où le regroupement par un champ impliquerait que d'autres champs sont également regroupés:

 SELECT user.id, user.name, COUNT(post.*) AS posts 
FROM user 
  LEFT OUTER JOIN post ON post.owner_id=user.id 
GROUP BY user.id
 

Dans ce cas, user.name sera toujours unique par user.id. Il est donc pratique de ne pas exiger user.name dans la clause GROUP BY (bien que, comme vous le dites, il existe une marge )

3voto

Rob Farley Points 9042

Malheureusement, presque toutes les variétés SQL ont des situations où elles cassent ANSI et ont des résultats imprévisibles.

Il me semble qu’ils avaient l’intention de la traiter comme la fonction "PREMIER (Y)" de nombreux autres systèmes.

Plus que probablement, cette construction est quelque chose que l’équipe MySQL regrette, mais ne veut pas cesser de prendre en charge en raison du nombre d’applications qui se casseraient.

Rob

2voto

GL_Stephen Points 346

MySQL considère qu'il s'agit d'une colonne unique DISTINCT lorsque vous utilisez GROUP BY sans une fonction d'agrégat. Si vous utilisez d'autres options, le résultat entier doit être distinct ou vous devez utiliser des sous-requêtes, etc. La question est de savoir si les résultats sont vraiment prévisibles.

En outre, de bonnes informations sont dans ce fil .

0voto

De ce que j'ai lu dans la référence de mysql page, il est dit: "Vous pouvez utiliser cette fonction pour obtenir de meilleures performances en évitant les colonnes de tri et de regroupement. Cependant, c'est surtout utile lorsque toutes les valeurs de chaque nonaggregated colonne nom ne figure pas dans le GROUPE sont les mêmes pour chaque groupe."

Je vous suggère de lire cette page (lien vers le manuel de référence de mysql): http://dev.mysql.com/doc/refman/5.5/en//group-by-extensions.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X