Skip to content

Commit 8d2eefa

Browse files
authored
Merge pull request #222 from Sandra-Kao/patch-3
Update aggregate-functions.md
2 parents 0f2b274 + a031dcf commit 8d2eefa

1 file changed

Lines changed: 24 additions & 0 deletions

File tree

tutorial/the-sql-language/aggregate-functions.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,27 @@ SELECT city, max(temp_lo)
9090
這裡很重要的是,瞭解 SQL 中 WHERE 和 HAVING 之間的行為。其根本上的差異是:WHERE 會在合併和彙總計算之前進行選擇資料的動作(也就是它控制著,哪些資料需要被彙總計算);而 HAVING 是在合併及彙整計算之後,才進行過濾資料的動作。所以,在 WHERE 條件式當中,絕不可以使用彙整運算式;另一方面,HAVING 條件式總是使用彙整運算式。(嚴格來說,你也可以不在 HAVING 條件式中使用彙整運算式,但很少人這樣使用,通常就會改寫到 WHERE 條式件當中,那會更有效率。)
9191

9292
在先前的例子當中,我們可以把城市名稱的限制放在 WHERE 條件式之中,因為它不需要彙總。這將會比放在 HAVING 條件式中更有效率,因為這樣可以避免合併及彙整運算整個表格,不用浪費時間在本來就會被過濾掉的資料上。
93+
94+
另一種選擇要納入聚合計算的資料列的方式,是使用 FILTER,這是個專屬於每個聚合函數的選項:
95+
96+
97+
```
98+
SELECT city, count(*) FILTER (WHERE temp_lo < 45), max(temp_lo)
99+
FROM weather
100+
GROUP BY city;
101+
```
102+
103+
```
104+
city | count | max
105+
---------------+-------+-----
106+
Hayward | 1 | 37
107+
San Francisco | 1 | 46
108+
(2 rows)
109+
```
110+
111+
FILTER 的作用和 WHERE 很像,不過它的影響範圍更小。
112+
113+
WHERE 是用來篩選整個查詢的資料,過濾掉所有不符合條件的資料列。
114+
115+
但 FILTER 只會針對某個聚合函數(count(*))所用到的資料,暫時忽略掉那些不符合條件的資料列。
116+

0 commit comments

Comments
 (0)