簡體   English   中英

當我閱讀其他有關此的文章時,我仍然看不到GROUP BY和ORDER BY之間在SQL方面的區別。 它是什么?

[英]When I read other posts about this, I still can't see the difference in SQL between GROUP BY and ORDER BY. What is it?

我已經針對這個問題開始了自己的話題,以減少將其發布到其他人的話題上的開銷。 我在SQL中很難理解GROUP BY和ORDER BY之間的區別。 我知道已經對此進行了討論,但是它們沒有為我提供有用的答案。 這是我在其他線程中多次看到的相同答案的大致思路:

ORDER BY根據某列中的值對行進行排序,而GROUP BY將某列中具有相同值的行分組以幫助聚合函數。

在我看來,這似乎只是用兩種不同的措辭來描述相同的事物。 我基本上完全需要這個措辭。 問題在於,ORDER BY以與GROUP BY相同的方式對事物進行“分組”,唯一的例外是GROUP BY可能無法保證不存在某種特殊順序。 此外,我只是看不到GROUP BY如何通過ORDER BY提供的聚合函數提供更多幫助。

請以不同於大多數人的方式解釋差異。 謝謝!

最好用一個例子來說明。 考慮一個人表:

ID  Gender  Name
 1    M     Fred
 2    M     Bob
 3    F     Jane
 4    M     Alex
 5    F     Mary

跑:

SELECT * FROM person ORDER BY gender

你會得到:

ID  Gender  Name
 3    F     Jane
 5    F     Mary
 1    M     Fred
 2    M     Bob
 4    M     Alex

但是運行:

SELECT gender, COUNT(1) FROM person GROUP BY gender

你會得到:

Gender  COUNT(1)
  M        3
  F        2

您需要了解的另一部分是WHEREHAVING之間的區別。 考慮:

SELECT gender, COUNT(1) FROM person WHERE name = 'Bob' GROUP BY gender

結果:

Gender  COUNT(1)
  M        1

但:

SELECT gender, COUNT(1) FROM person GROUP BY gender HAVING COUNT(1) > 2

結果:

Gender  COUNT(1)
  M        3

基本上, ORDER BY更改行的順序(然后可以將其“管道傳輸”到聚合中),而HAVING過濾聚合的結果。 換句話說, WHERE影響到GROUP BY的輸入, HAVING影響輸出。

代替:

a   2
a   4
a   2
a   1
a   2

GROUP BY將顯示一個“ a”,然后顯示另一列的某種聚合(也許是平均值)。

ORDER BY將保留所有的aa aaa,並且僅根據其中一列對行進行排序(因此可能首先是1)。

因此,最后,在這種情況下,GROUP BY將導致一行,而ORDER BY將具有與原始行相同的行數。

按結果排序方式-數據庫中每匹配一個(where子句)行對應一行結果

與數據庫中的匹配行(where子句)相比,分組依據給您的結果行更少。

例如,您有一張每位老師的學生平均成績表(0-4.0)

訂購方式將為您提供所有老師的所有學生成績

按老師分組將為您提供每位老師一個結果。 通常您會選擇一些平均值,例如gpa字段的平均值,因此每位老師會得到一個gpa數字

order by子句用於按條件對結果進行排序,而group by子句用於將記錄按記錄共用條件的組放置。

考慮如下表Test

Name  Number
-----------------
B     1
B     2
C     3
C     4
C     5
A     6
A     7
A     8

如果運行此查詢:

select Name, Number
from Test
order by Name

您最終得到對所有記錄進行排序的結果:

A     6
A     7
A     8
B     1
B     2
C     3
C     4
C     5

對記錄進行分組時,結果不是記錄,而是分組。 您可以使用諸如countminmax類的聚合來獲取涉及該組中所有記錄的特征。

如果運行此查詢:

select Name, count(*) as Cnt, min(Number) as Min, max(Number) as Max
from Test
group by Name

您最終得到包含三個組的結果,因為存在三個不同的名稱:

Name  Cnt  Min  Max
----------------------
B     2    1    2
C     3    3    5
A     3    6    8

請注意,分組並不意味着結果將根據您分組的條件進行排序。 如果還希望這樣做,則可以同時使用group byorder by ,並且在對結果進行分組后將對其進行排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM