本文介绍: Oracle转MySQL在函数语法数据结构上该怎么变

Oracle数据库向MySQL数据库转移表与语法逻辑

2022年2月17日


Oracle要转MySQL时需要修改相应属性
varchar2->varchar(255) 注意MySQL单表varchar字符串类型长度不要超过2^16 位字节,按照常用编码格式,MySQL一个varchar字符串长度为3字节,当然也可以转换varchar,如果真的遇到长文本可以转成text格式
decimal(12,2)->Double(12,2)(一般是这个样子的)
Oracle使用时,会自动进行类型转换,又是不需要手动转换比如查询一串字符串类型数字,进行加减时,可以自动将其变成数字类型进行加减

  1. to_date(‘2022-10-10’,‘yyyyMMdd HH24:mi:ss’) -> str_to_date(‘2022-10-10’,‘%Y%m%d %H:%i:%s’)
    经常使用format格式有 :
    %Y 4位格式的年份
    %y两位格式的年份
    %m月份数字 %M月份英语
    %V 周次,和Oracle的’ww’一样,都是依据每周日作为一个周次的开端
    %v 周次,依据每周一作为一个周次的开始
    %D日期英文
    %的日期数字
    %H24小时制的小时数
    %h12小时制的小时数
    %i分钟(00至59)
    %I小时(00到12)
  2. to_date(‘2022-10-10’,‘yyyyMMdd HH24:mi:ss’) -> CAST(“2008.08.09 08:09:30” AS DATETIME)
  1. to_char(‘2022-10-10’,‘yyyyMMdd HH24:mi:ss’) -> date_format(‘2022-10-10’,‘%Y%m%d %H:%i:%s’)
    format格式如上
  2. to_char(‘2022-10-10’,‘yyyyMMdd HH24:mi:ss’) -> time_format(‘2022-10-10’,‘%Y%m%d %H:%i:%s’)
    效果和date_format差不多,但是只能精确到小时,秒,date_format可以精确到如周次,上下午等
  1. 空值在排序中最前 示例
    order by field nulls first -> order by NOT ISNULL(field),field
  2. 空值在排序最后 示例
    order by field nulls last -> order by ISNULL(field),field
  1. 数字字符串
    Oracle : to_char()
    MySQL :convert(‘参数’,char)
    数字+‘’

  2. 字符串转数字
    Oracle : to_number()
    MySQL : 字段值+0
    CAST ( 字段名 AS 转换类型 )
    CONVERT ( 字段名 , 转换类型 )

  1. sysdate -> now() 或者 sysdate()
  1. MySQL:
    MySQL 为日期增加一时间间隔:date_add()
    加1天select date_add(now(), interval 1 day); — 加1天
    select date_add(now(), interval 1 hour); — 加1小时
    select date_add(now(), interval 1 minute); — 加1分钟
    select date_add(now(), interval 1 second); — 加1秒
    select date_add(now(), interval 1 microsecond); — 加1毫秒
    select date_add(now(), interval 1 week); — 加1周
    select date_add(now(), interval 1 month); — 加1月
    select date_add(now(), interval 1 quarter); — 加1季
    select date_add(now(), interval 1 year); — 加1年

  2. Oracle :
    第一种,直接加减数字。

select sysdate                      当前时间,
       sysdate + 1                  加一天,
       sysdate - 1                  减一天,
       sysdate + (1 / 24)           加一小时,
       sysdate + (1 / 24 / 60)      加一分钟,
       sysdate + (1 / 24 / 60 / 60) 加一秒钟
from dual;

第二种,使用 add_months() 函数

select sysdate                       当前时间,
       add_months(sysdate, 1)        加一月,
       add_months(sysdate, - 1)      减一月,
       add_months(sysdate, 1 * 12)   加一年
from dual;

第三种,使用 interval() 函数

