之前一直使用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&&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');