iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0

在查詢資料表時,除了直接以「整張資料表」為母體的搜尋方式外,也可以用 GROUP BY 先行將資料表中的資料依照一定條件給分群,然後再進行處理。
在 SQL 敘述句的撰寫上,架構會是如下這樣:

SELECT ... FROM ... WHERE ... GROUP BY...;

這個四個關鍵保留字的順序是不可以前後倒置的。

GROUP BY 子句語法

SELECT <Field 1><Field 2><Field 3>......
FROM <Table Name>
WHERE <Rule>
GROUP BY <Field 1><Field 2><Field 3>......;

回到原本的Product 資料表中來示範:

  1. 按照每個商品分類,求每類有多少筆資料
SELECT category, COUNT(*) FROM Product GROUP BY category;

Day20Result1

  1. 求不同的賣出售價各有多少商品
SELECT sell_price, COUNT(*) FROM Product GROUP BY sell_price;

你會發現 NULL 的也會被查詢到。
Day20Result2

  1. 求賣出售價大於 50 的商品總數
SELECT sell_price, COUNT(*) FROM Product WHERE sell_price > 50 GROUP BY sell_price;

Day20Result3

常見錯誤

  • SELECT 子句中,「寫入不包含於 GROUP BY 的欄位」
    會報錯誤的原因在於:當你使用了 GROUP BY 某欄位之後,原先單筆資料對應 GROUP BY 的某欄位的一對一關係就消失了。

例如:有一商品表格如下,價格都是 15 元。

name price
pen 15
water 15
eraser 15

若以 GROUP BY price 的條件分群後,只會有 price 為 15 的這一群。接著若有 SELECT price 以外的欄位要顯示,那麼要顯示哪一筆資料呢?在 MySQL 上是直接報出錯誤的。

  • GROUP BY 不能使用 SELECT 中的別名
    因為 GROUP BY 的執行順序是在 SELECT 之前的,所以 SELECT 的別名對 GROUP BY 而言會是未定義的名稱

  • 多條件的 GROUP BY ,其排序顯示是會依照條件輸入順序
    並沒有這樣的設定,基本上是隨機的


上一篇
Day 19 - 利用內建函數來彙整資料
下一篇
Day21 - 對資料分群內的資料下條件
系列文
SQL 30天手把手入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言