[mysql使用(2)] mysql的一些語法與Oracle的差異

1、表空間     mysql

        mysql的表空間有共享表空間和獨佔表空間,獨佔表空間,其實就是一張表一個表空間,其實也就是一張表一個數據文件,共享表空間彷佛有點相似oracle的表空間,不一樣的表能夠保存在同一個數據文件裏,通常mysql沒有單首創建表空間的步驟而oracle要先建立好表空間,而後指定某張表放到某個表空間。

sql

2、數據類型數據庫

 

一、oracle表結構移植到mysql中須要的類型轉換session

MYSQL                  ORACLE
BLOB(220)             RAW(220)
BLOB (20)             RAW(20)
BLOG(1024)             RAW(1024)
VARCHAR(n)             VARCHAR2(n)
CHAR                   CHAR
FLOAT(22,6)            NUMBER(22,6)
DOUBLE(44,12)          NUMBER(44,12)
TINYINT (3)            NUMBER(3)
SMALLINT(5)            NUMBER(5)
MEDIUMINT(8)           NUMBER(8)
INT(10)                NUMBER(10)
BIGINT(20)             NUMBER(20)
DATATIME               DATA

 

二、mysql和oracle數據類型對應關係參照表oracle

MySQL Data Typeide

Oracle Data Type函數

BIGINT工具

NUMBER(19, 0)sqlserver

BITpost

RAW

BLOB

BLOB, RAW

CHAR

CHAR

DATE

DATE

DATETIME

DATE

DECIMAL

FLOAT (24)

DOUBLE

FLOAT (24)

DOUBLE PRECISION

FLOAT (24)

ENUM

VARCHAR2

FLOAT

FLOAT

INT

NUMBER(10, 0)

INTEGER

NUMBER(10, 0)

LONGBLOB

BLOB, RAW

LONGTEXT

CLOB, RAW

MEDIUMBLOB

BLOB, RAW

MEDIUMINT

NUMBER(7, 0)

MEDIUMTEXT

CLOB, RAW

NUMERIC

NUMBER

REAL

FLOAT (24)

SET

VARCHAR2

SMALLINT

NUMBER(5, 0)

TEXT

VARCHAR2, CLOB

TIME

DATE

TIMESTAMP

DATE

TINYBLOB

RAW

TINYINT

NUMBER(3, 0)

TINYTEXT

VARCHAR2

VARCHAR

VARCHAR2, CLOB

YEAR

NUMBER

 

3、經常使用函數比較

 

一、返回當前時間的時間戳。

Oracle :( (in_DATETIME -TO_DATETIME('19700101','yyyymmdd'))*86400 - TO_INT(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))*3600)
mysql  :( timestampdiff(second,'19700101',in_DATETIME) - timestampdiff(second,utc_time(),now())) 

二、日期前一天

Oracle : sysdate - 1;
mysql  :  date_sub(curdate(),interval 1 day);

三、trim函數

trim('  xxxx  ')、ltrim(' xxxx ')、rtrim('  xxxx  ')            #Oracle與mysql用法一致都是去除兩邊、左邊、右邊的空格。 

Oracle
trim('1112222667671122','12') 、ltrim('1112222667671122','12')、rtrim('1112222667671122','12') #oracle用法是去除兩邊開始、左邊開始、右邊開始起的全部包含第二個字符串中的字符,因此結果爲6676七、66767112二、111222266767。

mysql要想實現這個方法也能夠,可是mysql只提供了trim一個方法,至於其餘的就要本身寫函數了。
TRIM('12' FROM '11122342341122') #2234234

  

 

其餘函數一覽表:

 

