303 votes

Que signifie la clause SQL "GROUP BY 1" ?

Quelqu'un m'a envoyé une requête SQL dans laquelle le paramètre GROUP BY La clause consistait en une déclaration : GROUP BY 1 .

Ce doit être une faute de frappe, non ? Aucune colonne ne porte l'alias 1. Qu'est-ce que cela peut signifier ? Ai-je raison de penser qu'il s'agit d'une erreur de frappe ?

9 votes

Ce n'est pas une faute de frappe, c'est la première colonne de votre ensemble de résultats.

10 votes

Notez que cette syntaxe n'est pas portable. Elle se comportera différemment sur des bases de données autres que mysql. Dans Oracle, par exemple, elle est traitée comme une constante.

2 votes

@RussellReed Oui. Malheureusement (car l'utilisation d'un alias est parfois très utile), ansi sql ne permet pas le regroupement par colonne ordinale. La raison est que le group by se fait avant la projection. Mais alors que faire quand on a des expressions de regroupement avec des dizaines de lignes on se retrouve avec . mutiples de dizaines de lignes dans l'instruction sql finale.

336voto

Yuck Points 23174

Cela signifie qu'il faut grouper par la première colonne, quel que soit son nom. Vous pouvez faire la même chose avec ORDER BY .

9 votes

Et il ne devrait jamais être utilisé dans le code de production sauf si vous devez absolument le faire, par exemple si vous sélectionnez dynamiquement des colonnes. C'est difficile à lire et lorsque quelqu'un modifie l'instruction de sélection sans corriger également les ordinaux, cela peut provoquer silencieusement des problèmes catastrophiques.

112voto

mr_eclair Points 9503
SELECT account_id, open_emp_id
         ^^^^        ^^^^
          1           2

FROM account
GROUP BY 1;

Dans la requête ci-dessus GROUP BY 1 fait référence à la first column in select statement qui est account_id .

Vous pouvez également spécifier dans ORDER BY .

Note : Le nombre dans ORDER BY et GROUP BY commence toujours par 1 et non par 0.

32voto

vol7ron Points 11270

Outre le regroupement par le nom du champ, vous pouvez également regrouper par ordre ordinal, c'est-à-dire par la position du champ dans la table. 1 correspond au premier champ (quel que soit son nom), 2 est le deuxième, et ainsi de suite.

C'est généralement déconseillé si vous effectuez un regroupement sur quelque chose de spécifique, car la structure de la table/vue peut changer. En outre, il peut être difficile de comprendre rapidement ce que fait votre requête SQL si vous n'avez pas mémorisé les champs de la table.

Si vous renvoyez un ensemble unique, ou si vous effectuez rapidement une recherche temporaire, il s'agit d'une syntaxe abrégée qui permet de réduire la saisie. Si vous prévoyez de réexécuter la requête à un moment donné, je vous recommande de remplacer ces éléments pour éviter toute confusion future et toute complication inattendue (due à des changements de schéma).

13 votes

+1 pour "ne faites pas ça" et j'ajouterais que la meilleure raison de l'éviter est qu'il n'est pas lisible.

14voto

Daan Geurts Points 86

Il va regrouper par le premier champ dans la clause de sélection.

12voto

张艳军 Points 161

Cela signifie *"grouper par la première colonne de votre clause de sélection". Utilisez toujours GROUP BY 1 en même temps que ORDER BY 1 .

Vous pouvez également utiliser GROUP BY 1,2,3.. . C'est pratique, mais vous devez faire attention à cette condition ; le résultat peut ne pas être ce que vous voulez si quelqu'un a modifié vos colonnes de sélection et que cela n'est pas visualisé.

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