SQLのGROUP BYとORDER BYの違いは何ですか


119

一般的にどちらを使用しますか?例を強くお勧めします!

MySqlと呼んでいますが、別のDBMSではコンセプトが異なるとは想像できません。

回答:


79

ORDER BYは、アイテムが返される順序を変更します。

GROUP BYは、指定された列でレコードを集計します。これにより、グループ化されていない列(SUM、COUNT、AVGなど)で集計関数を実行できます。


130
このステートメントは、付随する例がなければ事実上意味がありません。
JohnMerlino 2014

2
リンクのページの2番目の例は、違いを理解するには十分だと思いますtutorialspoint.com/sql/sql-group-by.htm
nishantbhardwaj2002 '29

例を挙げていただけますか?

249

ORDER BYは、アイテムが返される順序を変更します。

GROUP BYは、指定された列でレコードを集計します。これにより、グループ化されていない列(SUM、COUNT、AVGなど)で集計関数を実行できます。

TABLE:
ID NAME
1  Peter
2  John
3  Greg
4  Peter

SELECT *
FROM TABLE
ORDER BY NAME

= 
3 Greg
2 John
1 Peter
4 Peter

SELECT Count(ID), NAME
FROM TABLE
GROUP BY NAME

= 
1 Greg
1 John 
2 Peter

SELECT NAME
FROM TABLE
GROUP BY NAME
HAVING Count(ID) > 1

=
Peter

2
テーブルにage列があり、Petersの年齢が異なり、クエリがSELECT NAME、AGE FROM TABLE GROUP BY NAMEの場合はどうなりますか?
Varun

1
グループ化されていない、またはメソッドを持つ列を返すことはできません。したがって、グループ化する年齢を追加するか、Max(Age)のようなものを実行する必要があります。
RiddlerDev 2015年

78

ORDER BY:昇順または降順でデータをソートします。

CUSTOMERSテーブルについて考えてみましょう。

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

以下は、NAMEで結果を昇順でソートする例です。

SQL> SELECT * FROM CUSTOMERS
     ORDER BY NAME;

これにより、次の結果が生成されます。

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
+----+----------+-----+-----------+----------+

GROUP BY:同一のデータをグループに配置します。

これで、CUSTOMERSテーブルには、重複した名前を持つ次のレコードがあります。

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Ramesh   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | kaushik  |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

同じ名前を単一の名前にグループ化する場合、GROUP BYクエリは次のようになります。

SQL> SELECT * FROM CUSTOMERS
     GROUP BY NAME;

これにより、次の結果が生成されます(同じ名前の場合、最後の名前が選択され、最後に列が昇順で並べ替えられます)。

    +----+----------+-----+-----------+----------+   
    | ID | NAME     | AGE | ADDRESS   | SALARY   |
    +----+----------+-----+-----------+----------+
    |  5 | Hardik   |  27 | Bhopal    |  8500.00 |
    |  4 | kaushik  |  25 | Mumbai    |  6500.00 |
    |  6 | Komal    |  22 | MP        |  4500.00 |
    |  7 | Muffy    |  24 | Indore    | 10000.00 |
    |  2 | Ramesh   |  25 | Delhi     |  1500.00 |
    +----+----------+-----+-----------+----------+

sum、avgなどのSQL関数がないと役に立たないと推測しました。

したがって、この定義を調べて、GROUP BYの適切な使用法を理解してください。

GROUP BY句は、COUNT()、SUMなどのSELECTリストで適切なAggregate関数を使用して、同一の行を単一/個別のグループに要約することでクエリによって返される行を処理し、各グループの概要を含む単一の行を返します()、MIN()、MAX()、AVG()など

ここで、各customer(name)の給与の総額を知りたい場合、GROUP BYクエリは次のようになります。

SQL> SELECT NAME, SUM(SALARY) FROM CUSTOMERS
     GROUP BY NAME;

これにより、次の結果が生成されます:(同じ名前の給与の合計と、同じ名前を削除した後にNAME列をソート)

