Oracle与Mysql数据库SQL语法差异化整理
2023-07-31 本文已影响0人
王大千_xMol_西摩尔
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中left(“目标字符串”,从左侧第一个开始的截取长度);
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关键字,获取系统本地时间。
如:select sysdate from dual;
mysql:
now()函数或者current_date关键字,获取系统本地时间。
如:select now() from dual;
select current_date from dual;
扩展:SYSDATE()函数实际上返回执行时的时间,NOW()函数返回一个常量时间,该语句开始执行。
mysql> SELECT NOW(), SLEEP(5), NOW();
+---------------------+----------+---------------------+
| NOW() | SLEEP(5) | NOW() |
+---------------------+----------+---------------------+
| 2023-08-01 11:36:22 | 0 | 2023-08-01 11:36:22 |
+---------------------+----------+---------------------+
由上执行后可以看出:即便睡眠了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 |
+---------------------+----------+---------------------+
由上执行后可以看出:睡眠了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
--------------------- ------------------------
由上执行后可以看出:返回当前时间前一天对应的时间(减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 ...)的子查询语句,就会自动创建临时表;
15、自动增长
oracle:没有自动增长的数据类型,需要创建自增的序列号;
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可实现相似的功能;