Oracle與Mysql數據庫SQL語法差異化整理

0、數據類型
1.Oracle中有NUMBER;MySQL中有INT/INTEGER/DECIMAL。
  其等換寫法INT=NUMBER(10),DECIMAL=NUMBER(10,2)
2.Oracle中有VARCHAR2;MySQL有VARCHAR
3.Oracle中有DATE,包含年月日時分秒;MySQL中有DATE/TIME/DATETIME可任選;
1、字符串截取,substr(“目標字符串”,開始坐標,截取長度)
oracle:
substr( string , 0, 10),可以從0開始也可以從1開始,效果一樣;   

mysql:
substr( string , 1, 10)必須從1 開始;substring、mid與substr效果一樣;
mysql中l(wèi)eft(“目標字符串”,從左側第一個開始的截取長度);
mysql中right(“目標字符串”,從右側最后一個開始的截取長度);
2、日期-字符串轉換
            oracle用法     -->       mysql用法
to_char(sysdate,'yyyy-mm-dd') --> date_format(now(),'%Y-%m-%d');    
to_date('2023-08-01','yyyy-mm-dd') --> str_to_date('2023-08-01','%Y-%m-%d');
3、取時間
oracle:
sysdate關鍵字,獲取系統(tǒng)本地時間。
  如:select sysdate from dual;

mysql:
now()函數或者current_date關鍵字,獲取系統(tǒng)本地時間。
   如:select now() from dual;
      select current_date from dual;

擴展:SYSDATE()函數實際上返回執(zhí)行時的時間,NOW()函數返回一個常量時間,該語句開始執(zhí)行。
mysql> SELECT NOW(), SLEEP(5), NOW();
+---------------------+----------+---------------------+
| NOW()               | SLEEP(5) | NOW()               |
+---------------------+----------+---------------------+
| 2023-08-01 11:36:22 |        0 | 2023-08-01 11:36:22 |
+---------------------+----------+---------------------+
由上執(zhí)行后可以看出:即便睡眠了5秒,兩次now()的值還是一樣的;

mysql>  SELECT SYSDATE(), SLEEP(5), SYSDATE();
+---------------------+----------+---------------------+
| SYSDATE()           | SLEEP(5) | SYSDATE()           |
+---------------------+----------+---------------------+
| 2023-08-01 11:40:05 |        0 | 2023-08-01 11:40:10 |
+---------------------+----------+---------------------+
由上執(zhí)行后可以看出:睡眠了5秒后,SYSDATE()的值比前面大了5秒;
4、日期直接加減的含義不同了
oracle:
SELECT sysdate() AS current_time, sysdate()-1 AS yesterday_time;
結果將如下所示:
---------------------  ------------------------
current_time           yesterday_time
---------------------  ------------------------
2023-08-02 10:00:00    2023-08-01 10:00:00
---------------------  ------------------------
由上執(zhí)行后可以看出:返回當前時間前一天對應的時間(減1天)

mysql:
方式1:select sysdate() - 1 from dual;--返回當前時間前一天對應的時間(減1天)
[推薦]方式2:select date_sub(now(), interval 1 DAY) from dual;--返回當前時間前一天對應的時間(減1天)
5、字符串連接(拼接)
oracle:
方式1:CONCAT(char1, char2) 函數; --當其中一個參數為NULL的時候,返回另一個不為NULL的參數,如果所有都為NULL則返回NULL;
方式2:"char1 || char2"
mysql:
方式1:CONCAT(char1, char2)可以拼接多個字符串,但只要有一個為NULL,則返回NULL值;
如:
  SELECT CONCAT('1,',NULL,'2');
  結果為 NULL
  SELECT CONCAT('1,','','2');
  結果為 1,2
6、分頁
oracle分頁關鍵字rownum,需要作為where條件;
如:select * from table as t where t.name='XX' and rownum > 10 and rownum <= 15; --取值11,12,13,14,15

mysql分頁limit關鍵字; 
如:select * from table as t where t.name='XX' limit 10, 5;--取值11,12,13,14,15
7、nvl()函數-判斷空
oracle:
nvl(expr1,expr2),如果expr1為空那么返回expr2,如果expr1值不為空,則返回expr1。
擴展:nvl2函數的是nvl函數的拓展,基本語法為nvl2(E1,E2,E3),意思是E1為null,就返回E3,不為null就返回E2。

mysql:沒有nvl()方法;
需要替換為 ifnull(expr1,expr2);如果expr1為空那么返回expr2,如果expr1值不為空,則返回expr1。
擴展:IF(expr1,expr2,expr3):如果expr1不為null,則返回expr2,否則返回expr3。
8、decode()函數
oracle:
decode(條件,值1,返回值1,值2,返回值2,…值n,返回值n,默認值);
   當條件的值等于值1的時候,返回值1,當條件的值等于值2的時候,返回值2,如果條件與值1-值n都不想等,則返回默認值。相當于java中的if-else。

mysql:沒有decode函數;
需要替換為 ifnull(elt(filed(條件,值1,值2….值n),返回值1,返回值2…..返回值n),默認值)
擴展:case when then else end,判斷when,返回then,都匹配不上時,返回else;
9、結果集拼接
oracle:
wm_concat(字段2),wm_concat是分組函數,前面查詢的字段需要在后面group by一下,如果不group by一個字段的話將會把所有行的字段2都用逗號拼接起來;

mysql:
group_concat(字段2),group_concat也是分組函數,前面查詢的字段同樣需要在后面group by一下;group_concat函數是不會留null值的;
10、uuid獲取
oracle:sys_guid()
mysql:uuid()
11、字符串轉數字,數字轉字符串
oracle: 
字符串轉數字:to_number(字段)
數字轉字符串:to_char(123)

