在數據表中記錄了用戶驗證時使用的書目,現在想取出所有書目,用DISTINCT和group by都取到了我想要的結果,但我發現返回結果排列不同,distinct會按數據存放順序一條條顯示,而group by會做個排序(一般是ASC)。
DISTINCT 實際上和 GROUP BY 操作的實現非常相似,只不過是在 GROUP BY 之後的每組中只取出一條記錄而已。所以,DISTINCT 的實現和 GROUP BY 的實現也基本差不多,沒有太大的區別,同樣可以通過松散索引掃描或者是緊湊索引掃描來實現。
那DISTINCT 和GROUP BY哪個效率更高?
DISTINCT操作只需要找出所有不同的值就可以了。而GROUP BY操作還要為其他聚集函數進行準備工作。從這一點上將,GROUP BY操作做的工作應該比DISTINCT所做的工作要多一些。
但實際上,GROUP BY 效率會更高點,為什麽呢?對於DISTINCT操作,它會讀取了所有記錄,而GROUP BY需要讀取的記錄數量與分組的組數量一樣多,也就是說比實際存在的記錄數目要少很多。
下面來看mysql中distinct及group by的一些用法分享。
CREATE TABLE `student` ( `name` varchar(20) NOT NULL DEFAULT '', `age` int(10) DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=latin1
1.測試一
select * from student;
a 5 a 5 c 0
用distinct過濾掉兩列都相同的記錄
select distinct name,age from student;
返回
a 5 c 0
2.測試二
將表student的數據改為如下:
select * from student;
c 2 c 5
select distinct name,age from student;
返回如下,說明distinct後面有多於一列的字段時,只有每列的值完全相同才過濾
c 2 c 5
3.測試三
select * from student;
name age height c 2 123 c 2 456 b 20 222
group by按兩列同時分組
select name,age,sum(height) from student group by name,age;
b 20 222 c 2 579
group by按兩列同時分組,同時在後面加上having的條件
select name,age,sum(height) as n from student group by name,age having n > 500;
返回
c 2 579
4.測試四
關於group by後面limit的測試
代碼如下:
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 風繼續吹 1432 23 倩女幽魂 1432 23 無心睡眠 1432 23 羅百吉超嗨派對連續組曲 780 19 拒絕再玩 1432 19 風再起時 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 風繼續吹 1432 23 倩女幽魂 1432 23 無心睡眠 1432 23
經過以上兩個測試可以看出,如果sql語句中含有limit,limit是對用group by進行分組,並進行相關計算以後的limit操作,而不是對limit後面的指定記錄數進行分組,從n那一列的數據每一行的值都大於10就可以看出來。
5.測試五
用以下的兩種形式的distinct均可以得到相同的記錄數,寫法不一樣,結果是一樣的。
select count(distinct(songid)) from feedback; select count(distinct songid) from feedback;
6.測試六
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及limit的順序
where xxx,group by xxx,order by xxx,limit xxx
8.關於group by與count的問題
如果sql語句中含有group by,則最好不要將count sql轉換為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'
Tags:
文章來源: