mysql分組怎么獲得 mysql中分組查詢的功能是什么

技術(shù)分享 | MySQL 分組需求探秘

前兩天同事有個(gè) MySQL 數(shù)據(jù)分組的需求,如下測(cè)試數(shù)據(jù),需要找出每個(gè) name 分組中 create_date 最近的記錄:

敦化網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)自2013年起到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。

需要注意的是,此處用的 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)然,針對(duì)此需求,可能有其他方法,有興趣的朋友,可以嘗試寫寫,共享一下。

可能有細(xì)心的朋友會(huì)發(fā)現(xiàn)個(gè)問題,就是上述 SQL 中的 group by ,好像有些奇怪,如果按照常規(guī),select 中的字段需要出現(xiàn)在 group by 中,上述語句竟然沒報(bào)錯(cuò)?

如果我們?cè)?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升級(jí)到5.7,很可能出現(xiàn)這種相同的 SQL 執(zhí)行結(jié)果不同的現(xiàn)象,這對(duì)兼容性測(cè)試的要求就會(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)階5:分組查詢

/*語法:

select 分組函數(shù) 列(要求出現(xiàn)在group by的后面)

from 表

【where 篩選條件】

group by 分組的列表

[order by 子句]

注意:查詢列表必須特殊,要求是分組函數(shù)和group by 后出現(xiàn)的字段

特點(diǎn):

1.分組查詢中篩選條件分為兩類:

數(shù)據(jù)源 位置 關(guān)鍵字

分組前篩選 原始表 group by子句的前面 where

分組后篩選 分組后的結(jié)果集 group by子句的后面 having

1.分組函數(shù)做條件肯定是放在having子句中

2.能用分組前篩選的,優(yōu)先考慮使用分組前篩選

2.group by 子句支持單個(gè)字段、多個(gè)字段分組(用逗號(hào)隔開沒有順序要求)表達(dá)式或函數(shù)(用的較少)

3.也可以添加排序(放在整個(gè)group by子句之后)

*/

count(1),其實(shí)就是計(jì)算一共有多少符合條件的行。

1并不是表示第一個(gè)字段,而是表示一個(gè)固定值。

其實(shí)就可以想成表中有這么一個(gè)字段,這個(gè)字段就是固定值1,count(1),就是計(jì)算一共有多少個(gè)1.

同理,count(2),也可以,得到的值完全一樣,count('x'),count('y')都是可以的。一樣的理解方式。在你這個(gè)語句理都可以使用,返回的值完全是一樣的。就是計(jì)數(shù)。

count(*),執(zhí)行時(shí)會(huì)把星號(hào)翻譯成字段的具體名字,效果也是一樣的,不過多了一個(gè)翻譯的動(dòng)作,比固定值的方式效率稍微低一些。

MySQL 怎樣分組查詢

MySQL GROUP BY 子句

GROUP BY 語句根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組。在分組的列上我們可以使用 COUNT, SUM, AVG,等函數(shù)。

具體語法參考:

from 樹懶學(xué)堂 - 一站式數(shù)據(jù)知識(shí)平臺(tái)

網(wǎng)頁標(biāo)題:mysql分組怎么獲得 mysql中分組查詢的功能是什么
網(wǎng)站地址:http://muchs.cn/article2/doesooc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作小程序開發(fā)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈電子商務(wù)、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)