Oracle數(shù)據(jù)庫分頁,主頁自增長,CONCAT語法

之前一直使用mysql數(shù)據(jù)庫,新項目需要用到oracle數(shù)據(jù)庫,雖然標(biāo)準(zhǔn)的sql語句語法大同小異,但是畢竟還是有些許不同,這里就總結(jié)下常見的oracle數(shù)據(jù)庫與mysql數(shù)據(jù)庫語法的不同之處

分頁語句

mysql的分頁比較簡單 可以直接使用limit進行分頁,limit第一個數(shù)字表示第幾行數(shù)據(jù)開始查詢((page-1)*row page表示頁碼,第幾頁。row表示每頁顯示多少行數(shù)據(jù)),第二個數(shù)字表示每頁顯示多少行數(shù)據(jù)。

select * from table limit 0,5;

oracle數(shù)據(jù)庫沒有l(wèi)imit關(guān)鍵字,但是我們可以同rownum偽行分頁。rownum 為偽列,在查詢過程中會自動按照查詢順序生成需要,所以查詢時第一條數(shù)據(jù)的rownum的值一定是1,所以不能直接使用rownum<xxx,需先嵌套查詢出內(nèi)層數(shù)據(jù)生成rownum再進行范圍截取,同理,order by也需要最里層進行排序

無order by 兩層嵌套,效率高,與數(shù)據(jù)量大小無關(guān)

select * from (select test.*,rownum as num from test where rownum<=5) test where num>0;

有order by 需嵌套三層,隨數(shù)據(jù)量大小會影響查詢時間

select * from (select test.*,rownum as num from (select * from test order by id desc)test where rownum<=5) test where num>0;

分頁連表查詢

無order by

select * from (select rownum r,k.kch,k.kcm,cj.cj,x.xh,x.xm from KCB  k,CJB  cj,XSB  x where k.kch   = cj.kch and cj.xh = x.xh and rownum<=10) where r>0

帶order by

select * from(select tt.name as test_name,tt.sex as people_sex ,rownum as num from(select t.*,p.* from test t join people p on t.id=p.fk_test_id order by t.id desc)tt where rownum<=5) where num>0;

oracle數(shù)據(jù)的顯示條數(shù)計算方式
例如 共有數(shù)據(jù)150條,每頁10條,共有15也
第一頁:最小條數(shù) (1-1)10 最大條數(shù)110
第二頁:最小條數(shù)(2-1)10 最大條數(shù)210
第n頁:最小條數(shù)(n-1)10 最大條數(shù)n10
總結(jié) 分頁起始條數(shù)為 (page-1)row 結(jié)束條數(shù)pagerow sql語句為左開右閉

特別注意:事件項目中盡量少用*通配符已減少I/O吞吐量,如果有連表查詢,直接在內(nèi)層嵌套即可

CONCAT字符串拼接

在數(shù)據(jù)庫中可以用CONCAT關(guān)機鍵對字符串進行拼接,個人也比較喜歡在mybatis的分頁模糊查詢語句中使用CONCAT關(guān)鍵字對字符串進行拼接。
在mysql數(shù)據(jù)庫中,CONCAT可以進行多個字符串的拼接

CONCAT(str1,str2,str3,........)
    <sql id="findPower">
        <where>
            flag=1 
            <if test="name!=null&amp;&amp;name!=''">
                and power_name like CONCAT('%',#{name},'%')
            </if>
        </where>
    </sql>

在oracle數(shù)據(jù)庫中,CONCAT關(guān)鍵字也是進行字符串拼接的,使用方法基本相同,大多用在模糊查詢中,但是需要注意,oracle數(shù)據(jù)庫CONCAT進行字符串拼接只能拼接兩個字符串,如果需要拼接多個字符串,可以嵌套拼接

CONCAT(str1,str2)
select * from test where name like CONCAT(CONCAT('%','f'),'%');

參數(shù)中有Null的處理方式不同

Mysql:返回結(jié)果為連接參數(shù)產(chǎn)生的字符串。如有任何一個參數(shù)為NULL ,則返回值為 NULL。

Oralce:如有任何一個參數(shù)為NULL ,則返回值拼接后的字符串

主鍵自增長

在使用mysql數(shù)據(jù)庫的時候主鍵自增長是一個非常簡單的事情,值需要在創(chuàng)建表的時候書寫auto_increment就能實現(xiàn)主鍵自增長,但是在oracle中并沒有此關(guān)鍵字,需要收工進行書寫序列和觸發(fā)器進行自增長

mysql

CREATE TABLE test(
id INT PRIMARY KEY AUTO_INCREMENT ,
user_name VARCHAR(20)
);

oracle

create table test (
id int primary key not null,
name varchar(20)
);
--創(chuàng)建一個序列
create SEQUENCE seq_test
MINVALUE 1 --最小值1
NOMAXVALUE --不設(shè)置最大值
start with 1 --從1開始
INCREMENT by 1 --每次遞增1
NOCYCLE --一直累加,不循環(huán)
NOCACHE; --不設(shè)置緩沖
--創(chuàng)建一個觸發(fā)器,每次執(zhí)行insert語句觸發(fā)seq_test自增
CREATE OR REPLACE TRIGGER tg_test --創(chuàng)建一個觸發(fā)器,OR REPLACE 表示新建的觸發(fā)器或者覆蓋原有的重名觸發(fā)器
BEFORE INSERT ON test FOR EACH ROW WHEN (new.id is null) --在insert之前開始 for each row表示行級觸發(fā)器 當(dāng)id新的id 為空的時候
begin
select seq_test.nextval into: new.id from dual;  --nextval表示與序列關(guān)聯(lián)  dual為oracle中偽表,虛擬表
end;
--測試實現(xiàn)主鍵自增長
insert into test (name) values ('dsf');

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容