十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
oracle 函數(shù)中沒(méi)有top命令。
創(chuàng)新互聯(lián)公司專(zhuān)業(yè)為企業(yè)提供太和網(wǎng)站建設(shè)、太和做網(wǎng)站、太和網(wǎng)站設(shè)計(jì)、太和網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、太和企業(yè)網(wǎng)站模板建站服務(wù),十余年太和做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
Oracle8i可以將一個(gè)查詢(xún)到的數(shù)據(jù)集作為另外一個(gè)查詢(xún)的表名,于是可以解決Top N的一條SQL查詢(xún),例如,從tab表中取出f字段值最大的10條記錄:
SELECT * FROM (SELECT * FROM tab ORDER BY f DESC) WHERE ROWNUM = 10。
oracle簡(jiǎn)介:
甲骨文公司,全稱(chēng)甲骨文股份有限公司(甲骨文軟件系統(tǒng)有限公司),是全球最大的企業(yè)級(jí)軟件公司,總部位于美國(guó)加利福尼亞州的紅木灘。1989年正式進(jìn)入中國(guó)市場(chǎng)。2013年,甲骨文已超越 IBM ,成為繼 Microsoft 后全球第二大軟件公司。
通過(guò)
SecureCRT
.exe連接linux操作系統(tǒng)。
切換到oracle
用戶(hù)。
輸入
su
oracle
打開(kāi)監(jiān)聽(tīng)。
輸入
lsnrctl
start
。
監(jiān)聽(tīng)啟動(dòng)成功。
顯示如下圖。
打開(kāi)sqlplus
程序。
輸入
sqlplus
/nolog
進(jìn)入sqlplus界面。
在sqlplus連接數(shù)據(jù)庫(kù)。
輸入
connect
/as
sysdba.
顯示連接成功。
輸入startup
,啟動(dòng)oracle
數(shù)據(jù)庫(kù)。
查看oracle
數(shù)據(jù)庫(kù)是否啟動(dòng)成功。
退出sqlplus界面,并輸入top命令。查看是否有oracle的進(jìn)程。
1.在ORACLE中實(shí)現(xiàn)SELECT TOP N
由于ORACLE不支持SELECT TOP語(yǔ)句,所以在ORACLE中經(jīng)常是用ORDER BY跟ROWNUM的組合來(lái)實(shí)現(xiàn)SELECT TOP N的查詢(xún)。
簡(jiǎn)單地說(shuō),實(shí)現(xiàn)方法如下所示:
SELECT 列名1...列名n FROM
(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
WHERE ROWNUM = N(抽出記錄數(shù))
ORDER BY ROWNUM ASC
下面舉個(gè)例子簡(jiǎn)單說(shuō)明一下。
顧客表customer(id,name)有如下數(shù)據(jù):
ID NAME
01 first
02 Second
03 third
04 forth
05 fifth
06 sixth
07 seventh
08 eighth
09 ninth
10 tenth
11 last
則按NAME的字母順抽出前三個(gè)顧客的SQL語(yǔ)句如下所示:
SELECT * FROM
(SELECT * FROM CUSTOMER ORDER BY NAME)
WHERE ROWNUM = 3
ORDER BY ROWNUM ASC
輸出結(jié)果為:
ID NAME
08 eighth
05 fifth
01 first
2.在TOP N紀(jì)錄中抽出第M(M = N)條記錄
在得到了TOP N的數(shù)據(jù)之后,為了抽出這N條記錄中的第M條記錄,我們可以考慮從ROWNUM著手。我們知道,ROWNUM是記錄表中數(shù)據(jù)編號(hào)的一個(gè)隱藏子段,所以可以在得到TOP N條記錄的時(shí)候同時(shí)抽出記錄的ROWNUM,然后再?gòu)倪@N條記錄中抽取記錄編號(hào)為M的記錄,即使我們希望得到的結(jié)果。
從上面的分析可以很容易得到下面的SQL語(yǔ)句。
SELECT 列名1...列名n FROM
(
SELECT ROWNUM RECNO, 列名1...列名nFROM
(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
WHERE ROWNUM = N(抽出記錄數(shù))
ORDER BY ROWNUM ASC
)
WHERE RECNO = M(M = N)
同樣以上表的數(shù)據(jù)為基礎(chǔ),那么得到以NAME的字母順排序的第二個(gè)顧客的信息的SQL語(yǔ)句應(yīng)該這樣寫(xiě):
SELECT ID, NAME FROM
(
SELECT ROWNUM RECNO, ID, NAME FROM
(SELECT * FROM CUSTOMER ORDER BY NAME)
WHERE ROWNUM = 3
ORDER BY ROWNUM ASC )
WHERE RECNO = 2
結(jié)果則為:
ID NAME
05 fifth
3.抽出按某種方式排序的記錄集中的第N條記錄
在2的說(shuō)明中,當(dāng)M = N的時(shí)候,即為我們的標(biāo)題講的結(jié)果。實(shí)際上,2的做法在里面NM的部分的數(shù)據(jù)是基本上不會(huì)用到的,我們僅僅是為了說(shuō)明方便而采用。
如上所述,則SQL語(yǔ)句應(yīng)為:
SELECT 列名1...列名n FROM
(
SELECT ROWNUM RECNO, 列名1...列名nFROM
(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
WHERE ROWNUM = N(抽出記錄數(shù))
ORDER BY ROWNUM ASC
)
WHERE RECNO = N
那么,2中的例子的SQL語(yǔ)句則為:
SELECT ID, NAME FROM
(
SELECT ROWNUM RECNO, ID, NAME FROM
(SELECT * FROM CUSTOMER ORDER BY NAME)
WHERE ROWNUM = 2
ORDER BY ROWNUM ASC
)
WHERE RECNO = 2
結(jié)果為:
ID NAME
05 fifth
4.抽出按某種方式排序的記錄集中的第M條記錄開(kāi)始的X條記錄
3里所講得僅僅是抽取一條記錄的情況,當(dāng)我們需要抽取多條記錄的時(shí)候,此時(shí)在2中的N的取值應(yīng)該是在N = (M + X - 1)這個(gè)范圍內(nèi),當(dāng)讓最經(jīng)濟(jì)的取值就是取等好的時(shí)候了的時(shí)候了。當(dāng)然最后的抽取條件也不是RECNO = N了,應(yīng)該是RECNO BETWEEN M AND (M + X - 1)了,所以隨之而來(lái)的SQL語(yǔ)句則為:
SELECT 列名1...列名n FROM
(
SELECT ROWNUM RECNO, 列名1...列名nFROM
(
SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
WHERE ROWNUM = N (N = (M + X - 1))
ORDER BY ROWNUM ASC
)
WHERE RECNO BETWEEN M AND (M + X - 1)
同樣以上面的數(shù)據(jù)為例,則抽取NAME的字母順的第2條記錄開(kāi)始的3條記錄的SQL語(yǔ)句為:
SELECT ID, NAME FROM
(
SELECT ROWNUM RECNO, ID, NAME FROM
(SELECT * FROM CUSTOMER ORDER BY NAME)
WHERE ROWNUM = (2 + 3 - 1)
ORDER BY ROWNUM ASC
)
WHERE RECNO BETWEEN 2 AND (2 + 3 - 1)
結(jié)果如下:
ID NAME
05 fifth
01 first
04 forth
以此為基礎(chǔ),再擴(kuò)展的話,做成存儲(chǔ)過(guò)程,將開(kāi)始記錄數(shù)以及抽取記錄數(shù)為參數(shù),就可以輕松實(shí)現(xiàn)分頁(yè)抽取數(shù)據(jù)。
當(dāng)然了,上面所講的都是一些最基本的,實(shí)際應(yīng)用中往往都沒(méi)有這么簡(jiǎn)單,但是不管怎么說(shuō),不管復(fù)雜的應(yīng)用總是由這些簡(jiǎn)單的元素構(gòu)成,掌握一些最基本的方法始終是重要的。
實(shí)際上網(wǎng)上這樣的文章比較多,我也只是稍微梳理了一下條理而寫(xiě)的這篇文章。希望能給初學(xué)者一些幫助。
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é)果:
很遺憾,不支持
但可以使用 order by 和rownum實(shí)現(xiàn)top功能
見(jiàn)資料:
rownum:對(duì)于rownum來(lái)說(shuō)它是oracle系統(tǒng)順序分配為從查詢(xún)返回的行的編號(hào),返回的第一行分配的是1,第二行是2,依此類(lèi)推,這個(gè)偽字段可以用于限制查詢(xún)返回的總行數(shù),且rownum不能以任何表的名稱(chēng)作為前綴。 example: select rownum as 行號(hào),first_name as 員工姓名 from hr.employees select rownum as 行號(hào),first_name as 員工姓名 from hr.employees order by 員工姓名; 序號(hào)不會(huì)重新排的,(所以需要嵌套一層子查詢(xún)來(lái)抽取排序好的數(shù)據(jù))原因下面解釋。 例1:查詢(xún)各個(gè)部門(mén)的MANAGER(經(jīng)理)中誰(shuí)的工資最低 hrselect * from(select t1.manager_id as 員工編號(hào),t2.first_name as 員工姓名,t2.salary as 工資 from hr.departments t1 join hr.employees t2 on t1.manager_id=t2.employee_id order by t2.salary) where rownum=1; *******************************************************************************where rownum=1;表示取第一行, rownum2、=2什么的是不行的只能用