本文主要介紹MySQL是如何實現(xiàn)分組數(shù)據(jù)的掺逼,以便能匯總表內(nèi)容的子集笛丙。這涉及了兩個
SELECT
子句锯蛀,分別是GROUP BY
和HAVING
为牍; 分組可以將一個整表分為多個邏輯組能颁,以便能對每個組進(jìn)行聚集計算杂瘸。
I、創(chuàng)建分組
1伙菊、分組是在SELECT
語句的GROUP BY
子句中建立的败玉。下面看一個例子。
2镜硕、我們以下表為例進(jìn)行操作test1:
#test1
> SELECT vend_id, COUNT(*) AS num_prods
FROM products
GROUP BY vend_id
上面的SELECT
語句指定了兩個列运翼,vend_id包含產(chǎn)品供應(yīng)商的ID惑朦, num_prods為計算字段(用COUNT
)卤恳。GROUP BY
子句提示MySQL按照vend_id排序并分組數(shù)據(jù)颈走。這表示對每個vend_id計算num_prods摊求。
輸出結(jié)果如下圖所示:
計算結(jié)果展示供應(yīng)商1001有3個產(chǎn)品,1002有2個產(chǎn)品送滞,1003有7個產(chǎn)品是晨。
3竟稳、因為使用了GROUP BY
,就不必指定要計算和估算的每個組了沦补。系統(tǒng)會自動完成乳蓄。GROUP BY
子句提示MySQL分組數(shù)據(jù),然后對每個組進(jìn)行聚集夕膀。
II栓袖、過濾分組
1、MySQL允許過濾分組店诗,規(guī)定包括哪些分組,排除哪些分組音榜。過濾分組采用HAVING
子句完成庞瘸。
2、下面看一個例子赠叼,我們以下表為例完成test2:
#test2
> SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*)>=2;
輸出結(jié)果如下:
從結(jié)果中我們可以看出擦囊,只有一個cust_id滿足數(shù)量大于等于2的過濾條件。
3嘴办、WHERE
與HAVING
子句的區(qū)別在于瞬场,WHERE
完成的是行過濾,而HAVING
完成的是分組過濾涧郊。這兩個子句可以同時使用來實現(xiàn)進(jìn)一步的過濾效果贯被,如test3:
#test3
> SELECT vend_id, COUNT(*) AS num_prods
FROM products
WHERE prod_prict >= 10
GROUP BY vend_id
HAVING COUNT(*) >= 2;
輸出結(jié)果如下:
III、分組和排序
1妆艘、MySQL還提供了一個OEDER BY
子句彤灶,在使用GROUP BY
子句完成分組之后,可以使用ORDER BY
子句對分組進(jìn)行排序批旺。
2幌陕、test4展示了ORDER BY
子句的使用:
#test4_1
> SELECT order_num, SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >= 50;
#test4_2
> SELECT order_num, SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >= 50
ORDER BY ordertotal;
【參考】
[1] 《MySQL必知必會》