Skip to content

Commit 83544ec

Browse files
committed
49. GROUP BY
1 parent 9384ca9 commit 83544ec

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed

SQL/1.49GROUP_BY.md

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# SQL GROUP BY 语句
2+
3+
--
4+
5+
### 合计函数(比如 SUM)常常需要添加 GROUP BY 语句。
6+
7+
--
8+
9+
### GROUP BY 语句
10+
11+
GROUP BY 语句用于结合合计函数,根据一个或多个字段字段对字段结果集进行分组。
12+
13+
### SQL GROUP BY 语法
14+
15+
```
16+
SELECT 字段, 合计函数(字段)
17+
FROM 表名
18+
WHERE 字段合计结果
19+
GROUP BY 字段;
20+
```
21+
22+
--
23+
24+
### SQL GROUP BY 实例
25+
26+
我们拥有下面这个 "Orders" 表:
27+
28+
O_Id | OrderDate | OrderPrice | Customer
29+
-----|------------|------------|----------
30+
1 | 2008-12-29 | 1000 | Bush
31+
2 | 2008-11-23 | 1600 | Carter
32+
3 | 2008-10-05 | 700 | Bush
33+
4 | 2008-09-28 | 300 | Bush
34+
5 | 2008-08-06 | 2000 | Adams
35+
6 | 2008-07-21 | 100 | Carter
36+
37+
现在,我们希望查找每个客户的总金额(总订单)。
38+
39+
我们想要使用 GROUP BY 语句对客户进行组合。
40+
41+
我们使用下列 SQL 语句:
42+
43+
```
44+
SELECT Customer, SUM(OrderPrice) AS PriceSum
45+
FROM Orders
46+
GROUP BY Customer;
47+
```
48+
49+
结果集类似这样:
50+
51+
| Customer | PriceSum |
52+
|----------+----------|
53+
| Adams | 2000 |
54+
| Bush | 2000 |
55+
| Carter | 1700 |
56+
57+
很棒吧,对不对?
58+
59+
让我们看一下如果省略 GROUP BY 会出现什么情况:
60+
61+
```
62+
SELECT Customer, SUM(OrderPrice) AS PriceSum FROM Orders;
63+
```
64+
65+
结果集类似这样:
66+
67+
Customer | PriceSum
68+
------------|---------
69+
Bush | 5700
70+
Carte | 5700
71+
Bush | 5700
72+
Bush | 5700
73+
Adams | 5700
74+
Carter | 5700
75+
76+
注释:MySQL 不支持这种形式。
77+
78+
上面的结果集不是我们需要的。
79+
80+
那么为什么不能使用上面这条 SELECT 语句呢?解释如下:上面的 SELECT 语句指定了两列(Customer 和 SUM(OrderPrice))。"SUM(OrderPrice)" 返回一个单独的值("OrderPrice" 字段的总和),而 "Customer" 返回6个值(每个值对应 "Orders" 表中的每一行)。因此,我们得不到正确的结果。不过,您已经看到了,GROUP BY 语句解决了这个问题。
81+
82+
--
83+
84+
### GROUP BY 一个以上的字段
85+
86+
我们也可以对一个以上的字段应用 GROUP BY 语句,就像这样:
87+
88+
```
89+
SELECT Customer, OrderDate, SUM(OrderPrice) AS PriceSum
90+
FROM Orders
91+
GROUP BY Customer, OrderDate;
92+
```
93+
94+
--

0 commit comments

Comments
 (0)