最近專案上使用oracle的系統,需要相容mysql,原本使用到的sql語法需要修改以相容到mysql。先記錄下目前遇到的問題,後續會繼續更新。
1,oracle nvl()
這個函式用的比較多,功能就是從兩個表示式返回乙個非 null 值,
mysql:ifnull(expr1,expr2),也有相同功能
如果第乙個引數的表示式 expression 為 null,則返回第二個引數的備用值。
2,oracle 中日期格式化
oracle中常用to_char(),to_date()這兩個函式,mysql中有對應的函式
date_format(date,'%y-%m-%d') -------------->oracle中的to_char();
str_to_date(date,'%y-%m-%d') -------------->oracle中的to_date();
另外日期格式的表示式也不相同
%y:代表4位的年份
%y:代表2為的年份
%m:代表月, 格式為(01……12)
%c:代表月, 格式為(1……12)
%d:代表月份中的天數,格式為(00……31)
%e:代表月份中的天數, 格式為(0……31)
%h:代表小時,格式為(00……23)
%k:代表小時,格式為(0……23)
%h:代表小時,格式為(01……12)
%i: 代表小時,格式為(01……12)
%l:代表小時,格式為(1……12)
%i: 代表分鐘, 格式為(00……59)
%r:代表 時間,格式為12 小時(hh:mm:ss [ap]m)
%t:代表 時間,格式為24 小時(hh:mm:ss)
%s:代表 秒,格式為(00……59)
3,oracle 日期時間的計算,後一天,上個月之類的
mysql中計算,正數表示往後,負數往前計算
select date_add('2013-01-29 13:50:27', interval 1 day);
-> '2013-01-30 13:50:27'
select date_add('2013-01-29 13:50:27', interval 1 hour);
-> '2013-01-29 14:50:27'
select date_add('2013-01-29 13:50:27', interval 1 month);
-> '2013-02-28 13:50:27'
4,oracle字串拼接
oracle中常用 『||』進行字段拼接,而在mysql中用concat()拼接,返回結果為連線引數產生的字串。
5,oracle 的decode
在oracle中使用decode方法可以輕鬆實現**和值之間的轉換,mysql中沒有直接的方法可以使用,但是我們可以通過下面兩種方法來實現:
1.case when then
如:select title,case emergency when 1 then '緊急' else '普通' end as emergency from already_sig
2.if
如:select a.title,if(a.emergency=1,'緊急','普通')emergency from already_sign a
6,oracle with as
with as短語,也叫做子查詢部分(subquery factoring),可以讓你做很多事情,定義乙個sql片斷,該sql片斷會被整個sql語句所用到。有的時候,是為了讓sql語句的可讀性更高些,也有可能是在union all的不同部分,作為提供資料的部分。
特別對於union all比較有用。因為union all的每個部分可能相同,但是如果每個部分都去執行一遍的話,則成本太高,所以可以使用with as短語,則只要執行一遍即可。如果with as短語所定義的表名被呼叫兩次以上,則優化器會自動將with as短語所獲取的資料放入乙個temp表裡,如果只是被呼叫一次,則不會。而提示materialize則是強制將with as短語裡的資料放入乙個全域性臨時表裡。很多查詢通過這種方法都可以提高速度。
mysql的做法就是把查詢結果放到乙個臨時表
create temporary table tmp_table select * from table_name;
臨時表中就儲存了臨時資料。當斷開連線時,臨時表自動刪除。
臨時表使用有一些限制條件:
1,臨時表在 memory、myisam、merge或者innodb上使用,並且不支援mysql cluster簇);
show tables語句不會列出臨時表,在information_schema中也不存在臨時表資訊;show create table可以檢視臨時表;
2,不能使用rename來重新命名臨時表。但是可以alter table rename代替:
mysql>alter table orig_name rename new_name;
3,可以複製臨時表得到乙個新的臨時表,如:
mysql>create temporary table new_table select * from old_table;
4,同乙個query語句中,相同的臨時表只能出現一次。但不同的臨時表可以出現在同乙個query語句中,如臨時表temp_tb1, temp_tb2
可以使用:mysql> select * from temp_tb;
但不能使用:mysql> select * from temp_tb, temp_tb as t;
錯誤資訊: error 1137 (hy000): can』t reopen table: 『temp_tb』
5,臨時表可以手動刪除:
drop temporary table if exists temp_tb;
7,oracle dblink
oracle 通過dblink實現跨庫訪問,
mysql 用federated就是我們說的dblink類似的功能。遠端對映。
engine=federated connection='mysql:';
8,oracle 字段型別轉換,to_char,to_number
mysql中提供了兩個內建函式提供我們使用分別為:cast和convert,mysql 的cast()和convert() 函式可用來轉換或者獲取乙個我們需要的型別。兩者具體的語法如下:
cast(value as type);
convert(value, type);
可以轉換的型別是有限制的。這個型別可以是以下值其中的乙個:
二進位制,同帶binary字首的效果 : binary
字元型,可帶引數 : char()
日期 : date
日期時間型 : datetime
浮點數 : decimal
整數 : signed
無符號整數 : unsigned
9,oracle 產生隨機數和隨機字串,dbms_random.value
oracle中產生隨機數:
mysql中產生隨機數的方法:
oracle與mysql之間文字遷移
文字遷移相對來說比sql的insert into 快得多,下面來說一下關於兩者之間的遷移 oracle mysql oracle 匯出 sqluldr ods ods query select from t stdname info field record 0x0a charset utf 8 s...
Oracle與Oracle的SQL操作語句
oracle 也是一種資料庫管理系統 儲存結構分類 邏輯儲存結構,物理儲存結構 邏輯儲存結構 資料塊 資料塊是oracle邏輯儲存結構的最小邏輯結構,乙個資料塊對應乙個或多個物理塊,資料塊的結構包括塊頭和儲存區的兩個部分 塊頭包括 資料塊標題,表目錄,行目錄 儲存區 自由空間,行資料 資料區 資料區...
Oracle遷移到MySQL總結
日期 2012 06 01 字型 大中小 這兩個星期裡一直都在忙於一件事兒,就是oracle資料庫的遷移問題。沒有做的時候感覺這是一件十分輕鬆的事兒,可是等到實實在在去做去實現的時候,自己傻眼了。這種糾結啊,在這裡先說下遇到的問題 1。資料庫的表結構問題 資料型別不同需要解決varchar2 var...