編號 類別 ORACLE MYSQL 註釋
1 數字函數 round(1.23456,4) round(1.23456,4) 同樣:
ORACLEselect round(1.23456,4) value from dual
MYSQL:select round(1.23456,4) value
2 abs(-1) abs(-1) 功能將當前數據取絕對值
用法: oraclemysql用法同樣
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 lengthstr 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_addressNULL, 就顯示1<true>,不然就顯示0<false>
18 DECODE(iv_sr_status,g_sr_status_com, ld_sys_date, NULL) 無,請用IFCASE語句代替.
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;
不然返回值則爲 expr3IF() 的返回值爲數字值或字符串值,具體狀況視其所在
語境而定。
用法
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
MYSQLselect 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內置函數SQLCODESQLERRM是特別用在OTHERS處理器中,分別用來返回Oracle的錯誤代碼和錯誤消息。
MYSQL: 能夠從JAVA中獲得錯誤代碼,錯誤狀態和錯誤消息
28 SQLERRM MYSQL中沒有對應的函數,但JAVA中SQLException。getMessage()函數能夠獲取錯誤消息 Oracle內置函數SQLCODESQLERRM是特別用在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中無相應的方法,其做用是在控制檯中打印,用於測試,對遷移無影響。 db

 

4、其餘差異

 一、在mysql5.6版本中,刪除數據的時候不能加入別名,在Oracle中這樣是能夠的。

delete from Wooyun_Threat_Info w where w.wooyunId ='efg';
delete from Wooyun_Threat_Info as w where w.wooyunId ='efg';      #這兩種都是錯誤的,

若想加入別名則能夠用下面的方式

delete from w using Wooyun_Threat_Info w where w.wooyunId ='10'
delete w from Wooyun_Threat_Info w where w.wooyunId ='11';

二、對於Oracle與mysql主鍵增加的問題

Oracle : select seq_vul_risk_task_info.nextval as taskid from dual
mysql  :  select max(auto_increment) from information_schema.TABLES where table_name='vul_risk_task_info'      #因爲有時候在mysql裏面auto_increment的值可能不止一個,因此就要取最大值。

可是對於Oracle來講每調用一次.nextval後,序列值就會加1,而mysql卻沒有若也想達到此目的,須要如下設置自增值。

alter table xx表名 AUTO_INCREMENT = yyy       #yyy必定得是正整數才能夠,這個是設置xx表的自增值。

  

 

1,oracle沒有offet,limit,在mysql中咱們用它們來控制顯示的行數,最多的是分頁了。oracle要分頁的話,要換成rownum。

2,oracle建表時,沒有auto_increment,全部要想讓表的一個字段自增,要本身添加序列,插入時,把序列的值,插入進去。

3,oracle有一個dual表,當select後沒有表時,加上的。不加會報錯的。select 1 這個在mysql不會報錯的,oracle下會。select 1 from dual這樣的話,oracle就不會報錯了。

4,對空值的判斷,name != ""這樣在mysql下不會報錯的,可是oracle下會報錯。在oracle下的要換成name is not null

5,oracle下對單引號,雙引號要求的很死,通常不許用雙引號,用了會報

ERROR at line 1:
ORA-00904: "t": invalid identifier

而mysql要求就沒有那麼嚴格了,單引號,雙引號均可以。

6,oracle有to_number,to_date這樣的轉換函數,oracle表字段是number型的,若是你$_POST獲得的參數是123456,入庫的時候,你還要to_number來強制轉換一下,否則後會被當成字符串來處理。而mysql卻不會。

7,group_concat這個函數,oracle是沒有的,若是要想用自已寫方法。

8,mysql的用戶權限管理,是放到mysql自動帶的一個數據庫mysql裏面的,而oracle是用戶權限是根着表空間走的。

9,group by,在下oracle下用group by的話,group by後面的字段必須在select後面出現,否則會報錯的,而mysql卻不會。

10,mysql存儲引擎有好多,經常使用的mysiam,innodb等,而建立oracle表的時候,不要這樣的,好像只有一個存儲引擎。

11,oracle字段沒法選擇位置,alter table add column before|after,這樣會報錯的,即便你用sql*plus這樣的工具,也無法改字段的位置。

12,oracle的表字段類型也沒有mysql多,而且有不少不一樣,例如:mysql的int,float合成了oracle的number型等。

13,oracle查詢時from 表名後面 不能加上as 否則會報錯的,select t.username from test as t而在mysql下是能夠的。

14,oracle中是沒有substring這個函數的,mysql有的。

相關文章
相關標籤/搜索