常見ORACLE與MYSQL函數對比以及一些常見的區別


 
編號 類別 ORACLE MYSQL 注釋
1 數字函數 round(1.23456,4) round(1.23456,4) 一樣:
ORACLE:select round(1.23456,4) value from dual
MYSQL:select round(1.23456,4) value
2 abs(-1) abs(-1) 功能: 將當前數據取絕對值
用法: oracle和mysql用法一樣
mysql: select abs(-1) value
oracle: select abs(-1) value from dual
3 ceil(-1.001)) ceiling(-1.001) 功能: 返回不小於 X 的最小整數
用法:
mysqls: select ceiling(-1.001) value
oracle: select ceil(-1.001) value from dual
4 floor(-1.001) floor(-1.001) 功能: 返回不大於 X 的最大整數值
用法:
mysql: select floor(-1.001) value
oracle: select floor(-1.001) value from dual

5 Max(expr)/Min(expr) Max(expr)/Min(expr) 功能:返回 expr 的最小或最大值。MIN() 和 MAX() 可以接受一個字符串參數;在這
種情況下,它們將返回最小或最大的字符串傳下。
用法:
ROACLE: select max(user_int_key) from sd_usr;
MYSQL: select max(user_int_key) from sd_usr;
6 字符串函數 ascii(str) ascii(str) 功能:返回字符串 str 最左邊的那個字符的 ASCII 碼值。如果 str 是一個空字符串,
那么返回值為 0。如果 str 是一個 NULL,返回值也是 NULL.
用法:
mysql:select ascii('a') value
oracle:select ascii('a') value from dual
7 CHAR(N,...) CHAR(N,...) 功能:CHAR() 以整數類型解釋參數,返回這個整數所代表的 ASCII 碼值給出的字符
組成的字符串。NULL 值將被忽略.
用法:
mysql:select char(97) value
oracle:select chr(97) value from dual

8 REPLACE(str,from_str,to_str) REPLACE(str,from_str,to_str) 功能: 在字符串 str 中所有出現的字符串 from_str 均被 to_str 替換,然后返回這個字符串.
用法:
mysql: SELECT REPLACE('abcdef', 'bcd', 'ijklmn') value
oracle: SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual


9 INSTR('sdsq','s',2) INSTR('sdsq','s') 參數個數不同
ORACLE: select INSTR('sdsq','s',2) value from dual(要求從位置2開始)
MYSQL: select INSTR('sdsq','s') value(從默認的位置1開始)
10 SUBSTR('abcd',2,2) substring('abcd',2,2) 函數名稱不同:
ORACLE: select substr('abcd',2,2) value from dual
MYSQL: select substring('abcd',2,2) value
11 instr(‘abcdefg’,’ab’) locate(‘ab’,’abcdefg’) 函數名稱不同:
instr -> locate(注意:locate的子串和總串的位置要互換)
ORACLE: SELECT instr('abcdefg', 'ab') VALUE FROM DUAL
MYSQL: SELECT locate('ab', 'abcdefg') VALUE
12 length(str) char_length() 函數名稱不同:
ORACEL: SELECT length('AAAASDF') VALUE FROM DUAL
MYSQL: SELECT char_length('AAAASDF') VALUE
13 REPLACE('abcdef', 'bcd', 'ijklmn') REPLACE('abcdef', 'bcd', 'ijklmn') 一樣:
ORACLE: SELECT REPLACE('abcdef', 'bcd', 'ijklmn') value from dual
MYSQL: SELECT REPLACE('abcdef', 'bcd', 'ijklmn') value
14 LPAD('abcd',14, '0') LPAD('abcd',14, '0') 一樣:
ORACLE: select LPAD('abcd',14, '0') value from dual
MYSQL: select LPAD('abcd',14, '0') value from dual
15 UPPER(iv_user_id) UPPER(iv_user_id) 一樣:
ORACLE: select UPPER(user_id) from sd_usr;
MYSQL: select UPPER(user_id) from sd_usr;
16 LOWER(iv_user_id) LOWER(iv_user_id) 一樣:
ORACLE: select LOWER(user_id) from sd_usr;
MYSQL: select LOWER(user_id) from sd_usr;
17 控制流函數 nvl(u.email_address, 10) IFNULL(u.email_address, 10)

ISNULL(u.email_address)
函數名稱不同(根據不同的作用進行選擇):
ORACLE: select u.email_address, nvl(u.email_address, 10) value from sd_usr u (如果u.email_address=NULl,就在DB中用10替換其值)
MYSQL: select u.email_address, IFNULL(u.email_address, 10) value from sd_usr u(如果u.email_address=NULl,顯示結果中是10,而不是在DB中用10替換其值)
select u.email_address, ISNULL(u.email_address) value from sd_usr u(如果u.email_address是NULL, 就顯示1<true>,否則就顯示0<false>)
18 DECODE(iv_sr_status,g_sr_status_com, ld_sys_date, NULL) 無,請用IF或CASE語句代替.
IF語句格式:(expr1,expr2,expr3)
說明:
1. decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值)
該函數的含義如下:
IF 條件=值1 THEN
    RETURN(翻譯值1)
