上一次我們分享了Oracle和MySQL中對(duì)于索引和針對(duì)空字符串的處理來(lái)分析了它們的不同,本次我們來(lái)他們?cè)诜猪?yè)查詢(xún)中有什么不同,區(qū)別還是比較明顯的。
那來(lái)具體看一下。
l分頁(yè)查
我們?yōu)槭裁匆褂梅猪?yè)查詢(xún)呢?因?yàn)楫?dāng)數(shù)據(jù)量過(guò)大時(shí),在一頁(yè)中查看數(shù)據(jù)是一件非常麻煩的事情。
lMySQL
MySql中使用limit來(lái)進(jìn)行分頁(yè)查詢(xún)他的語(yǔ)法結(jié)構(gòu)為:
SELECT * FROM 表名 limit m,n;
其中m代表從m+1條記錄行開(kāi)始檢索,n代表取出n條數(shù)據(jù)。注意:(m可設(shè)為0)
示例:SELECT * FROM 表名 limit 6,5;
這表示從第7條記錄行開(kāi)始算,取出5條數(shù)據(jù)
當(dāng)然我們把m設(shè)置為0 的時(shí)候就可以變成如下情況:
示例:SELECT * FROM 表名 limit 6;
這表示取出前6條記錄行。
當(dāng)然分頁(yè)查詢(xún)固然好用,但它有個(gè)缺點(diǎn),就是越往后分頁(yè),LIMIT語(yǔ)句速度也會(huì)明顯變慢,所以我們一般會(huì)用子查詢(xún)來(lái)分頁(yè)。
示例:select * from (select Password from user limit 3)as zh;
這就是user表中查詢(xún)出Password的前三條記錄,再查詢(xún)出他的全部信息。
需要注意的是:select * from user where Password in (select Password from user limit 3);這樣的寫(xiě)法是錯(cuò)誤的。
lOracle
那Oracle只中的分頁(yè)查詢(xún)又是怎么樣的呢?我們一起來(lái)看看。在Oracle中我們使用rownum來(lái)進(jìn)行分頁(yè)查詢(xún)。
那什么是rownum呢?它是針對(duì)查詢(xún)結(jié)果進(jìn)行編號(hào)的虛擬列,也叫偽列,查詢(xún)結(jié)果返回的一行分配的是1,返回的第二行分配的是2,這個(gè)為字段可以用于限制返回查詢(xún)的總行數(shù),且rownum不可以以任何表的名稱(chēng)作為前綴。
那我們先來(lái)舉個(gè)例看它是何方神圣。
示例:
SELECT rownum,emp.* FROM emp;
我們對(duì)照原始表可以看到,添加了一列rownum,對(duì)查詢(xún)結(jié)果進(jìn)行了編號(hào)。那我們想查詢(xún)一條應(yīng)該怎么做呢?
示例:
SELECT rownum,emp.* FROM emp WHERE ROWNUM=1;
這樣就查詢(xún)出來(lái)一條記錄,如果我要查詢(xún)二條?可能大家會(huì)想到直接ROWNUM=2不就完事了嗎?答案是否定的,這樣永遠(yuǎn)都查不到第二條。因?yàn)槟悴樵?xún)出來(lái)的結(jié)果都會(huì)重新編號(hào),這樣永遠(yuǎn)都從1開(kāi)始編號(hào),這樣第二條永遠(yuǎn)都取不到,當(dāng)然這個(gè)我們還是可以取小于范圍內(nèi)的,比如
示例:
SELECT rownum,emp.* FROM emp WHERE ROWNUM<5;< span="">
這樣就可以去到小于5 的記錄了。根據(jù)上面的說(shuō)法,我們要取大于5的也是不行的,因?yàn)槊看尾樵?xún)出來(lái)的結(jié)果都重新編號(hào),大于1的都不能取到,那我們?cè)趯?shí)際運(yùn)用呢?肯定不能不取中間的數(shù)據(jù),或者后面的數(shù)據(jù)了,這怎么辦呢?這我們就會(huì)才用雙層rownum的方法,有點(diǎn)像我們提出的外循環(huán)和內(nèi)循環(huán)的概念,這樣外面的變,里面的不變就可以取到了,說(shuō)了那么多,我們例子說(shuō)話(huà)。
示例
SELECT rownum,ename,empno
FROM(SELECT rownum,emp.* FROM emp)
WHERE rownum >10;
結(jié)果發(fā)現(xiàn)執(zhí)行出來(lái)沒(méi)有結(jié)果,這又是咋回事呢?哈哈!仔細(xì)的人已經(jīng)發(fā)現(xiàn),這條語(yǔ)句有兩個(gè)rownum,我們?nèi)丝梢詤^(qū)分,機(jī)器可不行呀,所以我們需要給他取不同的名字,我們稍微加工,得到以下的示例,我們看看。
示例:
SELECT rownum,ename,empno
FROM(select rownum rnum,ename,empno FROM emp)
WHERE rnum>10;
這樣就可以查到10行以后的記錄了。
我們還可以進(jìn)行只查詢(xún)篩選后再進(jìn)行主查詢(xún)篩選。
示例:
SELECT * FROM (SELECT rownum rnum,emp.* FROM emp
WHERE rownum<=4)
WHERE rnum>=2;
這就是在子查詢(xún)中選出前4條,再進(jìn)行主查詢(xún)篩選編號(hào)大于等于2的記錄。
通過(guò)往期的文章,Oracle和MySQL的基本區(qū)別就分享到此,下次我們接著分享其他的內(nèi)容謝謝!