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

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

編輯:MySQL綜合教程

MySQL中distinct與group by語句的一些比擬及用法講授。本站提示廣大學習愛好者:(MySQL中distinct與group by語句的一些比擬及用法講授)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL中distinct與group by語句的一些比擬及用法講授正文


在數據表中記載了用戶驗證時應用的書目,如今想掏出一切書目,用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