ELSIF 條件=值2 THEN
    RETURN(翻譯值2)
    ......
ELSIF 條件=值n THEN
    RETURN(翻譯值n)
ELSE
    RETURN(缺省值)
END IF

2. mysql If語法說明
功能: 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),則 IF()的返回值為expr2;
否則返回值則為 expr3。IF() 的返回值為數字值或字符串值,具體情況視其所在
語境而定。
用法:
mysql: SELECT IF(1>2,2,3);
19 類型轉換函數 TO_CHAR(SQLCODE) date_format/ time_format 函數名稱不同
SQL> select to_char(sysdate,'yyyy-mm-dd') from dual;
SQL> select to_char(sysdate,'hh24-mi-ss') from dual;
mysql> select date_format(now(),'%Y-%m-%d');
mysql> select time_format(now(),'%H-%i-%S');
20 to_date(str,format) STR_TO_DATE(str,format) 函數名稱不同:
ORACLE:SELECT to_date('2009-3-6','yyyy-mm-dd') VAULE FROM DUAL
MYSQL: SELECT STR_TO_DATE('2004-03-01', '%Y-%m-%d') VAULE
21 trunc(-1.002) cast(-1.002 as SIGNED) 函數名稱不同:
TRUNC函數為指定元素而截去的日期值。
ORACLE: select trunc(-1.002) value from dual
MYSQL:select cast(-1.002 as SIGNED) value
MYSQL:
字符集轉換 :   CONVERT(xxx  USING   gb2312)
類型轉換和SQL Server一樣,就是類型參數有點點不同  : CAST(xxx  AS   類型)  ,   CONVERT(xxx,類型),類型必須用下列的類型:
 
  可用的類型  
  二進制,同帶binary前綴的效果 : BINARY  
  字符型,可帶參數 : CHAR()   
  日期 : DATE   
  時間: TIME   
  日期時間型 : DATETIME   
  浮點數 : DECIMAL    
  整數 : SIGNED   
  無符號整數 : UNSIGNED  
22 TO_NUMBER(str) CAST("123" AS SIGNED INTEGER) 函數名稱不同
ORACLE:SELECT TO_NUMBER('123') AS VALUE FROM DUAL;
MYSQL: SELECT CAST("123" AS SIGNED INTEGER) as value;
SIGNED INTEGER:帶符號的整形
23 日期函數 SYSDATE now() / SYSDATE() 寫法不同:
ORACLE:select SYSDATE value from dual
MYSQL:select now() value
select sysdate() value
24 Next_day(sysdate,7) 自定義一個函數:F_COMMON_NEXT_DAY(date,int) 函數名稱不同:
ORACLE: SELECT Next_day(sysdate,7) value FROM DUAL
MYSQL: SELECT F_COMMON_NEXT_DAY(SYSDATE(), 3) value from DUAL;
(3:指星期的索引值)返回的指定的緊接着下一個星期的日期
25 ADD_MONTHS(sysdate, 2) DATE_ADD(sysdate(), interval 2 month) 函數名稱不同:
ORACLE: SELECT ADD_MONTHS(sysdate, 2) as value from DUAL;
MYSQL: SELECT DATE_ADD(sysdate(), interval 2 month) as value from DUAL;
26 2個日期相減(D1-D2) DATEDIFF(date1,date2) 功能: 返回兩個日期之間的天數。
用法:
mysql: SELECT DATEDIFF('2008-12-30','2008-12-29') AS DiffDate
oracle: 直接用兩個日期相減(比如d1-d2=12.3)
27 SQL函數 SQLCODE MYSQL中沒有對應的函數,但JAVA中SQLException。getErrorCode()函數可以獲取錯誤號 Oracle內置函數SQLCODE和SQLERRM是特別用在OTHERS處理器中,分別用來返回Oracle的錯誤代碼和錯誤消息。
MYSQL: 可以從JAVA中得到錯誤代碼,錯誤狀態和錯誤消息
28 SQLERRM MYSQL中沒有對應的函數,但JAVA中SQLException。getMessage()函數可以獲取錯誤消息 Oracle內置函數SQLCODE和SQLERRM是特別用在OTHERS處理器中,分別用來返回Oracle的錯誤代碼和錯誤消息。
MYSQL: 可以從JAVA中得到錯誤代碼,錯誤狀態和錯誤消息
29 SEQ_BK_DTL_OPT_INT_KEY.NEXTVAL 自動增長列 在MYSQL中是自動增長列. 如下方法獲取最新ID:
  START TRANSACTION;   
    INSERT INTO user(username,password)
      VALUES (username,MD5(password));
    SELECT LAST_INSERT_ID() INTO id;
  COMMIT;
30 SUM(enable_flag) SUM(enable_flag) 一樣:
ORCALE: SELECT SUM(enable_flag) FROM SD_USR;
MYSQL: SELECT SUM(enable_flag) FROM SD_USR;
31 DBMS_OUTPUT.PUT_LINE(SQLCODE) 在MYSQL中無相應的方法,其作用是在控制台中打印,用於測試,對遷移無影響。 dbms_output.put_line每行只能顯示255個字符,超過了就會報錯
 

