SQL句の「GROUP BY 1」とはどういう意味ですか?


203

誰かが私にSQLクエリを送信しましたが、このGROUP BY句は次のステートメントで構成されていますGROUP BY 1

これはタイプミスである必要がありますか?エイリアス1が指定されている列はありません。これはどういう意味ですか?これはタイプミスであると思いますか?


6
タイプミスではなく、結果セットの最初の列
Lamak

9
この構文は移植性がないことに注意してください。mysql以外のデータベースでは動作が異なります。たとえばOracleでは、定数として扱われます。
ラッセルリード

2
@RussellReedはい。残念ながら(エイリアスを使用すると非常に便利な場合があるため)、ansi sqlでは列序数によるグループ化は許可されません。その理由は、group byが投影の前に発生するためです。しかし、その後、数十行のグループ化式がある場合、最終的なsqlステートメントで数十行のムチプルになることになります。
javadba

回答:


232

これは、何と呼ばれるかに関係なく、最初の列でグループ化することを意味します。同じことをで行うことができますORDER BY


74
SELECT account_id, open_emp_id
         ^^^^        ^^^^
          1           2

FROM account
GROUP BY 1;

上記のクエリでGROUP BY 1は、first column in select statementどちらであるかを参照しています account_id

で指定することもできますORDER BY

注:ORDER BYおよびGROUP BYの数値は、0ではなく常に1で始まります。


25

フィールド名によるグループ化に加えて、序数、またはテーブル内のフィールドの位置によってグループ化することもできます。1は最初のフィールド(名前に関係なく)に対応し、2は2番目のフィールドに対応します。

テーブル/ビューの構造が変更される可能性があるため、特定のものでグループ化している場合、これは一般に不適切です。また、テーブルのフィールドを覚えていない場合、SQLクエリの動作をすばやく理解するのが難しい場合があります。

一意のセットを返す場合、または一時的なルックアップをすばやく実行する場合、これは入力を減らすための優れた省略構文です。ある時点で再度クエリを実行する予定がある場合は、それらを置き換えることで、将来の混乱や予期しない複雑さ(スキームの変更による)を回避することをお勧めします。


10
「これを行わない」ことを+1します。これを回避する最善の理由は、読みにくいことです。
Yuck


5

つまり、select句の1列目でSQLグループを作成します。これは常にとGROUP BY 1一緒に使用しORDER BY 1ます。また、このように使用することもできますがGROUP BY 1,2,3..、もちろん便利ですが、条件に注意する必要があります。誰かが選択した列を変更し、それが視覚化されていない場合


4

group by句の後に配置した列位置でグループ化されます。

たとえば、「SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1」を実行すると、グループ化されSALESMAN_NAMEます。

そのための1つのリスクは、 ' Select *' を実行し、何らかの理由で列の順序が異なるテーブルを再作成した場合、予想とは異なる結果が得られることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.