国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

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

2024-07-24 13:08:44
字體:
供稿:網(wǎng)友
這篇文章主要介紹了MySQL中distinct與group by的一些比較及用法講解,二者在查詢操作中的用法有很多相似之處,需要的朋友可以參考下
 

在數(shù)據(jù)表中記錄了用戶驗證時使用的書目,現(xiàn)在想取出所有書目,用DISTINCT和group by都取到了我想要的結(jié)果,但我發(fā)現(xiàn)返回結(jié)果排列不同,distinct會按數(shù)據(jù)存放順序一條條顯示,而group by會做個排序(一般是ASC)。 
 
        DISTINCT 實際上和 GROUP BY 操作的實現(xiàn)非常相似,只不過是在 GROUP BY 之后的每組中只取出一條記錄而已。所以,DISTINCT 的實現(xiàn)和 GROUP BY 的實現(xiàn)也基本差不多,沒有太大的區(qū)別,同樣可以通過松散索引掃描或者是緊湊索引掃描來實現(xiàn)。 
 
      那DISTINCT 和GROUP BY哪個效率更高? 
 
       DISTINCT操作只需要找出所有不同的值就可以了。而GROUP BY操作還要為其他聚集函數(shù)進行準備工作。從這一點上將,GROUP BY操作做的工作應(yīng)該比DISTINCT所做的工作要多一些。 
 
      但實際上,GROUP BY 效率會更高點,為什么呢?對于DISTINCT操作,它會讀取了所有記錄,而GROUP BY需要讀取的記錄數(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.測試一

select * from student;   

   

a  5a  5c  0

用distinct過濾掉兩列都相同的記錄

select distinct name,age from student;

返回

a  5c  0

2.測試二
將表student的數(shù)據(jù)改為如下:

select * from student;
c  2c  5
select distinct name,age from student;

返回如下,說明distinct后面有多于一列的字段時,只有每列的值完全相同才過濾

c  2c  5

3.測試三

select * from student;
name age heightc  2  123c  2  456b  20  222

group by按兩列同時分組

select name,age,sum(height) from student group by name,age;
b  20  222c  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.測試四
關(guān)于group by后面limit的測試

 

復(fù)制代碼代碼如下:

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風繼續(xù)吹  1432  23倩女幽魂  1432  23無心睡眠  1432  23羅百吉超嗨派對連續(xù)組曲  780  19拒絕再玩  1432  19風再起時  1432  18每天愛你多一些  1480  18千言萬語  1794  18

 

復(fù)制代碼代碼如下:

 

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風繼續(xù)吹  1432  23倩女幽魂  1432  23無心睡眠  1432  23

經(jīng)過以上兩個測試可以看出,如果sql語句中含有l(wèi)imit,limit是對用group by進行分組,并進行相關(guān)計算以后的limit操作,而不是對limit后面的指定記錄數(shù)進行分組,從n那一列的數(shù)據(jù)每一行的值都大于10就可以看出來。

5.測試五
用以下的兩種形式的distinct均可以得到相同的記錄數(shù),寫法不一樣,結(jié)果是一樣的。

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,按字母順利取的。

 

復(fù)制代碼代碼如下:

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之間的字段很有可能是后面要使用的,例如

 

復(fù)制代碼代碼如下:

select feedback_id,songid,songname,max(singername),max(time) as new_time from feedback group by songid order by new_time desc;

 

 


 

 

復(fù)制代碼代碼如下:

 

MySQL Query Error: SELECT COUNT(*) FROM feedback GROUP BY songid ORDER BY new_time DESC Error Info:Unknown column 'new_time' in 'order clause'

 


注:相關(guān)教程知識閱讀請移步到MYSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 南木林县| 新源县| 隆回县| 大丰市| 山丹县| 丹寨县| 榕江县| 陆河县| 赤壁市| 连云港市| 桐梓县| 丰镇市| 惠东县| 廉江市| 天祝| 兰坪| 通城县| 天水市| 象州县| 卢龙县| 连平县| 名山县| 项城市| 新河县| 武宁县| 上虞市| 田林县| 隆回县| 浏阳市| 化德县| 澄迈县| 林甸县| 永吉县| 开原市| 宣武区| 腾冲县| 台北县| 手游| 商南县| 延长县| 赤城县|