1、連接字符串在Oracle中用|| ,SqlServer中用+,MySQL中用concat('a','b','c')

2、orcale 生成唯一序列是 select sys.guid() from dual ,mysql是 select uuid() from dual

3、mysql可以實現自增長主鍵(通過字段的auto_increment屬性);Oracle則需要通過序列(Sequence)來實現。

4、mysql可以用雙引號來引用字符串(當然單引號也行);Oracle只能用單引號。

5、mysql在查詢語句中可以通過limit [offset,] <row count>來直接分頁;而Oracle需要使用rownum偽列,且需要注意陷阱,
6、mysql對於真假的判斷,0為假1為真;Oracle則是用true/false。

7、mysql的查詢可以 select sysdate(); ;而Oracle需要引用虛表(select sysdate from dual;)。

8、mysql對於like的查詢,CONCAT('%', #{name,jdbcType=VARCHAR},'%') ;Oracle則是用LIKE '%'||#{name,jdbcType=VARCHAR}||'%' 

9、mysql的查詢可以 select sysdate(); ;而Oracle需要引用虛表(select sysdate from dual;)。

10、mysql中備份命令:mysqldump,執行結果是一個sql文件;oracle備份命令:dpdump,執行結果是一個dmp文件。前件是文本sql命令,
      可以直接導入到其它mysql數據庫,甚至可以稍作修改導入到其它類型的數據庫;后者導出文件是二進制的,只能Oracle自己用(甚至還有版本限制)。
 
11、mysql中的命令默認是直接commit的;Oracle默認不是
 
12、mysql中日期的轉換用dateformat()函數;Oracle用to_date()與to_char()兩個函數。
 
13、mysql在Windows環境下大小寫是不敏感的;unix/linux環境下,對數據庫名、表名大小寫敏感,列名大小寫不敏感。Oracle則不論環境大小寫都不敏感。
 
14、mysql支持枚舉類型(enum)、集合類型(set);Oracle不直接支持,需要使用外鍵等其它手段實現。
 

Oracle中的decode在mysql中的等價實現

mysql支持if
格式:
IF(expr1,expr2,expr3)
如果expr1是TRUE(expr1<>;0且expr1<>;NULL),那么IF()返回expr2,否則它返回expr3。IF()返回一個數字或字符串值
例如
SELECT IF(1<2, 'yes ', 'no ');
輸出yes

同時,還支持case
SELECT   CASE   WHEN   1> 0   THEN   "yes "   ELSE   "no "   END;
還是輸出yes

例一
//Oracle中 decode(Emergency,1,'緊急','普通')

//mysql
select a.title,if(a.Emergency=1,'緊急','普通')emergency from already_sign a

Select title,case Emergency when 1 then '緊急' else '普通' End as emergency   from already_sign


例二

oracle的寫法
SELECT decode(ttype,1,’a',2,’b',3,’c',’d') FROM taba

可以在mysql里寫成
SELECT if(ttype=1, 'a',if(ttype=2,'b', if(ttype =3, 'c', 'd'))) FROM taba

同理
DECODE(hj_bz, 1, '總庫入', 2, '總庫出',3,'分庫出',4,'已開票',5,'已安裝',6,'已收款')

if(hj_bz=1,'總庫入',if(hj_bz=2,'總庫出',if(hj_bz=3,'分庫出',if(hj_bz=4,'已開票',if(hj_bz=5,'已安裝','已收款')))))

 
最后來復習下SQL四種語言:DDL,DML,DCL,TCL

1.DDLData Definition Language數據庫定義語言statements are used to define the database structure or schema.

DDL是SQL語言的四大功能之一。
用於定義數據庫的三級結構,包括外模式、概念模式、內模式及其相互之間的映像,定義數據的完整性、安全控制等約束
DDL不需要commit.
CREATE
ALTER
DROP
TRUNCATE
COMMENT
RENAME

2.DMLData Manipulation Language數據操縱語言statements are used for managing data within schema objects.

由DBMS提供,用於讓用戶或程序員使用,實現對數據庫中數據的操作。
DML分成交互型DML和嵌入型DML兩類。
依據語言的級別,DML又可分成過程性DML和非過程性DML兩種。
需要commit.
SELECT
INSERT
UPDATE
DELETE
MERGE
CALL
EXPLAIN PLAN
LOCK TABLE

3.DCLData Control Language數據庫控制語言  授權,角色控制等
GRANT 授權
REVOKE 取消授權

4.TCLTransaction Control Language事務控制語言
SAVEPOINT 設置保存點
ROLLBACK  回滾
SET TRANSACTION

SQL主要分成四部分
(1)數據定義。(SQL DDL)用於定義SQL模式、基本表、視圖和索引的創建和撤消操作。
(2)數據操縱。(SQL DML)數據操縱分成數據查詢和數據更新兩類。數據更新又分成插入、刪除、和修改三種操作。
(3)數據控制。包括對基本表和視圖的授權,完整性規則的描述,事務控制等內容。
(4)嵌入式SQL的使用規定。涉及到SQL語句嵌入在宿主語言程序中使用的規則。

SQL四種語言:DDL,DML,DCL,TCL


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM