Pourquoi ai-je besoin de spécifier explicitement toutes les colonnes dans un SQL « GROUP BY » clause - pourquoi pas « GROUP BY * »?

StackOverflow https://stackoverflow.com/questions/2777235

Question

Ce qui m'a toujours dérangé - pourquoi la clause GROUP BY dans une instruction SQL exigent que toutes les colonnes inclure non agrégées? Ces colonnes devraient être inclus par défaut - une sorte de « GROUP BY * » - puisque je ne peux pas courir, même la requête à moins qu'ils sont tous inclus. Chaque colonne doit soit être un agrégat ou être spécifié dans le « GROUP BY », mais il semble que rien ne devrait être automatiquement agrégé groupé.

Peut-être que cela fait partie de la norme ANSI-SQL, mais tout de même, je ne comprends pas pourquoi. aider quelqu'un peut me comprendre la nécessité de cette convention?

Était-ce utile?

La solution

Il est difficile de savoir exactement ce que les concepteurs du langage SQL ont pensé quand ils ont écrit la norme, mais voici mon opinion .

SQL, en règle générale, vous oblige à indiquer explicitement vos attentes et votre intention. La langue ne cherche pas à « deviner ce que vous vouliez dire » , et remplir automatiquement les blancs. Ceci est une chose bonne .

Lorsque vous écrivez une requête le plus important est que donne des résultats corrects . Si vous avez fait une erreur, il est probablement préférable que l'analyseur SQL informe vous, plutôt que de faire une estimation de votre intention et le retour des résultats qui peuvent ne pas être correcte. La nature déclarative de SQL (où vous déclarez ce que vous voulez récupérer plutôt que les étapes comment récupérer) fait déjà, il est facile de faire des erreurs par inadvertance. Présentation fuzziniess dans la syntaxe du langage ne serait pas en faire mieux .

En fait, tous les cas, je peux penser à où la langue permet de raccourcis a causé des problèmes. Prenez, par exemple, les jointures naturelles - où vous pouvez omettre les noms des colonnes que vous souhaitez rejoindre sur la base de données et permettre de les déduire en fonction des noms de colonne. Une fois que les noms de colonnes changent (comme ils le font naturellement au fil du temps) - la sémantique des requêtes existantes change avec eux . Ce qui est mauvais ... très mauvais -. Vous ne voulez vraiment pas ce genre de magic qui se passe dans les coulisses de votre code de base de données

Une conséquence de ce choix de conception, cependant, est que SQL est un bavard langue dans laquelle vous devez explicitement exprimer votre intention. Cela peut entraîner de devoir écrire plus de code que vous pouvez aimer et gripe de savoir pourquoi certaines constructions sont si bavard ... mais à la fin de la journée -. il est ce qu'il est

Autres conseils

Il est simple comme ceci: vous avez demandé à un groupe sql les résultats par chaque seule colonne dans la clause, ce qui signifie pour chaque colonne dans la clause SQL, le moteur sql groupe en interne les jeux de résultats avant de le présenter à vous . Alors, ce qui explique pourquoi il vous demande de mentionner toutes les colonnes présentes dans le de trop parce que son groupe ne peut partiellement. Si vous avez mentionné le groupe par clause est seulement possible de réaliser sql votre intention en regroupant toutes les colonnes aussi bien. Il est une restriction mathématique.

La seule raison logique que je peux penser à garder la clause de GROUP BY comme il est que vous pouvez inclure des champs qui ne sont pas inclus dans votre colonne de sélection dans votre groupe.

Par exemple.

Select column1, SUM(column2) AS sum
 FROM table1
 GROUP BY column1, column3

Même si colonne3 se retrouve pas ailleurs dans la requête, vous pouvez toujours grouper les résultats par la valeur de lui. (Bien sûr, une fois que vous avez fait cela, vous ne pouvez pas dire du résultat pourquoi les dossiers ont été regroupés comme ils étaient.)

Il ne semble comme un simple raccourci pour le scénario le plus courant écrasante majorité (regroupement par chacune des colonnes non agrégées) serait un outil simple et efficace pour accélérer le codage.

Peut-être "GROUP BY *"

Comme il est déjà assez courant dans les outils SQL pour permettre des références aux colonnes par numéro de colonne de résultat (ie. GROUP BY 1,2,3, etc.) Il semble encore plus simple de pouvoir permettre à l'utilisateur d'inclure automatiquement tous les champs non agrégées dans une séquence de touches.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top