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中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可实现相似的功能;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • Oracle数据库的安装 基础概念 数据库:能够长期保存,支持多用户共享,通过数据模型尽可能的减少冗余的数据集合。...
    AAnna珠阅读 1,412评论 0 0
  • 一、前言 假设有一张用户表system_user,里面包含主键id、姓名name、年龄age的列属性,用户足迹表s...
    潜心之力阅读 325评论 0 1
  • 1.字符串拼接用 || 来进行字符串拼接,把MU和1313拼接为MU1313select 'MU'||'1313...
    测试进行中阅读 731评论 0 0
  • 主流关系型数据库 关系型数据库存储数据的特点 结构化查询语言: 数据类型: select * from emp; ...
    陈先森mansplain阅读 676评论 0 0
  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,712评论 0 2