數據庫差別小記mysql
1、 數據類型區別sql
1.整型
Mysql:使用int、decimal、float、double等
Oracle:經常使用的只有number,沒有int、decimal、float、double等類型
2.字符串型
Mysql:只有varchar型,沒有varchar2型
Oracle:只有varchar2型,沒有varchar型(varchar2把空串等同於null處理,而varchar仍按照空串處理)
3.時間類型
Mysql:date和time都有,都佔3個字節
Oracle:只有date,且佔7個字節
4.自動增加列
Mysql:有自動增加列字段,能夠直接添加
Oracle:沒有自動增加列字段,使用Sequence或者觸發器完成
5.非空字段
Mysql:非空字段也能存空字符串
Oracle:非空字段不能存空字符串數據庫
2、 函數區別服務器
1.獲取字符串位置函數
Mysql:instr(字段名,字符串)返回字符串在某一個字段的內容中的位置, 沒有找到字符串返回0,不然返回位置(從1開始),或者使用locate()函數
Oracle:instr('源字符串','目標字符串','開始位置','第幾回出現')返回內容一致,後兩個參數可省略
2.截取字符串函數
Mysql:substring('abcd',2,2)
Oracle:substr('abcd',2,2)
3.字符串長度函數
Mysql:char_length('AAAASDF')
Oracle:length('AAAASDF')
4.字符串轉換成時間函數
Mysql:STR_TO_DATE(str,format)
Oracle:to_date(str,format)
5.時間加減函數
Mysql:
一、 date_sub(date,interval date);
date_sub(curdate(),interval 1 day) 加一天
date_sub(curdate(),interval 1 mouth) 加一個月
date_sub(curdate(),interval -1 year)減一年
二、 DATEDIFF(date1,date2)、TIMEDIFF(date1,date2),date1減date2;
Oracle:可直接加減時間或日期;ADD_MONTHS(sysdate,1)獲取下個月,沒有add_days和add_years函數,獲取時間差可直接date1-date2;
6.返回不小於X的最小整數函數
Mysql:ceiling(x)
Oracle:ceil(x)oracle
3、循環結構區別函數
1.If循環
Mysql :if……elseif
Oracle:if……elsif
2.While循環
Mysql:WHILE……DO……END WHILE
Oracle:WHILE......LOOP......END LOOP
3.For/loop循環
Mysql: LOOP // lp1 爲循環體名稱 LOOP 爲關鍵字
insert into user_profile (uid) values (i);
set i = i+1;
if i > 30 then
leave lp1; // 離開循環體
end if;
end LOOP; // 結束循環
Oracle: FOR X IN REVERSE 1..10 LOOP --reverse由大到小
DBMS_OUTPUT.PUT_LINE('內:x='||x);
END LOOP;
DBMS_OUTPUT.PUT_LINE('end loop:x='||X); x=1;
END;oop
4、存儲結構區別ui
1.建立存儲過程
Mysql:mysql使用create建立存儲過程,且在存儲過程當中不能建立別的存儲過程
Oracle:使用create or replace的方法建立存儲過程,且存儲過程若是定義在包中,一個包中能夠包含多個存儲過程和方法.若是定義在Procedures中,存儲過程當中不能夠定義多個存儲過程
2.建立函數
Mysql:使用create建立,且Functions不能夠定義多個函數,返回值用returns
Oracle:使用create or replace的方法建立,且oracle 函數能夠定義在package中,也能夠定義在Functions中. 若是定義在包中,一個包中能夠包含多個存儲過程和函數.若是定義在Functions中,每一個函數只能定義一個函數,返回值用return
3.傳入參數
Mysql:函數中參數類型in/out/inout寫在參數名前面,且in能夠省略,out和inout不可省略
Oracle:函數中參數類型in/out/inout寫在參數名後面,且都必須寫,不可省略
4.在存儲過程當中調用存儲過程
Mysql:存儲過程調用存儲過程,須要使用Call pro_name(參數)
Oracle:調用存儲過程直接寫存儲過程名就能夠了
5.過程和函數的聲明變量的位置不一樣
Mysql:聲明變量在begin...end體內,begin以後其餘任何內容以前
Oracle:聲明變量在begin…end體以前spa
5、觸發器區別orm
1.建立語句
Mysql:Mysql使用 create trigger建立觸發器,每一個觸發器只支持一個事件
Oracle:Oracle使用create or replace trigger語法建立觸發器,能夠在一個觸發器觸發insert,delete,update事件
2.顯示編輯
Mysql:mysql trigger 不能在客戶端顯示或編輯.須要在服務器所在的機器上操做
Oracle:Oracle trigger 能在客戶端顯示或編輯.須要在服務器所在的機器上操做
6、基本語法區別
1.退出語句
Mysql:使用leave語句,若是leave語句後面跟的是存儲過程名,則退出當前存儲過程. 若是leave語句後面跟的是lable名. 則退出當前lable
Oracle:使用exit語句,若是exit語句在循環中就退出當前循環.若是exit語句再也不循環中,就退出當前過程或方法
2.註釋方式
Mysql:使用"-- message" 或 "/** …. /" 或 "/ …. /"來註釋
Oracle:Oracle使用"-- message" 或 "/ …. */" 或 "#"來註釋
3.時間格式及獲取當前時間
Mysql:Mysql時間格式:%Y-%m-%d %H:%i:%s ,獲取當前時間爲now()
Oracle:Oracle時間格式:yyyy-MM-dd hh:mi:ss ,獲取當前時間爲SYSDATE
4.鏈接字符串
Mysql:Mysql使用concat方法鏈接字符串. MySQL的concat函數能夠鏈接一個或者多個字符串
Oracle:oracle使用||鏈接字符串,也可使用concat函數. 但Oracle的concat函數只能鏈接兩個字符串
7、其餘區別
1.分頁查詢
Mysql:查詢分頁時使用limit輔助查詢
Oracle:使用rownum輔助分頁查詢
2.鏈接查詢
Mysql:只能使用left join ,right join等關鍵字
Oracle:Oracle左鏈接,右鏈接可使用(+)來實現,"(+)"所在位置的另外一側爲鏈接的方向
3.模糊查詢速度
Mysql:使用 字段名 like '%字符串%'進行模糊查詢
Oracle:Oracle裏也能夠用字段名 like '%字符串%'進行模糊查詢 但這種方法不能使用索引, 速度不快,用字符串比較函數 instr(字段名,'字符串')>0 會獲得更精確的查找結果
使用建議:
a.儘可能避免使用空字符串b.在Oracle數據庫使用instr()函數時只使用前兩個參數c.在Mysql數據庫中使用cancat()函數時,一次只鏈接兩個字符串,須要鏈接多個的時候嵌套使用函數