mysql:
字符串轉數字:Convert(字段,SIGNED)  或者 CAST(字段 as SIGNED) 
數字轉字符串:CAST(123 as CHAR(3))
以上方法為通用方法,可選類型如下:
    字符型,可帶參數 : CHAR()     
    日期 : DATE     
    時間: TIME     
    日期時間型 : DATETIME     
    浮點數 : DECIMAL      
    整數 : SIGNED     
    無符號整數 : UNSIGNED 
12、左連接、右連接
oracle:可以使用(+)或者right join、left join;
如:右連接select * from a,b where a.id(+)=b.id;
左連接select * from a,b where a.id=b.id(+);

mysql:只有right join、left join可以實現
13、全連接
oracle:full join 關鍵字
mysql:union 關鍵字
14、臨時表
oracle:可以用with構建一張臨時表;
如:with table_temp as (select * from a where ...); 
        select * from table_temp;

mysql:不支持構建臨時表; 使用(select ...)的子查詢語句,就會自動創(chuàng)建臨時表;
15、自動增長
oracle:沒有自動增長的數據類型,需要創(chuàng)建自增的序列號;
mysql:AUTO_INCREMENT設置字段自動增長;
16、判斷空
oracle:空值只有null,通過is null判空;
mysql:空值有null 和 '',通過is null 和 ='' 同時判空;
17、字符串長度
oracle:length(str)
mysql:char_length(str)
18、數值截取
oracle:trunc()函數
    1、截取掉(去掉)小數點后指定位數的數值,如果該位數為負數,則將小數點前的數值對應的位數變成0,如果位數超出數值的整數部分則結果為0;如下例:
        -- 首先看對數值進行截取操作
        SELECT TRUNC(122.123, 4) from dual;     # 122.123
        SELECT TRUNC(122.123, 3) from dual;     # 122.123
        SELECT TRUNC(122.123, 2) from dual;     # 122.12
        SELECT TRUNC(122.123, 1) from dual;     # 122.1
        SELECT TRUNC(122.123, 0) from dual;     # 122
        SELECT TRUNC(122.123, -1) from dual;     # 120
        SELECT TRUNC(122.123, -2) from dual;     # 100
        SELECT TRUNC(122.123, -3) from dual;     # 0
        SELECT TRUNC(122.123, -4) from dual;     # 0
    2、針對日期的截取,如下例:
        -- 首先看對數值進行截取操作(今天的日期是2022年2月24日)
        SELECT TRUNC(sysdate, 'YY') from dual;  # 01-1月 -22
        SELECT TRUNC(sysdate, 'yy') from dual;  # 01-1月 -22
        SELECT TRUNC(sysdate, 'MM') from dual;  # 01-2月 -22
        SELECT TRUNC(sysdate, 'mm') from dual;  # 01-2月 -22
        SELECT TRUNC(sysdate, 'DD') from dual;  # 24-2月 -22
        SELECT TRUNC(sysdate, 'dd') from dual;  # 24-2月 -22

mysql:truncate()函數
    1、截取掉(去掉)小數點后指定位數的數值,如果該位數為負數,則將小數點前的數值對應的位數變成0,如果位數超出數值的整數部分則結果為0;如下例:
        -- 等同于Oracle的trunc函數。作用是對日期或數值進行截取操作
        -- 首先看對數值進行截取操作
        SELECT TRUNCATE(122.123, 4) from dual;  # 122.123
        SELECT TRUNCATE(122.123, 3) from dual;  # 122.123
        SELECT TRUNCATE(122.123, 2) from dual;  # 122.12
        SELECT TRUNCATE(122.123, 1) from dual;  # 122.1
        SELECT TRUNCATE(122.123, 0) from dual;  # 122
        SELECT TRUNCATE(122.123, -1) from dual; # 120
        SELECT TRUNCATE(122.123, -2) from dual; # 100
        SELECT TRUNCATE(122.123, -3) from dual; # 0
        SELECT TRUNCATE(122.123, -4) from dual; # 0
    2、不支持對日期的截?。梢允褂胐ate_format函數);
        DATE_FORMAT(NOW(),'%m-%d-%Y')    #02-24-2022
        參考:[MySQL DATE_FORMAT() 函數](https://www.w3school.com.cn/sql/func_date_format.asp)

19、引號
oracle:sql中只識別英文單引號;
mysql:sql中可識別英文的雙引號和英文單引號;
20、merge into
oracle:
支持merge into,判斷B表和A表是否滿足ON中條件,如果滿足則用B表去更新A表,如果不滿足,則將B表數據插入A表;

mysql:
不支持merge into,提供的replace into 和on duplicate key update可實現相似的功能;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Oracle數據庫的安裝 基礎概念 數據庫:能夠長期保存,支持多用戶共享,通過數據模型盡可能的減少冗余的數據集合。...
    AAnna珠閱讀 1,449評論 0 0
  • 一、前言 假設有一張用戶表system_user,里面包含主鍵id、姓名name、年齡age的列屬性,用戶足跡表s...
    潛心之力閱讀 479評論 0 1
  • 1.字符串拼接用 || 來進行字符串拼接,把MU和1313拼接為MU1313select 'MU'||'1313...
    測試進行中閱讀 971評論 0 0
  • 主流關系型數據庫 關系型數據庫存儲數據的特點 結構化查詢語言: 數據類型: select * from emp; ...
    陳先森mansplain閱讀 841評論 0 0
  • 1.簡介 數據存儲有哪些方式?電子表格,紙質文件,數據庫。 那么究竟什么是關系型數據庫? 目前對數據庫的分類主要是...
    喬震閱讀 2,004評論 0 2

友情鏈接更多精彩內容