欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年01月13日 15:31:16   作者:jia58960  
這篇文章主要介紹了MySQL中distinct與group by的一些比較及用法講解,二者在查詢操作中的用法有很多相似之處,需要的朋友可以參考下

在數(shù)據(jù)表中記錄了用戶驗(yàn)證時(shí)使用的書目,現(xiàn)在想取出所有書目,用DISTINCT和group by都取到了我想要的結(jié)果,但我發(fā)現(xiàn)返回結(jié)果排列不同,distinct會按數(shù)據(jù)存放順序一條條顯示,而group by會做個(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 效率會更高點(diǎn),為什么呢?對于DISTINCT操作,它會讀取了所有記錄,而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.測試一

select * from student;   

  

a  5
a  5
c  0

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

select distinct name,age from student;

返回

a  5
c  0

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

select * from student;
c  2
c  5

select distinct name,age from student;

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

c  2
c  5

3.測試三

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.測試四
關(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
風(fēng)繼續(xù)吹  1432  23
倩女幽魂  1432  23
無心睡眠  1432  23
羅百吉超嗨派對連續(xù)組曲  780  19
拒絕再玩  1432  19
風(fēng)再起時(shí)  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
風(fēng)繼續(xù)吹  1432  23
倩女幽魂  1432  23
無心睡眠  1432  23

經(jīng)過以上兩個(gè)測試可以看出,如果sql語句中含有l(wèi)imit,limit是對用group by進(jìn)行分組,并進(jìn)行相關(guān)計(jì)算以后的limit操作,而不是對limit后面的指定記錄數(shù)進(jìn)行分組,從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數(shù)據(jù)庫基礎(chǔ)之分組查詢詳解

    MySql數(shù)據(jù)庫基礎(chǔ)之分組查詢詳解

    這篇文章主要介紹了mysql按照時(shí)間分組查詢的語句,非常實(shí)用,sql語句簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • 詳解Mysql如何實(shí)現(xiàn)數(shù)據(jù)同步到Elasticsearch

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

    要通過Elasticsearch實(shí)現(xiàn)數(shù)據(jù)檢索,首先要將Mysql中的數(shù)據(jù)導(dǎo)入Elasticsearch,并實(shí)現(xiàn)數(shù)據(jù)源與Elasticsearch數(shù)據(jù)同步,這里使用的數(shù)據(jù)源是Mysql數(shù)據(jù)庫。目前Mysql與Elasticsearch常用的同步機(jī)制大多是基于插件實(shí)現(xiàn)的,希望這篇文章能對大家有所幫助
    2021-11-11
  • MySQL建立唯一索引實(shí)現(xiàn)插入重復(fù)自動更新

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

    這篇文章給大家分享的是當(dāng)向數(shù)據(jù)插入數(shù)據(jù)時(shí),判斷字段是不是存在,存在執(zhí)行更新操作,如果不存在就執(zhí)行插入操作的方法,有需要的朋友們可以參考借鑒。
    2016-09-09
  • 如何批量生成MySQL不重復(fù)手機(jī)號大表實(shí)例代碼

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

    這篇文章主要給大家介紹了關(guān)于如何批量生成MySQL不重復(fù)手機(jī)號大表的相關(guān)資料,,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • MySQL 配置優(yōu)化(多個(gè)參數(shù))

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

    安裝MySQL后,配置文件my.cnf在 /MySQL安裝目錄/share/mysql目錄中,該目錄中還包含多個(gè)配置文件可供參考,有my-large.cnf ,my-huge.cnf, my-medium.cnf,my-small.cnf,分別對應(yīng)大中小型數(shù)據(jù)庫應(yīng)用的配置。win環(huán)境下即存在于MySQL安裝目錄中的.ini文件
    2016-05-05
  • deepin20.1系統(tǒng)安裝MySQL8.0.23(超詳細(xì)的MySQL8安裝教程)

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

    這篇文章主要介紹了deepin20.1系統(tǒng)安裝MySQL8.0.23(最美國產(chǎn)Liunx系統(tǒng),最詳細(xì)的MySQL8安裝教程),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • MySQL數(shù)據(jù)同步出現(xiàn)Slave_IO_Running:?No問題的解決

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

    本人最近工作中遇到了Slave_IO_Running:NO報(bào)錯的情況,通過查找相關(guān)資料終于解決了,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)同步出現(xiàn)Slave_IO_Running:?No問題的解決方法,需要的朋友可以參考下
    2023-05-05
  • 談?wù)凪ySQL中的隱式轉(zhuǎn)換

    談?wù)凪ySQL中的隱式轉(zhuǎn)換

    這篇文章主要介紹了MySQL中的隱式轉(zhuǎn)換的相關(guān)資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-10-10
  • 磁盤寫滿導(dǎo)致MySQL復(fù)制失敗的解決方案

    磁盤寫滿導(dǎo)致MySQL復(fù)制失敗的解決方案

    這篇文章主要介紹了磁盤寫滿導(dǎo)致MySQL復(fù)制失敗的解決方案,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-04-04
  • mysql數(shù)據(jù)庫應(yīng)付大流量網(wǎng)站的的3種架構(gòu)擴(kuò)展方式介紹

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

    這篇文章主要介紹了mysql數(shù)據(jù)庫應(yīng)付大流量網(wǎng)站的的3種架構(gòu)擴(kuò)展方式介紹,它們分別是讀寫分離、垂直分區(qū)、水平分區(qū),本文分別對它們做了講解,需要的朋友可以參考下
    2014-07-07

最新評論