<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網(wǎng) 責編:小采 時間:2020-11-09 20:38:34
        文檔

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

        SQL中distinct和row_number()over()的區(qū)別及用法:1 前言 在咱們編寫 SQL 語句操作數(shù)據(jù)庫中的數(shù)據(jù)的時候,有可能會遇到一些不太爽的問題,例如對于同一字段擁有相同名稱的記錄,我們只需要顯示一條,但實際上數(shù)據(jù)庫中可能含有多條擁有相同名稱的記錄,從而在檢索的時候,顯示多條記錄,這就有違咱們的初衷啦!
        推薦度:
        導讀SQL中distinct和row_number()over()的區(qū)別及用法:1 前言 在咱們編寫 SQL 語句操作數(shù)據(jù)庫中的數(shù)據(jù)的時候,有可能會遇到一些不太爽的問題,例如對于同一字段擁有相同名稱的記錄,我們只需要顯示一條,但實際上數(shù)據(jù)庫中可能含有多條擁有相同名稱的記錄,從而在檢索的時候,顯示多條記錄,這就有違咱們的初衷啦!

        1 前言

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

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

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

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

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

        2 distinct

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

        SELECT DISTINCT 列名稱 FROM 表名稱

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

        CESHIDEMO

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

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

        將會得到如下結(jié)果:

        name

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

        select distinct name from PPPRDER.CESHIDEMO

        將會得到如下結(jié)果:

        distinct

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

        select distinct name, age from PPPRDER.CESHIDEMO

        得到的結(jié)果如下所示:

        nameandage

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

        添加一條記錄

        再運行如下的 SQL 語句,

        select distinct name, age from PPPRDER.CESHIDEMO

        得到的結(jié)果如下所示:

        nameandage

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

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

        3 row_number() over()

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

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

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

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

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

        添加一條記錄

        然后,運行如下 SQL 語句,

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

        得到的結(jié)果如下所示:

        函數(shù)

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

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

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

        運行后,得到的結(jié)果如下所示:

        rn

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

        4 總結(jié)

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

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

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

        最后,在本篇博文中,作者詳述了自己對用關(guān)鍵字 distinct 和函數(shù) row_number() over() 進行數(shù)據(jù)“去重”的一些認識,希望以上的內(nèi)容能夠?qū)Υ蠹矣兴鶐椭?/p>

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

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        SQL中distinct和row_number()over()的區(qū)別及用法:1 前言 在咱們編寫 SQL 語句操作數(shù)據(jù)庫中的數(shù)據(jù)的時候,有可能會遇到一些不太爽的問題,例如對于同一字段擁有相同名稱的記錄,我們只需要顯示一條,但實際上數(shù)據(jù)庫中可能含有多條擁有相同名稱的記錄,從而在檢索的時候,顯示多條記錄,這就有違咱們的初衷啦!
        推薦度:
        標簽: sql 的區(qū) sql中
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产成人99精品激情在线| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲免费日韩无码系列| 美女露隐私全部免费直播| 日韩高清在线免费观看| 亚洲七久久之综合七久久| 成人毛片免费视频| 激情无码亚洲一区二区三区| 日本媚薬痉挛在线观看免费| 亚洲AV男人的天堂在线观看| 免费av欧美国产在钱| 亚洲中文字幕乱码一区| 女人张开腿给人桶免费视频 | 亚洲国产AV一区二区三区四区| 天天看片天天爽_免费播放| 亚洲色欲啪啪久久WWW综合网| 夜夜嘿视频免费看| 美女黄频视频大全免费的| 精品亚洲一区二区三区在线观看| a高清免费毛片久久| 国产V亚洲V天堂无码久久久| 2021在线观看视频精品免费| 久久精品国产亚洲av麻豆蜜芽| 午夜色a大片在线观看免费| 美女18一级毛片免费看| 亚洲精品亚洲人成人网| 97在线视频免费播放| 日韩亚洲国产高清免费视频| 免费一看一级毛片人| 嫩草影院在线播放www免费观看| 亚洲黄色片免费看| 爽爽日本在线视频免费| 老司机精品免费视频| 亚洲美女大bbbbbbbbb| 国产精品免费播放| 日本视频在线观看永久免费| 亚洲一区二区三区无码国产| 免费在线观看你懂的| 午夜免费啪视频在线观看| 国产成人亚洲综合网站不卡| 亚洲日韩精品一区二区三区无码 |