上一篇聚合函數(shù)末尾處使用了GROUP BY,但沒有做具體的介紹,這一篇就主要介紹一下GROUP BY的使用方法。順便介紹一下對分組查詢的過濾關(guān)鍵詞HAVING的用法。
在上饒等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需定制,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),網(wǎng)絡(luò)營銷推廣,成都外貿(mào)網(wǎng)站建設(shè),上饒網(wǎng)站建設(shè)費(fèi)用合理。
在MySQL中,GROUP BY關(guān)鍵詞可以根據(jù)一個(gè)或多個(gè)字段對查詢結(jié)果進(jìn)行分組,類似于Excel中的數(shù)據(jù)透視表??梢詥为?dú)使用,但一般情況下都是結(jié)合聚合函數(shù)來使用的。
語法格式如下:
下面演示都是基于這一張簡單的省份對應(yīng)大區(qū)的表格。
【單獨(dú)使用GROUP BY】
單獨(dú)使用GROUP BY關(guān)鍵字時(shí),查詢結(jié)果會(huì)只顯示每個(gè)分組的第一條記錄。
根據(jù)省份表里面的大區(qū)進(jìn)行聚合,查詢?nèi)珖卜殖闪藥讉€(gè)大區(qū),SQL語句如下↓
【GROUP BY結(jié)合聚合函數(shù)】
5個(gè)聚合函數(shù)上一篇已經(jīng)詳細(xì)介紹了用法,GROUP BY和聚合函數(shù)結(jié)合使用也是最頻繁的,下面就繼續(xù)使用省份表來求每個(gè)大區(qū)有多少個(gè)省份,對應(yīng)的聚合函數(shù)就是COUNT函數(shù),SQL語句如下↓
【GROUP BY結(jié)合GROUP_CONCAT】
這還是一個(gè)很有用的功能,GROUP_CONCAT() 函數(shù)會(huì)把每個(gè)分組的字段值都合并成一行顯示出來。
下面繼續(xù)使用省份表,把每個(gè)大區(qū)對應(yīng)的省份放在一行展示,用分號分開,SQL語句如下↓
【GROUP BY結(jié)合WITH ROLLUP】
WITH POLLUP關(guān)鍵詞用來在所有記錄的最后加上一條記錄,這條記錄是上面所有記錄的總和,SQL語句如下↓
【GROUP BY結(jié)合HAVING】
在MySQL中,可以使用HAVING關(guān)鍵字對分組后的數(shù)據(jù)進(jìn)行過濾。
使用 HAVING 關(guān)鍵字的語法格式如下:
HAVING關(guān)鍵詞和WHERE關(guān)鍵詞都可以用來過濾數(shù)據(jù),且HAVING支持WHERE關(guān)鍵詞中所有的操作符和語法。但是WHERE和HAVING關(guān)鍵字也存在以下幾點(diǎn)差異:
下面篩選一下省份數(shù)量在7個(gè)及以上的大區(qū),SQL語句如下↓
【GROUP BY結(jié)合ORDER BY】
聚合后的數(shù)據(jù),一半情況下也是需要進(jìn)行排序的,通過ORDER BY對聚合查詢結(jié)果進(jìn)行排序,對省份數(shù)量按從大到小進(jìn)行排序,SQL語句如下↓
End
◆ PowerBI開場白
◆ Python高德地圖可視化
◆ Python不規(guī)則條形圖
指定測試結(jié)果表中根據(jù) case_id 和 sort 字段進(jìn)行分組,取同一分組中的執(zhí)行最小時(shí)間作為該條用例的開始執(zhí)行時(shí)間,取同一分組中的執(zhí)行最大時(shí)間作為該條用例的結(jié)束執(zhí)行時(shí)間。
因?yàn)橐粋€(gè)測試集可能有多條相同用例,用 sort 作為區(qū)分,case_id 和 sort 兩個(gè)字段一起可以唯一確定執(zhí)行的是哪一條用例,因此這里需要指定兩個(gè)字段。
執(zhí)行結(jié)果如下圖所示:
根據(jù) case_id 和 sort 字段進(jìn)行分組,每個(gè)分組中取最大狀態(tài)值作為用例的最終狀態(tài)。
因?yàn)橐粭l用例可能有多個(gè)設(shè)備執(zhí)行,每個(gè)設(shè)備返回的狀態(tài)值可能不同,這里取最大值作為整條用例的最終狀態(tài)值。
執(zhí)行結(jié)果如下圖所示:
第二節(jié)為大家介紹了數(shù)據(jù)的查詢,這一小節(jié)為大家深入講解查詢過程中的數(shù)據(jù)分組和排序,分組關(guān)鍵字為:group by,排序關(guān)鍵字為:order by,過濾分組的關(guān)鍵字為:having;
group by:對查詢的數(shù)據(jù)按照某一類型進(jìn)行分組, group by 一般用在order by子句之前,where子句之后
order by:對查詢的數(shù)據(jù)進(jìn)行某一類進(jìn)行排序 或 對分組后的數(shù)據(jù)進(jìn)行排序
having:對分組后的數(shù)據(jù)進(jìn)行條件過濾
繼續(xù)以上一章創(chuàng)建的客戶表為例,表名: customer ,表有列: cus_id,cus_no,cus_name,cus_age,cus_adds。
eg:查詢客戶的基本信息,以id進(jìn)行分組: select?cus_id,count(*) as num from?customer group by?cus_id;? num表示對應(yīng)的cus_id有多少客戶數(shù)據(jù), 查詢結(jié)果如下
如果分組的列中有null值,那么null將作為一個(gè)分組返回,如果有多個(gè)行都為null值,它們將會(huì)被分為一組返回。 group by 必須用在where子句之后,order by子句之前。
除group by可以進(jìn)行分組過濾數(shù)據(jù)外,having也可以進(jìn)行過濾分組;having過濾和where類似,唯一區(qū)別在于where是過濾行,而having是過濾分組,可看以下列子:
eg: 查詢以id分組后數(shù)據(jù)總量兩條以上的數(shù)據(jù): select?cus_id,count(*) as num from?customer group by?cus_id having count(*)?= '2'; 滿足條件的就只有一條數(shù)據(jù)
order by主要用于數(shù)據(jù)排序的情況,當(dāng)查詢數(shù)據(jù)量較大時(shí),有序的數(shù)據(jù)會(huì)讓人更好地直觀觀察數(shù)據(jù),order by 關(guān)鍵字用于對結(jié)果集按照一個(gè)列或者多個(gè)列進(jìn)行排序。此外order by 關(guān)鍵字默認(rèn)按照升序?qū)τ涗涍M(jìn)行排序。如果需要按照降序?qū)τ涗涍M(jìn)行排序,您可以使用 DESC 關(guān)鍵字。使用方法如下
eg:查詢客戶的基本信息,以年齡進(jìn)行排序,默認(rèn)升序:select?* from?customer order?by?cus_age;
eg:查詢客戶的基本信息,以年齡進(jìn)行排序,降序方式排序:select?* from?customer?order?by?cus_age DESC;
升序使用ASC,降序使用DESC,系統(tǒng)默認(rèn)為升序。注意兩者之間的差異
當(dāng)對多個(gè)列進(jìn)行排序時(shí),order by使用方法如下:
order by A,B? ?--過濾數(shù)據(jù)都是默認(rèn)按升序排列
order by A desc,B? ?--過濾數(shù)據(jù)時(shí) A 降序,B 升序排列
order by A ,B desc? ?--過濾數(shù)據(jù)時(shí) A 升序,B 降序排列
desc?或者?asc?只對它緊跟著的第一個(gè)列名有效,其他不受影響,仍然是默認(rèn)的升序。
本小節(jié)介紹排序分組就到這里了,通過多分組排序的介紹,知道了group by,order by,having三者之間的差異和區(qū)別,大家可以在自己電腦多編寫幾個(gè)腳本,深入了解三個(gè)關(guān)鍵字的使用。
MySQL GROUP BY 子句
GROUP BY 語句根據(jù)一個(gè)或多個(gè)列對結(jié)果集進(jìn)行分組。在分組的列上我們可以使用 COUNT, SUM, AVG,等函數(shù)。
具體語法參考:
from 樹懶學(xué)堂 - 一站式數(shù)據(jù)知識平臺
如何分組數(shù)據(jù),以便能匯總表內(nèi)容的子集。這涉及兩個(gè)新SELECT語句子句,分別是GROUP BY子句和HAVING子句。
分組允許把數(shù)據(jù)分為多個(gè)邏輯組,以便能對每個(gè)組進(jìn)行聚集計(jì)算。
分組是在SELECT語句的GROUP BY 子句中建立的。
來看例子理解:
mysqlselect vend_id,COUNT(*) AS num_prods from products group by vend_id;
也就是不同的Id的商品總數(shù)都能分別查出來。
除了能用GROUP BY分組數(shù)據(jù)外,Mysql還允許過濾分組,規(guī)定包括哪些分組,排除哪些分組。
也就是HAVING子句。
mysqlselect cust_id,COUNT( /) AS orders from orders uGROUP BY/u cust_id uHAVING/u COUNT( /) =2;
注意:這里HAVING換成WHERE是不管用的。HAVING針對于分組。
WHERE在數(shù)據(jù)分組前進(jìn)行過濾,HAVING在數(shù)據(jù)分組后進(jìn)行過濾。
那么咱么看看怎么混合WHERE和HAVING。
mysqlselect vend_id, COUNT( / ) AS num_prods from products uwhere prod_price=10 group by/u vend_id HAVING COUNT( /) =2;
mysqlselect order_num,SUM(quantity*item_price) AS ordertotal
from orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) =50
order by ordertotal;
前兩天同事有個(gè) MySQL 數(shù)據(jù)分組的需求,如下測試數(shù)據(jù),需要找出每個(gè) name 分組中 create_date 最近的記錄:
需要注意的是,此處用的 MySQL 是5.6,最初是使用這條語句:
pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;" select name, value, create_date, update_date from t1 group by name order by create_date desc; /pre
用這條 SQL 得到的其實(shí)只是每個(gè) name 分組中最先插入的記錄,然后按照 create_date 進(jìn)行了降序排列,和原始需求,完全不同。
此時(shí)可采用分而治之的策略,先做排序,再做分組:
pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;" select * from (select name, value, create_date, update_date from t1 order by create_date desc) t group by t.name; /pre
當(dāng)然,針對此需求,可能有其他方法,有興趣的朋友,可以嘗試寫寫,共享一下。
可能有細(xì)心的朋友會(huì)發(fā)現(xiàn)個(gè)問題,就是上述 SQL 中的 group by ,好像有些奇怪,如果按照常規(guī),select 中的字段需要出現(xiàn)在 group by 中,上述語句竟然沒報(bào)錯(cuò)?
如果我們在 MySQL 5.7 執(zhí)行相同的語句:
pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;" select name, value, create_date, update_date from t1 group by name order by create_date desc; /pre
因此從5.6升級到5.7,很可能出現(xiàn)這種相同的 SQL 執(zhí)行結(jié)果不同的現(xiàn)象,這對兼容性測試的要求就會(huì)很高,究其原因,一方面是特性決定的,另一方面就是各種配置參數(shù)不同導(dǎo)致的。
可以在5.7的 sql_mode 中刪除這個(gè) ONLY_FULL_GROUP_BY ,即可達(dá)到5.6相同效果了,或者改寫 SQL ,例如:
pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;" select * from t1 a where create_date = (select max(create_date) from t1 b where a.name = b.name); /pre
或者,
pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;" select * from t1 a where not exists (select * from t1 b where a.name = b.name and b.create_date a.create_date); /pre
MySQL 8.0支持 row_number()函數(shù),操作應(yīng)該和如下 Oracle 相近的。
Oracle 中可以使用 row_number()實(shí)現(xiàn)此需求:
pre class="custom" data-tool="mdnice編輯器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;" select * from (select name, create_date, row_number() over (partition by name order by create_date desc) as r from t1) where r=1; /pre
本文題目:mysql怎么進(jìn)行分組 MySQL 分組
轉(zhuǎn)載來于:http://chinadenli.net/article40/dodesho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、面包屑導(dǎo)航、網(wǎng)站改版、微信公眾號、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容