我們天天都在跟數(shù)據(jù)庫打交道,寫下的代碼不計其數(shù),寫下的SQL更是可以繞地球幾圈。這里收集關(guān)于SQL的神奇語法及用法,雖然你可能沒有用過,但這些SQL卻可以在關(guān)鍵的時候,派上用場。
我對SQL語句的理解,可以比作一座橋梁,將零散的數(shù)據(jù)組合起來,拿到我所需要的有效信息。也以此記錄一下使用心得
一. 語法及基礎(chǔ)用法
注意: row_number()不能單獨使用,需要和over(order by col)一起使用。
語法1:
row_number() over(ORDER BY col)
意思:簡單的說row_number()從1開始,為每一條分組記錄返回一個數(shù)字,這里的ROW_NUMBER() OVER (ORDER BY xlh
DESC) 是先把xlh列降序,再為降序以后的每條xlh記錄返回一個序號。
語法2:
row_number() over(PARTITION BY col1 ORDER BY col2)
意思:表示根據(jù)col1分組,在分組內(nèi)部根據(jù) col2排序,而此函數(shù)計算的值就表示每組內(nèi)部排序后的順序編號(組內(nèi)連續(xù)的唯一的)
關(guān)于Parttion by:
Parttion by關(guān)鍵字是SQL中分析性函數(shù)的一部分,用于給結(jié)果集進行分區(qū)。它和聚合函數(shù)Group
by不同的地方在于它只是將原始數(shù)據(jù)進行名次排列,能夠返回一個分組中的多條記錄(記錄數(shù)不變),而Group
by是對原始數(shù)據(jù)進行聚合統(tǒng)計,一般只有一條反映統(tǒng)計值的結(jié)果(每組返回一條)。
Parttion by 后面如果想按多個字段分組,則以逗號分隔。
row_number() over(PARTITION BY col1,col3,col4 ORDER BY col2)
實例:
(1) 建表造數(shù)據(jù):
create table employee (empid int ,deptid int ,salary decimal(10,2)); insert
into employee values(1,10,5500.00); insert into employee values(2,10,4500.00);
insert into employee values(3,20,1900.00); insert into employee
values(4,20,4800.00); insert into employee values(5,40,6500.00); insert into
employee values(6,40,14500.00); insert into employee values(7,40,44500.00);
insert into employee values(8,50,6500.00); insert into employee
values(9,50,7500.00);
數(shù)據(jù)顯示為:
(2) 需求:根據(jù)部門分組,顯示每個部門的工資等級
sql:
SELECT *, row_number() over(PARTITION by deptid ORDER BY salary desc) as score
FROM employee
預(yù)期結(jié)果:
二. 真實案例
通過上面基礎(chǔ)語法和使用,我們也只是簡單地知道row_number()可以用來編號排序使用,以及分組內(nèi)排序兩種情景。通過對其有一個了解之后,你的心中充滿疑問,
如果對于在項目中,我們又可以拿它來做什么,又可以解決什么樣的問題。
這個語法也是我最近工作內(nèi)容的時候,才接觸到的,之前也只是模模糊糊地停留在知道有這個,而在工作中沒實際用過它。
上面介紹的是在單表中的一個操作,那么對于稍微復(fù)雜的多表關(guān)聯(lián)操作是否有考慮過
下面舉個貼近身邊的實例來學(xué)習(xí)一下SQL用法:
左連接表中可能有多條數(shù)據(jù)滿足情況,但只取滿足條件中的第一條,即取max 自關(guān)聯(lián)的查詢數(shù)據(jù)
select a.*, b.* from girl g, (select *, row_number() over(ORDER BY like desc)
as rn from boy) b where b.rn = 1 and g.like = b.like
上面的意思:girl表和boy表關(guān)聯(lián),讓girl找到最喜歡的那個boy;boy表是根據(jù)喜好值排序。
這樣就可以用上它了。
三. 總結(jié)
row_number()的用途非常廣泛,排序最好用它,它會為查詢出來的每一行記錄生成一個序號,依次排序且不會重復(fù),注意使用row_number函數(shù)時必須要用over子句選擇對某一列進行排序才能生成序號。
同時,在使用排名函數(shù)的時候需要注意以下三點:
*
1、排名函數(shù)必須有 OVER 子句。
*
2、排名函數(shù)必須有包含 ORDER BY 的 OVER 子句。
*
3、分組內(nèi)從1開始排序。
這個方法的多數(shù)據(jù)庫兼容性也是很好的,如果你要與數(shù)據(jù)庫打交道,也請收藏好它。
熱門工具 換一換
感谢您访问我们的网站,您可能还对以下资源感兴趣:
调教肉文小说-国产成本人片免费av-空姐av种子无码-在线观看免费午夜视频-综合久久精品激情-国产成人丝袜视频在线观看软件-大芭区三区四区无码-啊啊好爽啊啊插啊用力啊啊-wanch视频网-国产精品成人a免费观看