MySQL中distinct與group by語句的一些比較及用法講解
在數(shù)據(jù)表中記錄了用戶驗(yàn)證時(shí)使用的書目,現(xiàn)在想取出所有書目,用DISTINCT和group by都取到了我想要的結(jié)果,但我發(fā)現(xiàn)返回結(jié)果排列不同,distinct會(huì)按數(shù)據(jù)存放順序一條條顯示,而group by會(huì)做個(gè)排序(一般是ASC)。
DISTINCT 實(shí)際上和 GROUP BY 操作的實(shí)現(xiàn)非常相似,只不過是在 GROUP BY 之后的每組中只取出一條記錄而已。所以,DISTINCT 的實(shí)現(xiàn)和 GROUP BY 的實(shí)現(xiàn)也基本差不多,沒有太大的區(qū)別,同樣可以通過松散索引掃描或者是緊湊索引掃描來實(shí)現(xiàn)。
那DISTINCT 和GROUP BY哪個(gè)效率更高?
DISTINCT操作只需要找出所有不同的值就可以了。而GROUP BY操作還要為其他聚集函數(shù)進(jìn)行準(zhǔn)備工作。從這一點(diǎn)上將,GROUP BY操作做的工作應(yīng)該比DISTINCT所做的工作要多一些。
但實(shí)際上,GROUP BY 效率會(huì)更高點(diǎn),為什么呢?對(duì)于DISTINCT操作,它會(huì)讀取了所有記錄,而GROUP BY需要讀取的記錄數(shù)量與分組的組數(shù)量一樣多,也就是說比實(shí)際存在的記錄數(shù)目要少很多。
下面來看MySQL中distinct及group by的一些用法分享。
CREATE TABLE `student` ( `name` varchar(20) NOT NULL DEFAULT '', `age` int(10) DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=latin1
1.測(cè)試一
select * from student;
a 5 a 5 c 0
用distinct過濾掉兩列都相同的記錄
select distinct name,age from student;
返回
a 5 c 0
2.測(cè)試二
將表student的數(shù)據(jù)改為如下:
select * from student;
c 2 c 5
select distinct name,age from student;
返回如下,說明distinct后面有多于一列的字段時(shí),只有每列的值完全相同才過濾
c 2 c 5
3.測(cè)試三
select * from student;
name age height c 2 123 c 2 456 b 20 222
group by按兩列同時(shí)分組
select name,age,sum(height) from student group by name,age;
b 20 222 c 2 579
group by按兩列同時(shí)分組,同時(shí)在后面加上having的條件
select name,age,sum(height) as n from student group by name,age having n > 500;
返回
c 2 579
4.測(cè)試四
關(guān)于group by后面limit的測(cè)試
select songname,sengerid,count(sengerid) as n from t_song group by songname,sengerid having n > 1 ORDER BY n DESC,songid ASC limit 10;
未知 8738 40 共同渡過 1432 24 風(fēng)繼續(xù)吹 1432 23 倩女幽魂 1432 23 無心睡眠 1432 23 羅百吉超嗨派對(duì)連續(xù)組曲 780 19 拒絕再玩 1432 19 風(fēng)再起時(shí) 1432 18 每天愛你多一些 1480 18 千言萬語 1794 18
select songname,sengerid,count(sengerid) as n from t_song group by songname,sengerid having n > 1 ORDER BY n DESC,songid ASC limit 5;
未知 8738 40 共同渡過 1432 24 風(fēng)繼續(xù)吹 1432 23 倩女幽魂 1432 23 無心睡眠 1432 23
經(jīng)過以上兩個(gè)測(cè)試可以看出,如果sql語句中含有l(wèi)imit,limit是對(duì)用group by進(jìn)行分組,并進(jìn)行相關(guān)計(jì)算以后的limit操作,而不是對(duì)limit后面的指定記錄數(shù)進(jìn)行分組,從n那一列的數(shù)據(jù)每一行的值都大于10就可以看出來。
5.測(cè)試五
用以下的兩種形式的distinct均可以得到相同的記錄數(shù),寫法不一樣,結(jié)果是一樣的。
select count(distinct(songid)) from feedback; select count(distinct songid) from feedback;
6.測(cè)試六
field singername is string,max(singername),如果singername有些列為空,有些列不為空,則max(singername)取非空的值,如果一列為zxx,一列為lady,則取zxx,按字母順利取的。
select feedback_id,songid,songname,max(singername),max(time) as new_time from feedback group by songid order by new_time desc;
7.Sql語句中where,group by,order by及l(fā)imit的順序
where xxx,group by xxx,order by xxx,limit xxx
8.關(guān)于group by與count的問題
如果sql語句中含有g(shù)roup by,則最好不要將count sql轉(zhuǎn)換為select count(*) from xxx,否則select與from之間的字段很有可能是后面要使用的,例如
select feedback_id,songid,songname,max(singername),max(time) as new_time from feedback group by songid order by new_time desc;
MySQL Query Error: SELECT COUNT(*) FROM feedback GROUP BY songid ORDER BY new_time DESC Error Info:Unknown column 'new_time' in 'order clause'
- mysql中distinct和group?by的區(qū)別淺析
- MySQL中的distinct與group by比較使用方法
- MySQL去重該使用distinct還是group by?
- Mysql中distinct與group by的去重方面的區(qū)別
- MySQL中distinct語句的基本原理及其與group by的比較
- MySQL中Distinct和Group By語句的基本使用教程
- MySQL中distinct與group by之間的性能進(jìn)行比較
- 解析mysql中:單表distinct、多表group by查詢?nèi)コ貜?fù)記錄
- MySQL中distinct和group by去重的區(qū)別解析
相關(guān)文章

詳解Mysql如何實(shí)現(xiàn)數(shù)據(jù)同步到Elasticsearch

MySQL建立唯一索引實(shí)現(xiàn)插入重復(fù)自動(dòng)更新

如何批量生成MySQL不重復(fù)手機(jī)號(hào)大表實(shí)例代碼

MySQL 配置優(yōu)化(多個(gè)參數(shù))

deepin20.1系統(tǒng)安裝MySQL8.0.23(超詳細(xì)的MySQL8安裝教程)

MySQL數(shù)據(jù)同步出現(xiàn)Slave_IO_Running:?No問題的解決

mysql數(shù)據(jù)庫應(yīng)付大流量網(wǎng)站的的3種架構(gòu)擴(kuò)展方式介紹