MySQL数据库之GROUP BY用法
1.MySQL數(shù)據(jù)庫(kù)之GROUP BY的常規(guī)用法
group by的常規(guī)用法是配合聚合函數(shù),利用分組信息進(jìn)行統(tǒng)計(jì),常見的是配合max等聚合函數(shù)篩選數(shù)據(jù)后分析,以及配合having進(jìn)行篩選后過(guò)濾。
聚合函數(shù)max
select max(user_id),grade from user_info group by grade ;
這條sql的含義很明確,將數(shù)據(jù)按照grade字段分組,查詢每組最大的user_id以及當(dāng)前組內(nèi)容。注意,這里分組條件是grade,查詢的非聚合條件也是grade。這里不產(chǎn)生沖突。
having
select max(user_id),grade from user_info group by grade having grade>'A'
這條sql與上面例子中的基本相同,不過(guò)后面跟了having過(guò)濾條件。將grade不滿足’>A’的過(guò)濾掉了。注意,這里分組條件是grade,查詢的非聚合條件也是grade。這里不產(chǎn)生沖突。
2. group by的非常規(guī)用法
select max(user_id),id,grade from user_info group by grade
這條sql的結(jié)果就值得討論了,與上述例子不同的是,查詢條件多了id一列。數(shù)據(jù)按照grade分組后,grade一列是相同的,max(user_id)按照數(shù)據(jù)進(jìn)行計(jì)算也是唯一的,id一列是如何取值的?看上述的數(shù)據(jù)結(jié)果,
推論:id是物理內(nèi)存的第一個(gè)匹配項(xiàng)。
究竟是與不是需要繼續(xù)探討。
修改數(shù)據(jù)
修改id按照上述數(shù)據(jù)結(jié)果,將id=1,改為id=99,執(zhí)行sql后結(jié)論:
顯然,與上述例子的結(jié)果不同。第一條數(shù)據(jù)id變成了99,查出的結(jié)果第一條數(shù)據(jù)的id從1變成了2。表明,id這個(gè)非聚合條件字段的取值與數(shù)據(jù)寫入的時(shí)間無(wú)關(guān),因?yàn)閕d=1的記錄是先于id=2存在的,修改的數(shù)據(jù)不過(guò)是修改了這條數(shù)據(jù)的內(nèi)容。結(jié)合mysql的數(shù)據(jù)存儲(chǔ)理論,由于id是主鍵,所以數(shù)據(jù)在檢索是是按照主鍵排序后進(jìn)行過(guò)濾的,因此
推論:id字段的選取是按照mysql存儲(chǔ)的檢索數(shù)據(jù)匹配的第一條。
將id改為1后恢復(fù)了原始結(jié)果,無(wú)法推翻上述推論。
更改查詢條件
select max(user_id),user_id,id,grade from user_info group by grade
將數(shù)據(jù)user_id改為10999后,執(zhí)行結(jié)果為
- 結(jié)論
- 當(dāng)group by 與聚合函數(shù)配合使用時(shí),功能為分組后計(jì)算
- 當(dāng)group by 與having配合使用時(shí),功能為分組后過(guò)濾
- 當(dāng)group by 與聚合函數(shù),同時(shí)非聚合字段同時(shí)使用時(shí),非聚合字段的取值是第一個(gè)匹配到的字段內(nèi)容,即id小的條目對(duì)應(yīng)的字段內(nèi)容。
- 如需了解更多測(cè)試技術(shù)信息請(qǐng)關(guān)注:深圳市多測(cè)師信息技術(shù)有限公司
總結(jié)
以上是生活随笔為你收集整理的MySQL数据库之GROUP BY用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PADS新建元器件
- 下一篇: mysql 嵌套_MySQL嵌套查询(子