![](/img/trans.png)
[英]What is the difference between 'GROUP BY' and 'ORDER BY' in 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
您需要了解的另一部分是WHERE
和HAVING
之間的區別。 考慮:
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
對記錄進行分組時,結果不是記錄,而是分組。 您可以使用諸如count
, min
和max
類的聚合來獲取涉及該組中所有記錄的特征。
如果運行此查詢:
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 by
和order by
,並且在對結果進行分組后將對其進行排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.