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、不支持對日期的截让霞(可以使用date_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可實現相似的功能晚唇;