程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL中distinct與group by語句的一些比較及用法講解

MySQL中distinct與group by語句的一些比較及用法講解

編輯:關於MYSQL數據庫

在數據表中記錄了用戶驗證時使用的書目,現在想取出所有書目,用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'


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved