最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年01月13日 15:31:16   作者:jia58960  
這篇文章主要介紹了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ù)進行準(zhǔn)備工作。從這一點上將,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  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后面有多于一列的字段時,只有每列的值完全相同才過濾

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.測試四
關(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)再起時  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)過以上兩個測試可以看出,如果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無法選取非聚合列的解決方法

    Mysql無法選取非聚合列的解決方法

    這篇文章主要給大家介紹了關(guān)于Mysql無法選取非聚合列的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • mysql觸發(fā)器中包含select語句問題

    mysql觸發(fā)器中包含select語句問題

    這篇文章主要介紹了mysql觸發(fā)器中包含select語句問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • MySQL8.0.11安裝總結(jié)教程圖解

    MySQL8.0.11安裝總結(jié)教程圖解

    本文通過圖文并茂的形式給大家介紹了MySQL8.0.11安裝總結(jié),非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-05-05
  • Sql在單一表中檢索數(shù)據(jù)的方法詳解

    Sql在單一表中檢索數(shù)據(jù)的方法詳解

    這篇文章主要介紹了Sql在單一表中檢索數(shù)據(jù)的方法,SELECT語句是SQL中最常用的語句。它的用途是從一個或多個表中檢索信息。為了使用SELECT檢索表數(shù)據(jù),必須至少給出兩條信息:想選擇什么、從什么地方選擇
    2023-02-02
  • 解決MySQL批量新增或修改時出現(xiàn)異常:Lock?wait?timeout?exceeded

    解決MySQL批量新增或修改時出現(xiàn)異常:Lock?wait?timeout?exceeded

    這篇文章主要給大家介紹了關(guān)于如何解決MySQL批量新增或修改時出現(xiàn)異常:Lock?wait?timeout?exceeded;try?restarting?transaction的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • MySQL 回表,覆蓋索引,索引下推

    MySQL 回表,覆蓋索引,索引下推

    這篇文章主要介紹了MySQL 回表,覆蓋索引,索引下推,就是我們需要查詢的數(shù)據(jù)都在二級索引樹中,直接返回這種情況就叫做覆蓋索引
    2022-07-07
  • mysqli預(yù)處理編譯的深入理解

    mysqli預(yù)處理編譯的深入理解

    記得以前寫過mysqli的預(yù)處理的php教程,現(xiàn)在整理一下,需要的朋友可以參考
    2012-12-12
  • MySQL實現(xiàn)批量插入測試數(shù)據(jù)的方式總結(jié)

    MySQL實現(xiàn)批量插入測試數(shù)據(jù)的方式總結(jié)

    在開發(fā)過程中經(jīng)常需要一些測試數(shù)據(jù),?這個時候如果手敲的話,?十行二十行還好,?多了就很死亡了,?接下來介紹兩種常用的MySQL測試數(shù)據(jù)批量生成方式,希望對大家有所幫助
    2023-05-05
  • MySQL?中如何歸檔數(shù)據(jù)的實現(xiàn)方法

    MySQL?中如何歸檔數(shù)據(jù)的實現(xiàn)方法

    本文主要介紹了MySQL?中如何歸檔數(shù)據(jù)的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • MYSQL代碼 定期備份Mysql數(shù)據(jù)庫

    MYSQL代碼 定期備份Mysql數(shù)據(jù)庫

    Mysql自動備份腳本供大家參考,實現(xiàn)了定期備份Mysql數(shù)據(jù)庫,并且可以選在在每周的一天做指定目錄下文件的全面?zhèn)浞?,備份文件自動上傳到你指定的FTP上,保證了備份的可靠性。
    2009-04-04

最新評論

永川市| 于都县| 桐城市| 延川县| 杂多县| 大新县| 杭州市| 会泽县| 荣昌县| 固阳县| 恩平市| 左权县| 攀枝花市| 微山县| 彩票| 河南省| 龙胜| 名山县| 乡宁县| 仪陇县| 迁西县| 余江县| 黔江区| 酒泉市| 永泰县| 青岛市| 榆中县| 内丘县| 舒城县| 清流县| 确山县| 德州市| 漯河市| 内乡县| 融水| 岳西县| 大洼县| 大宁县| 读书| 台南县| 凌海市|