亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

SQL中distinct 和 row_number() over() 的區別及用法

2024-07-24 13:12:24
字體:
來源:轉載
供稿:網友

1 前言

在咱們編寫 SQL 語句操作數據庫中的數據的時候,有可能會遇到一些不太爽的問題,例如對于同一字段擁有相同名稱的記錄,我們只需要顯示一條,但實際上數據庫中可能含有多條擁有相同名稱的記錄,從而在檢索的時候,顯示多條記錄,這就有違咱們的初衷啦!因此,為了避免這種情況的發生,咱們就需要進行“去重”處理啦,那么何為“去重”呢?說白了,就是對同一字段讓擁有相同內容的記錄只顯示一條記錄。

那么,如何實現“去重”的功能呢?對此,咱們有兩種方式可以實現該功能。

第一種,在編寫 select 語句的時候,添加 distinct 關鍵詞;

第二種,在編寫 select 語句的時候,調用 row_number() over() 函數。

以上兩種方式都可以實現“去重”功能,那兩者之間有何異同呢?接下來,作者將給出詳細的說明。

2 distinct

在 SQL 中,關鍵字 distinct 用于返回唯一不同的值。其語法格式為:

SELECT DISTINCT 列名稱 FROM 表名稱

假設有一個表“CESHIDEMO”,包含兩個字段,分別 NAME 和 AGE,具體格式如下:

SQL中distinct,和,row_number(),over()區別,over()對比

觀察以上的表,咱們會發現:擁有相同 NAME 的記錄有兩條,擁有相同 AGE 的記錄有三條。如果咱們運行下面這條 SQL 語句,

/*** 其中 PPPRDER 為 Schema 的名字,即表 CESHIDEMO 在 PPPRDER 中*/select name from PPPRDER.CESHIDEMO

將會得到如下結果:

SQL中distinct,和,row_number(),over()區別,over()對比

觀察該結果,咱們會發現在以上的四條記錄中,包含兩條 NAME 值相同的記錄,即第 2 條記錄和第 3 條記錄的值都為“gavin”。那么,如果咱們想讓擁有相同 NAME 的記錄只顯示一條該如何實現呢?這時,就需要用到 distinct 關鍵字啦!接下來,運行如下 SQL 語句,

select distinct name from PPPRDER.CESHIDEMO

將會得到如下結果:

SQL中distinct,和,row_number(),over()區別,over()對比

觀察該結果,顯然咱們的要求得到實現啦!但是,咱們不禁會想到,如果將 distinct 關鍵字同時作用在兩個字段上將會產生什么效果呢?既然想到了,咱們就試試唄,運行如下 SQL 語句,

select distinct name, age from PPPRDER.CESHIDEMO

得到的結果如下所示:

SQL中distinct,和,row_number(),over()區別,over()對比

觀察該結果,哎呀,貌似沒有作用???她將全部的記錄都顯示出來了啊!其中 NAME 值相同的記錄有兩條,AGE 值相同的記錄有三條,完全沒有變化?。〉聦嵣?,結果就應該是這樣的。因為當 distinct 作用在多個字段的時候,她只會將所有字段值都相同的記錄“去重”掉,顯然咱們“可憐”的四條記錄并不滿足該條件,因此 distinct 會認為上面四條記錄并不相同??湛跓o憑,接下來,咱們再向表“CESHIDEMO”中添加一條完全相同的記錄,驗證一下即可。添加一條記錄后的表如下所示:

SQL中distinct,和,row_number(),over()區別,over()對比

再運行如下的 SQL 語句,

select distinct name, age from PPPRDER.CESHIDEMO

得到的結果如下所示:

SQL中distinct,和,row_number(),over()區別,over()對比

觀察該結果,完美的驗證了咱們上面的結論。

此外,有一點需要大家特別注意,即:關鍵字 distinct 只能放在 SQL 語句中所有字段的最前面才能起作用,如果放錯位置,SQL 不會報錯,但也不會起到任何效果。

3 row_number() over()

在 SQL Server 數據庫中,為咱們提供了一個函數 row_number() 用于給數據庫表中的記錄進行標號,在使用的時候,其后還跟著一個函數 over(),而函數 over() 的作用是將表中的記錄進行分組和排序。兩者使用的語法為:

ROW_NUMBER() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2)