+---------+-------------+
| NAME    | SUM(SALARY) |
+---------+-------------+
| Hardik  |     8500.00 |
| kaushik |     8500.00 |
| Komal   |     4500.00 |
| Muffy   |    10000.00 |
| Ramesh  |     3500.00 |
+---------+-------------+

25

違いは、名前が示すとおりです。グループ化はグループ化操作を実行し、並べ替えは順序付けを行います。

あなたが行う場合SELECT * FROM Customers ORDER BY Name、あなたは顧客名でソート結果リストを取得します。

その場合SELECT IsActive, COUNT(*) FROM Customers GROUP BY IsActive、アクティブな顧客と非アクティブな顧客の数を取得します。指定したフィールドに基づいて結果を集計したグループ。


3
さらに、グループ化した場合、結果は必ずしもソートされません。多くの場合、それらは直感的な順序で表示される可能性がありますが、GROUP句では保証されません。グループをソートする場合は、常にGROUP BYの後に明示的なORDER BYを使用してください。
デイブ・コスタ

16

それらはまったく異なる意味を持ち、実際にはまったく関連していません。

ORDER BYを使用すると、最初にa〜zの名前で並べ替え、次に価格の高いものから低いものへと並べ替えるなど、さまざまな基準に従って結果セットを並べ替えることができます。

(名前順、価格DESC)

GROUP BYを使用すると、結果セットを取得して論理グループにグループ化し、それらのグループに対して集約クエリを実行できます。たとえば、すべての従業員を選択し、職場の場所でグループ化して、各職場の場所のすべての従業員の平均給与を計算できます。


8

シンプル、ORDER BYデータの順序付けとGROUP BYグループ化、またはデータの結合。

ORDER BY 上記のフィールドに従って結果セットを並べ替えます。デフォルトでは昇順です。

次のようにクエリを実行するとしますORDER BY (student_roll_number)。これにより、学生のロール番号の昇順で結果が表示されます。ここでは、student_roll_numberエントリが複数回発生する可能性があります。

ではGROUP BY場合、我々は集約関数でこれを使用して、それのグループのデータを集約関数ごとに、我々は結果を得ます。ここで、クエリにそれが含まSUM (marks)れてGROUP BY (student_first_name)いる場合、各グループに属する学生のマークの合計が表示されます(グループのすべてのメンバーは同じ名になります)。


4

GROUP BYは、通常、行を集計するときに、選択内の行をグループ化するために使用されます(たとえば、一部のフィールドで同じ値を持つ行のセットの合計、平均などを計算する)。

ORDER BYは、selectステートメントの結果の行を並べ替えるために使用されます。



1

ORDER BY昇順または降順でフィールドを表示します。一方GROUP BY、同じフィールド名、IDなどが1つの出力にのみ表示されます。


4
この回答は、受け入れられた回答、または与えられた他の回答がまだ述べていない追加情報を提供しません。
newfurniturey 2012年

1
  1. GROUP BYは、指定された列でレコードを集計します。これにより、グループ化されていない列(SUM、COUNT、AVGなど)で集計関数を実行できます。ORDER BYは、アイテムが返される順序を変更します。
  2. SELECT IsActive、COUNT(*)FROM Customers GROUP BY IsActiveを実行すると、アクティブな顧客と非アクティブな顧客の数が取得されます。指定したフィールドに基づいて結果を集計したグループ。SELECT * FROM Customers ORDER BY Nameを実行すると、顧客の名前でソートされた結果リストが得られます。
  3. GROUPする場合、結果は必ずしもソートされません。多くの場合、それらは直感的な順序で表示される可能性がありますが、GROUP句では保証されません。グループをソートする場合は、常にGROUP BYの後に明示的なORDER BYを使用してください。
  4. グループ化されたデータは、WHERE句でフィルタリングできません。注文データはWHERE句でフィルタリングできます。

0

GROUP BY(少なくともPostgreSQLでは、おそらく他のSQLバリアントでも)ORDER BYリスト使用ASCできDESC ごとまたは列ごとに使用できるため、必ずしも必要ではないことに注意してください...

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