select sysdate                as 当前时间,
sysdate + interval '1' year   as 加一年,
sysdate + interval '-1' year  as 减一年,
sysdate + interval '1' month  as 加一月,
sysdate + interval '1' day    as 加一天,
sysdate + interval '1' hour   as 加一小时,
sysdate + interval '1' minute as 加一分钟,
sysdate + interval '1' second as 加一秒
from dual;
  1. MySQL :
    CONCAT(string1,string2,…)参数无限可以添加字符串,但是如果任意一个参数null,则返回null
    GROUP_CONCAT( [DISTINCT] 要连接字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])为将查询结果以逗号为间隔连接起来
    运算,直接进行加减乘除,只对数字有效
  2. Oracle :
    使用“||”进行字符拼接,可以无限拼接
    使用concat但是只能连接两个参数,且如果参数不是字符串,Oracle也会将参数转化为字符串类型
  1. nvl() -> ifNull()
  2. nvl2() -> case when语句
  3. MySQL还有函数coalesce,该函数可以有无穷多个参数,该函数会从最左边参数到最右边参数进行输出,只会输出第一个非NULL的值,如果全为null则输出最后一个参数
  1. Oracle :
    substr(str,num1,[num2]) 从第num1个字符开始,截取字符串str的num2个字符

  2. MySQL :
    LOCATE(substr , str ):返回子串 substr 在字符串 str 中第一次出现的位置,如果字符substr在字符串str中不存在,则返回0
    SUBSTRING_INDEX(str ,substr ,n):返回字符substr在str中第n次出现位置之前的字符串
    SUBSTRING(str ,n ,m):返回字符串str从第n个字符截取到第m个字符

  3. 一般MySQL和Oracle都使用substring截取字符串,同时Oracle可以参数出现为0的情况,MySQL不行。并且两者的substring函数可以从右侧开始截取,只需要第一个参数是负数

  1. offset a rows fetch next b rows only -> limit a , b

  2. MySQL也可以使用between函数进行分页查询,最好是可以遇到索引,这样查询方便,分的页数越大,则导致limit语句查询越慢,而between语句查询性能不受影响,因为limit语句是进行的全局排序多次load会使得查询效率降低,limit只适用于取前N条数

  1. Oracle :
    rank() over (order by 参数 desc) 根据参数查询排名
    Oracle还有隐藏行rownumber,只需要查询结果后在外面加一层查询,就可以查询出排名
  2. MySQL :
    rank重复排序并列然后跳跃当前排序记录次数开始(递增或递减)排序
    row_number 遇重复值排序不并列,连续不间断(递增或递减)排序
    dense_rank 遇重复值排序并列然后继续不间断(递增或递减)排序
    且MySQL产生的参数不能是rank,如果要用需要加上单引号
  1. Oracle :length()和 lengthb()是否相等,相等则没有汉字,相等则有汉字
  2. MySQL : length()和 char_length()是否相等,相等则没有汉字,相等则有汉字
  • 日期规格化方面

  1. Oracle :使用trunc()函数可以获取一个日期的年月日格式
  2. MySQL : 使用date_format()函数可以对时间进行规格化
  • 取余

    Oracle和MySQL都使用mod()函数

  • 时间差值

    Oracle : 使用 trunc(date格式)-trunc(date格式)
    MySQL : 使用 to_days(date格式)-to_days(date格式)

  • 其他

  1. MySQL每一个生成的表都需要添加 别名 ,否则会报错,因为Oracle会自动识别同名临时表的字段,如果不是多个表共有的字段则不需要明显引用表名
  2. MySQL中 limit不能与in/all/any/some 连用,可以在这两层之间多加一层select隔绝,或者是使用inner join与查询自身得到的记录内联
  3. MySQL的case when语句不允许与count()函数混用
  4. 所有值和null进行计算后都会是null,所以可以在单组分组函数里面和外面均嵌套一层判断非空函数(应该有更简便的方法
  5. oracle 行转列 可以使用以下语句
 SELECT REGEXP_SUBSTR('A,B,C,D',  '[^,]+',   1,   ROWNUM)
   FROM DUAL 
CONNECT BY ROWNUM <= REGEXP_COUNT('A,B,C,D',  '[,]',  1) + 1;

原文地址:https://blog.csdn.net/weixin_43757056/article/details/134705212

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_18731.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注