意為:將表中的記錄按字段 COLUMN1進行分組,按字段 COLUMN2 進行排序,其中

PARTITION BY:表示分組ORDER BY:表示排序

接下來,咱們還用表“CESHIDEMO”中的數據進行測試。首先,給出沒有使用 row_number() over() 函數時查詢的結果,如下所示:

SQL中distinct,和,row_number(),over()區別,over()對比

然后,運行如下 SQL 語句,

select PPPRDER.CESHIDEMO.*, row_number() over(partition by age order by name desc) from PPPRDER.CESHIDEMO

得到的結果如下所示:

SQL中distinct,和,row_number(),over()區別,over()對比

從上面的結果可以看出,其在原表的基礎上,多了一列標有數字排序的列。那么反過來分析咱們運行的 SQL 語句,發現其確實按字段 AGE 的值進行分組了,也按字段 NAME 的值進行排序啦!因此,函數的功能得到了驗證。

接下來,咱們就研究如何用 row_number() over() 函數實現“去重”的功能。通過觀察上面的結果,咱們可以發現,如果以 NAME 分組,以 AGE 排序,然后再取每組的第一個記錄或許就可以實現“去重”的功能??!那么試試看,運行如下 SQL 語句,

/** 其中 rn 表示最后添加的那一列*/select * from (select PPPRDER.CESHIDEMO.*, row_number() over(partition by name order by age desc) rn from PPPRDER.CESHIDEMO)where rn = 1

運行后,得到的結果如下所示:

SQL中distinct,和,row_number(),over()區別,over()對比

觀察以上的結果,我們發現,哎呀,數據“去重”的功能一不小心就被咱們實現了??!不過很遺憾,如果咱們細心的話,會發現一個很不爽的事情,那就是在執行以上 SQL 語句進行“去重”的時候,有一條 NAME 值為“gavin”、AGE 值為“18”的記錄被過濾掉了,但是在現實生活會中,同名不同年齡的事情太正常了。

4 總結

通過閱讀及實踐以上內容,咱們已經知道了,無論是用關鍵字 distinct 還是用函數 row_number() over() 都可以實現數據“去重”的功能。但是在實現使用的過程中,咱們要特別注意兩者的用法特點以及區別。

在使用關鍵字 distinct 的時候,咱們要知道其作用于單個字段和多個字段的時候是有區別的,作用于單個字段時,其“去重”的是表中所有該字段值重復的數據;作用于多個字段的時候,其“去重”的表中所有字段(即 distinct 具體作用的多個字段)值都相同的數據。

在使用函數 row_number() over() 的時候,其是按先分組排序后,再取出每組的第一條記錄來進行“去重”的(在本篇博文中如此)。當然,在此處咱們還可以通過不同的限制條件來進行“去重”,具體如何實現,就需要大家自己去動腦思考啦!

