分組數(shù)據(jù)以便能匯總表內(nèi)容的子集,GROUP BY子句和HAVING子句。
創(chuàng)建分組
SELECT vend_id, COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;
-
GROUP BY子句可以包含任意數(shù)目的列。這使得能對分組進(jìn)行嵌套。 - 如果在
GROUP BY子句中嵌套了分組,數(shù)據(jù)將在最后規(guī)定的分組上進(jìn)行匯總。 -
GROUP BY子句中列出的每個列都必須是檢索列或有效表達(dá)式(但不能是聚集函數(shù))。如果在SELECT中使用表達(dá)式,則必須在GROUP BY子句中指定相同的表達(dá)式,不能使用別名。 - 除聚集計(jì)算語句外,
SELECT語句中的每個列都必須在GROUP BY子句中給出。 - 如果分組列中有
NULL值,則NULL將作為一個分組返回。如果列中有多行NULL值,將它們分為一組。 -
GROUP BY子句必須出現(xiàn)在WHERE子句之后,ORDER BY子句之前。
過濾分組
規(guī)定包括哪些組,排除哪些組。HAVING子句,與WHERE相似,區(qū)別在于WHERE過濾行,HAVING過濾分組。
SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
HAVING和WHERE的區(qū)別:WHERE在數(shù)據(jù)分組前進(jìn)行過濾,HAVING在數(shù)據(jù)分組后進(jìn)行過濾。
WHERE和HAVING結(jié)合:
SELECT vend_id, COUNT(*) AS num_prods
FROM products
WHERE prod_price >= 10
GROUP BY vend_id
HAVING COUNT(*) >= 2;
分組和排序
| ORDER BY | GROUP BY |
|---|---|
| 排序產(chǎn)生的輸出 | 分組行。但輸出可能不是分組的順序 |
| 任意列都可以使用(甚至非選擇的列也可以使用) | 只可能使用選擇列或表達(dá)式列,而且必須使用每個選擇列表達(dá)式 |
| 不一定需要 | 如果與聚集函數(shù)一起使用列,則必須使用 |
GROUP BY和ORDER BY的區(qū)別:
| ORDER BY | GROUP BY |
|---|---|
| 排序產(chǎn)生的輸出 | 分組行。但輸出可能不是分組的順序 |
| 任意列都可以使用(甚至非選擇的列也可以使用) | 只可能使用選擇列或表達(dá)式列,而且必須使用每個選擇列表達(dá)式 |
| 不一定需要 | 如果與聚集函數(shù)一起使用列,則必須使用 |
例:
檢索總計(jì)訂單價格大于等于50的訂單號和總計(jì)訂單價格:
SELECT order_num, SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >= 50;
為按總計(jì)訂單價格排序輸出,需要添加ORDER BY子句:
SELECT order_num, SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >= 50
ORDER BY ordertotal;
SELECT子句順序
| 子句 | 說明 | 是否必須使用 |
|---|---|---|
| SELECT | 要返回的列表或表達(dá)式 | 是 |
| FROM | 從中檢索數(shù)據(jù)的表 | 僅在從表選擇數(shù)據(jù)時使用 |
| WHERE | 行級過濾 | 否 |
| GROUP BY | 分組說明 | 僅在按組計(jì)算聚集時使用 |
| HAVING | 組級過濾 | 否 |
| ORDER BY | 輸出排序順序 | 否 |
| LIMIT | 要檢索的行數(shù) | 否 |