由于Oracle不支持select top 語(yǔ)句,所以在Oracle中經(jīng)常是用order by 跟rownum 的組合來(lái)實(shí)現(xiàn)select top n的查詢。 簡(jiǎn)單地說(shuō),實(shí)現(xiàn)方法如下所示: select 列名1 ...列名n from(select 列名1 ...列名n from 表名 order by 列名1)where rownum =N(抽出記錄數(shù)) order by rownum asc 如:select id,name from (select id,name from student order by name) where rownum=10 order by rownum asc 按姓名排序取出前十條數(shù)據(jù) 附:取100-150條數(shù)據(jù)的方法1. 最佳選擇:利用分析函數(shù) row_number() over ( partition by col1 order by col2 )比如想取出100-150條記錄,按照tname排序 select tname,tabtype from ( select tname,tabtype,row_number() over ( order by tname ) rn from tab ) where rn between 100 and 150; 2. 使用rownum 虛列 select tname,tabtype from ( select tname,tabtype,rownum rn from tab
創(chuàng)新互聯(lián)建站長(zhǎng)期為上千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為金溪企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)、做網(wǎng)站,金溪網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
下面是關(guān)于rownum的介紹
================================
rownum和row_number()
over()的使用
rownum是oracle從8開始提供的一個(gè)偽列,是把sql出來(lái)的結(jié)果進(jìn)行編號(hào),始終從1開始,常見(jiàn)的用途就是用來(lái)分頁(yè)輸出.
比如select
*from
torderdetail
a
where
rownum
=
10
這條語(yǔ)句就是輸出前10條紀(jì)錄,在這里用途上類似于sql
sever的top,不過(guò)rownum對(duì)于指定編號(hào)區(qū)間的輸出應(yīng)該說(shuō)更強(qiáng)大select
*from
(select
a.*,
rownum
rn
from
torderdetail
a)
where
rn
=
10
and
rn
=
20
這條語(yǔ)句即是輸出第10到第20條紀(jì)錄,這里之所以用rownum
rn,是把rownum轉(zhuǎn)成實(shí)例,因?yàn)閞ownum本身只能用
=的比較方式,只有轉(zhuǎn)成實(shí)列,這樣就可做
=的比較了。
在實(shí)際用途中,常常會(huì)要求取最近的幾條紀(jì)錄,這就需要先對(duì)紀(jì)錄進(jìn)行排序后再取rownum
=一般常見(jiàn)的select
*from
(select
a.*
from
torderdetail
a
order
by
order_date
desc)
where
rownum
=
10
而在csdn曾經(jīng)發(fā)生過(guò)討論,關(guān)于取近的10條紀(jì)錄,有人給出這樣的語(yǔ)句select
a.*
from
torderdetail
a
where
rownum
=
10
order
by
order_date
desc
之所以會(huì)出現(xiàn)這樣的語(yǔ)句,主要是從效率上的考慮,前面條語(yǔ)句,是要進(jìn)行全表掃描后再排序,然后再取10條紀(jì)錄,后一條語(yǔ)句則不會(huì)全表掃描,只會(huì)取出10條紀(jì)錄,很明顯后條語(yǔ)句的效率會(huì)高許多。
那為什么會(huì)有爭(zhēng)議呢,那就在于在執(zhí)行順序上爭(zhēng)議,是先執(zhí)行排序取10條紀(jì)錄,還是取10條紀(jì)錄,再排序呢??jī)煞N順序取出來(lái)的結(jié)果是截然相反的,先排序再取10條,就是取最近的10條,而先取10條,再排序,則取出的最早的10條紀(jì)錄。對(duì)于此語(yǔ)句,普遍的認(rèn)為執(zhí)行順序是先取10條紀(jì)錄再排序的。所以此語(yǔ)句應(yīng)該是錯(cuò)誤。但實(shí)際上并非如此,此語(yǔ)句的執(zhí)行順序和order
by的字段有關(guān)系,如果你order
by
的字段是pk,則是先排序,再取10條(速度比第一種語(yǔ)句快),而排序字段不是pk
時(shí),是先取10條再排序,此時(shí)結(jié)果就與要求不一樣了,所以第二種寫法一定要在排序字段是主鍵的情況下才能保證結(jié)果正確。
row_number()
over()這個(gè)分析函數(shù)是從9i開始提供的,一般的用途和rownum差不多。
一般寫法row_number()
over(
order
by
order_date
desc)
生成的順序和rownum的語(yǔ)句一樣,效率也一樣(對(duì)于同樣有order
by
的rownum語(yǔ)句來(lái)說(shuō)),所以在這種情況下兩種用法是一樣的。
下面是關(guān)于rownum的介紹 ================================ Rownum和row_number() over()的使用 ROWNUM是Oracle從8開始提供的一個(gè)偽列,是把SQL出來(lái)的結(jié)果進(jìn)行編號(hào),始終從1開始,常見(jiàn)的用途就是用來(lái)分頁(yè)輸出. 比如SELECT *FROM torderdetail a WHERE ROWNUM = 10 這條語(yǔ)句就是輸出前10條紀(jì)錄,在這里用途上類似于sql sever的top,不過(guò)rownum對(duì)于指定編號(hào)區(qū)間的輸出應(yīng)該說(shuō)更強(qiáng)大SELECT *FROM (SELECT a.*, ROWNUM rn FROM torderdetail a) WHERE rn = 10 AND rn = 20 這條語(yǔ)句即是輸出第10到第20條紀(jì)錄,這里之所以用rownum rn,是把rownum轉(zhuǎn)成實(shí)例,因?yàn)閞ownum本身只能用 =的比較方式,只有轉(zhuǎn)成實(shí)列,這樣就可做 =的比較了。 在實(shí)際用途中,常常會(huì)要求取最近的幾條紀(jì)錄,這就需要先對(duì)紀(jì)錄進(jìn)行排序后再取rownum =一般常見(jiàn)的SELECT *FROM (SELECT a.* FROM torderdetail a ORDER BY order_date DESC) WHERE ROWNUM = 10 而在CSDN曾經(jīng)發(fā)生過(guò)討論,關(guān)于取近的10條紀(jì)錄,有人給出這樣的語(yǔ)句SELECT a.* FROM torderdetail a WHERE ROWNUM = 10 ORDER BY order_date DESC 之所以會(huì)出現(xiàn)這樣的語(yǔ)句,主要是從效率上的考慮,前面條語(yǔ)句,是要進(jìn)行全表掃描后再排序,然后再取10條紀(jì)錄,后一條語(yǔ)句則不會(huì)全表掃描,只會(huì)取出10條紀(jì)錄,很明顯后條語(yǔ)句的效率會(huì)高許多。 那為什么會(huì)有爭(zhēng)議呢,那就在于在執(zhí)行順序上爭(zhēng)議,是先執(zhí)行排序取10條紀(jì)錄,還是取10條紀(jì)錄,再排序呢??jī)煞N順序取出來(lái)的結(jié)果是截然相反的,先排序再取10條,就是取最近的10條,而先取10條,再排序,則取出的最早的10條紀(jì)錄。對(duì)于此語(yǔ)句,普遍的認(rèn)為執(zhí)行順序是先取10條紀(jì)錄再排序的。所以此語(yǔ)句應(yīng)該是錯(cuò)誤。但實(shí)際上并非如此,此語(yǔ)句的執(zhí)行順序和order by的字段有關(guān)系,如果你order by 的字段是pk,則是先排序,再取10條(速度比第一種語(yǔ)句快),而排序字段不是PK 時(shí),是先取10條再排序,此時(shí)結(jié)果就與要求不一樣了,所以第二種寫法一定要在排序字段是主鍵的情況下才能保證結(jié)果正確。 Row_number() over()這個(gè)分析函數(shù)是從9I開始提供的,一般的用途和rownum差不多。 一般寫法row_number() over( order by order_date desc) 生成的順序和rownum的語(yǔ)句一樣,效率也一樣(對(duì)于同樣有order by 的rownum語(yǔ)句來(lái)說(shuō)),所以在這種情況下兩種用法是一樣的。
oracle中前N條數(shù)據(jù)可用row_number來(lái)實(shí)現(xiàn)。
如表中數(shù)據(jù):
現(xiàn)在要求按照ID倒序,取出前十位:
oracle中執(zhí)行方法:
select?t.id,t.name?from
(select?test.*,row_number()?over?(order?by?id?desc)?rn?from?test)?t
where?rn=10;
結(jié)果:
當(dāng)前文章:oracle怎么查看前十條記錄,oracle查詢前十條記錄
本文鏈接:http://chinadenli.net/article10/heiedo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)公司、標(biāo)簽優(yōu)化、品牌網(wǎng)站制作、定制網(wǎng)站、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容