最后,在本篇博文中,作者詳述了自己對用關鍵字 distinct 和函數 row_number() over() 進行數據“去重”的一些認識,希望以上的內容能夠對大家有所幫助!

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
69影院欧美专区视频| 成人中文字幕+乱码+中文字幕| 欧美性极品少妇精品网站| 精品国产欧美一区二区三区成人| 日韩成人av在线| 国产一区二区三区高清在线观看| 久久久国产视频91| 国产精品wwww| 久久国产精品久久久久| 日韩中文字幕视频在线观看| 欧美精品videos另类日本| 欧美国产精品人人做人人爱| 日韩精品一区二区视频| 91日本在线视频| zzijzzij亚洲日本成熟少妇| 国产精品入口免费视频一| 亚洲韩国青草视频| 国产日韩换脸av一区在线观看| 欧美精品第一页在线播放| 自拍偷拍免费精品| 欧美影院久久久| 久久久中文字幕| 精品日韩美女的视频高清| 亚洲专区中文字幕| 亚洲3p在线观看| 亚洲美女精品久久| 亚洲片国产一区一级在线观看| 欧美视频不卡中文| 中文字幕日韩综合av| 久久精品国产一区| 欧美成人黑人xx视频免费观看| 伊人伊成久久人综合网站| 中日韩美女免费视频网址在线观看| 久久久精品视频在线观看| 91九色国产在线| 中文字幕日韩精品有码视频| 日韩欧美成人精品| 国内偷自视频区视频综合| 啊v视频在线一区二区三区| 亚洲精品美女免费| 亚洲国产一区二区三区四区| 久久久噜噜噜久久中文字免| 91在线精品视频| 欧美久久精品一级黑人c片| 91免费国产网站| 亚洲欧美国产一区二区三区| 亚洲国产成人精品一区二区| 亚洲女同精品视频| 亚洲人成电影网站| 成人中心免费视频| 亚洲国产精品资源| 久久国产精品久久久久久久久久| 久久天堂av综合合色| 久久久久久久久久久久久久久久久久av| 日韩精品中文字幕在线播放| 日韩欧美国产高清91| 成人免费在线视频网址| 色婷婷av一区二区三区久久| 国产福利视频一区| 色偷偷888欧美精品久久久| 国产欧美 在线欧美| 日韩av中文字幕在线| 国产亚洲精品久久久久久牛牛| 久久久久久91香蕉国产| 亚洲偷熟乱区亚洲香蕉av| 欧美性猛交xxxx| 一区二区三区www| 91精品国产精品| 色综合老司机第九色激情| 96pao国产成视频永久免费| 国产精品大陆在线观看| 91精品综合久久久久久五月天| 亚洲曰本av电影| 中文字幕国产亚洲2019| 日韩精品极品在线观看| 欧美电影电视剧在线观看| 欧美视频二区36p| 亚洲人成伊人成综合网久久久| 国产日韩欧美成人| 国产精品永久免费视频| 国产一区二区三区在线看| 久久久999精品免费| 成人激情在线播放| 日韩av在线网址| 欧美电影在线观看网站| 91九色视频在线| 亚洲欧美国产一区二区三区| 国产成人a亚洲精品| 日韩av一区在线观看| 亚洲欧美综合图区| 亚洲欧美一区二区三区四区| 久久久久久国产三级电影| 精品爽片免费看久久| 国产精品影片在线观看| 欧美三级欧美成人高清www| 97超级碰碰碰久久久| 国产精品久久久久久久久久久不卡| 成人免费网视频| 久久综合免费视频影院| 日韩视频永久免费观看| 亚洲电影天堂av| 国产精品视频午夜| 国产精品视频久久久久| 国产亚洲美女精品久久久| 亚洲精品第一国产综合精品| 8090成年在线看片午夜| 26uuu另类亚洲欧美日本老年| 国产国语刺激对白av不卡| 91精品91久久久久久| 色偷偷av一区二区三区| 亚洲欧洲在线观看| 18久久久久久| 亚洲欧美另类自拍| 欧美成人网在线| 免费av一区二区| 中文亚洲视频在线| www.国产一区| 8090理伦午夜在线电影| 日韩av在线天堂网| 国产精品999999| 国产91精品黑色丝袜高跟鞋| 久久久黄色av| 亚洲在线观看视频| 91av在线不卡| 色婷婷av一区二区三区久久| 亚洲精品天天看| 久久精品精品电影网| 蜜臀久久99精品久久久久久宅男| 国语自产精品视频在线看抢先版图片| 欧美日韩午夜激情| 欧美国产日韩xxxxx| 日本精品久久中文字幕佐佐木| 日韩在线播放视频| 国产欧洲精品视频| 日韩av手机在线观看| 91国产美女在线观看| 国产亚洲视频在线观看| 精品无人区太爽高潮在线播放| 九九九热精品免费视频观看网站| 亚洲成成品网站| 亚洲春色另类小说| 日韩精品www| 91久久国产精品| 国产精品视频一区二区高潮| 热久久免费视频精品| 狠狠爱在线视频一区| 亚洲精品一区在线观看香蕉| 色综合久久天天综线观看| 欧美日韩亚洲精品内裤| 欧美精品制服第一页| 91久久久国产精品| 性欧美长视频免费观看不卡| 亚洲精品国产精品久久清纯直播| 久久天天躁狠狠躁夜夜躁2014| 一本色道久久88精品综合| 久久久久久国产精品久久| 色偷偷亚洲男人天堂| 日韩欧美一区视频| 最近2019免费中文字幕视频三| 亚洲国产精品va在线| 久久久久久国产三级电影| 久久国产加勒比精品无码| 国产在线a不卡| 国产精品电影在线观看|