Oracle转MySQL

转自:https://blog.****.net/tuesdayma/article/details/78414511

一、nvl()函数:

(1)oracle中的nvl()函数:

语法:

nvl(expr1,expr2)

含义:

如果expr1为空那么返回expr2,如果expr1值不为空,则返回expr1。

(2)mysql中的”nvl()”函数:

语法:

if null(expr1,expr2)

含义:

如果expr1为空那么返回expr2,如果expr1值不为空,则返回expr1。

二、decode()函数:

(1)oracle中的decode()函数:

语法:

decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,默认值)

含义:

当条件的值等于值1的时候,返回值1,当条件的值等于值2的时候,返回值2,当条件的值等于值n的时候,返回值n,如果条件与值1-值n都不想等,则返回默认值。相当于java中的if-else。

(2)mysql中的”decode()”函数:

语法:

ifnull( 
           etl( 
                 filed(col,…) 
                                        ) 
                                            )

filed函数:

语法:filed(str,str1,str2,str3……..)

含义:返回str在str1,str2,str3…..中的位置,假如str=str1,则返回1,;假如str=str2,则返回2。。。。。假如str1-strn中都没有str的值,则返回0。

注意:如果str 为NULL,则返回值为0 ,原因是NULL不能同任何值进行同等比较。

elt函数:

语法:elt(N,str1,str2,str3,…strn)

含义:如果N=1,则返回str1,N=2,则返回str2,N>n,,则返回null。

ifnull函数:

语法:if null(expr1,expr2)

含义:如果expr1为空那么返回expr2,如果expr1值不为空,则返回expr1。

总结以上三个函数:

decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,默认值)

等价于:

ifnull(elt(filed(条件,值1,值2….值n),返回值1,返回值2…..返回值n),默认值)

三、分页:

(1)oracle中的分页:

语法:

select * from(select t.* ,rownum r from 表名 t)where r>10 and r<20;

注意:

(1)表名必须要取别名:表名 t 
(2)*前面必须要指明表的别名 
(3)rownum 这个字段必须要用别名:,rownum r 
(4)分页的范围必须要用别名进行判断: r>10 and r<20

(2)mysql中的分页:

语法:

SELECT * FROM 表名 LIMIT 起始值-1, 取多少条记录 ;

举例:

SELECT * FROM 表名 LIMIT 20, 10 ;

说明:从第21条记录开始去10条记录,即取得是21,22,23,24,25,26,27,28,29,30这10条记录。

四、字符串截取:

(1)oracle中的字符串截取:

语法:

select substr(“目标字符串”,开始坐标,结束坐标) from dual;

Oracle转MySQL

Oracle转MySQL

Oracle转MySQL

注意:

oracle中的下标可以从0开始,也可以从1开始,而且两个效果是一样的,但是如果从-1开始则是取最后一个,截取长度这个参数将会失效

Oracle转MySQL

Oracle转MySQL

注意:

oracle中是没有substring这个函数的

(2)mysql中的字符串截取:

语法一:

select substr(“目标字符串”,开始坐标,截取长度) from dual;

Oracle转MySQL

Oracle转MySQL

Oracle转MySQL

注意:

1、myql中的下标不能0开始 
2、mysql下标也可以从-1开始,情况和orace一样

语法二:

select substring(“目标字符串”,开始坐标,截取长度) from dual;

Oracle转MySQL

Oracle转MySQL

注意:

myql中的substr和substring函数是一样的效果

语法三:

select mid(“目标字符串”,开始坐标,截取长度) from dual;

Oracle转MySQL

注意:

myql中的substr、mid和substring这三个函数是一样的效果

语法四:

select left(“目标字符串”,从左侧第一个开始的截取长度) from dual;

Oracle转MySQL

语法五:

select right(“目标字符串”,从右侧最后一个开始的截取长度) from dual;

Oracle转MySQL

五、结果集拼接(用,隔开):

(1)oracle中的wm_concat函数:

语法:

select 字段1 wm_concat(字段2) from 表名 group by 字段1;

注意:

wm_concat是分组函数,前面查询的字段需要在后面group by一下,如果不group by一个字段的话将会把所有行的字段2都用逗号拼接起来

例子:

Oracle转MySQL

(2)mysql中的group_concat函数:

语法:

select 字段1 group_concat(字段2) from 表名 group by 字段1;

注意:

1、group_concat也是分组函数,前面查询的字段同样需要在后面group by一下,如果不group by一个字段的话将会把所有行的字段2都用逗号拼接起来—–例子和oracle一样,这里就不举例了,或者详情可以参考:https://blog.****.net/tuesdayma/article/details/80284595

2、如果字段2中的值为null的时候,group_concat函数是不会留,给那个null值的,比如有三条记录,中间那条记录的字段2是null值,那么group_concat之后拼接出来的字段就只有两个值,即:记录1的字段2,记录3的字段2,而不是记录1的字段2,,记录3的字段2

六、uuid:

(1)oracle中获取uuid:

语法:

INSERT INTO 表名 VALUES ((select lower(sys_guid()) from dual), 值2, 值3);

(2)mysql中获取uuid:

语法:

INSERT INTO 表名 VALUES (replace(uuid(), ‘-‘,”), 值2,值3);

七、字符串转数字:

(1)oracle中数字转字符串:

语法:

select * from 表 order by to_number(字段);

(2)mysql中数字转字符串:

语法一:

select * from 表 where deleted=0 order by Convert(字段,int);

语法二:

select * from 表 where deleted=0 order by CAST(字段 as int);

语法三:

select * from 表 where deleted=0 order by (ordernumber+0);

========================================================

MySQL相对Oracle的一些问题:

1、 对子查询的优化表现不佳。

2、 对复杂查询的处理较弱

3、 查询优化器不够成熟
4、 性能优化工具与度量信息不足
5、 审计功能相对较弱
6、 安全功能不成熟,甚至可以说很粗糙。没有用户组与角色的概念,没有回收权限的功能(仅仅可以授予权限)。当一个用户从不同的主机/网络以同样地用户名/密码登录之后,可能被当作完全不同的用户来处理。没有类似于Oracle的内置的加密功能。
7、身份验证功能是完全内置的。不支持LDAP,Active Directory以及其它类似的外部身份验证功能。
8、Mysql Cluster可能与你的想象有较大差异。
9、存储过程与触发器的功能有限。
10、垂直扩展性较弱。
11、不支持MPP(大规模并行处理)。
12、支持SMP(对称多处理器),但是如果每个处理器超过4或8个核(core)时,Mysql的扩展性表现较差。
13、对于时间、日期、间隔等时间类型没有秒以下级别的存储类型。
14、可用来编写存储过程、触发器、计划事件以及存储函数的语言功能较弱。
15、没有基于回滚(roll-back)的恢复功能,只有前滚(roll-forward)的恢复功能。
16、不支持快照功能。
17、不支持数据库链(database link)。有一种叫做Federated的存储引擎可以作为一个中转将查询语句传递到远程服务器的一个表上,不过,它功能很粗糙并且漏洞很多。
18、数据完整性检查非常薄弱,即使是基本的完整性约束,也往往不能执行。
19、优化查询语句执行计划的优化器提示非常少。
20、只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort-merge join)与散列连接(hash join)。
21、大部分查询只能使用表上的单一索引;在某些情况下,会存在使用多个索引的查询,但是查询优化器通常会低估其成本,它们常常比表扫描还要慢。
22、不支持位图索引(bitmap index)。每种存储引擎都支持不同类型的索引。大部分存储引擎都支持B-Tree索引。
23、管理工具较少,功能也不够成熟。
24、没有成熟能够令人满意的IDE工具与调试程序。可能不得不在文本编辑器中编写存储过程,并且通过往表(调试日志表)中插入记录的方式来做调试。
25、每个表都可以使用一种不同的存储引擎。
26、每个存储引擎在行为表现、特性以及功能上都可能有很大差异。
27、大部分存储引擎都不支持外键。
28、默认的存储引擎(MyISAM)不支持事务,并且很容易损坏。
29、最先进最流行的存储引擎InnoDB由Oracle拥有。
30、有些执行计划只支持特定的存储引擎。特定类型的Count查询,在这种存储引擎中执行很快,在另外一种存储引擎中可能会很慢。
31、执行计划并不是全局共享的,,仅仅在连接内部是共享的。
32、全文搜索功能有限, 只适用于非事务性存储引擎。 Ditto用于地理信息系统/空间类型和查询。
33、没有资源控制。一个完全未经授权的用户可以毫不费力地耗尽服务器的所有内存并使其崩溃,或者可以耗尽所有CPU资源。
34、没有集成商业智能(business intelligence), OLAP 多维数据集等软件包。
35、没有与Grid Control类似的工具(http://solutions.mysql.com/go.php?id=1296&t=s)
36、没有类似于RAC的功能。如果你问”如何使用Mysql来构造RAC”,只能说你问错了问题。
37、不支持用户自定义类型或域(domain)。
38、 每个查询支持的连接的数量最大为61。
39、MySQL支持的SQL语法(ANSI SQL标准)的很小一部分。不支持递归查询、通用表表达式(Oracle的with 语句)或者窗口函数(分析函数)。支持部分类似于Merge或者类似特性的SQL语法扩展,不过相对于Oracle来讲功能非常简单。
40、 不支持功能列(基于计算或者表达式的列,Oracle11g 开始支持计算列,以及早期版本就支持虚列(rownum,rowid))。
41、不支持函数索引,只能在创建基于具体列的索引。
42、不支持物化视图。
43、不同的存储引擎之间,统计信息差别很大,并且所有的存储引擎支持的统计信息都只支持简单的基数(cardinality)与一定范围内的记录数(rows-in-a-range)。 换句话说,数据分布统计信息是有限的。更新统计信息的机制也不多。
44、没有内置的负载均衡与故障切换机制。
45、复制(Replication)功能是异步的,并且有很大的局限性。例如,它是单线程的(single-threaded),因此一个处理能力更强的Slave的恢复速度也很难跟上处理能力相对较慢的Master。
46、 Cluster并不如想象的那么完美。或许我已经提过这一点,但是这一点值得再说一遍。
47、数据字典(INFORMATION_SCHEMA)功能很有限,并且访问速度很慢(在繁忙的系统上还很容易发生崩溃)。
48、不支持在线的Alter Table操作。
49、不支持Sequence。
50、类似于ALTER TABLE或CREATE TABLE一类的操作都是非事务性的。它们会提交未提交的事务,并且不能回滚也不能做灾难恢复。Schame被保存在文件系统上,这一点与它使用的存储引擎无关。