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()
  • 逻辑表

    from dual -> 可以不使用 from TableName 这部分

  • 对时间进行加减

  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;
  • 取小数

    Oracle : round(12345,2)按照四舍五入取小数
    floor() 取整数
    MySQL :convert

  • 连接字符串

  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则输出最后一个参数
  • ##条件判断
    decode() -> case when 语句

  • ##截取子串

  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,如果要用需要加上单引号
  • 连接查询

    Oracle : full join -> union

  • 字符串比较大小方面

    字符串可以进行比较,比较的是分别对相同位数的字符进行ascii码的比较

  • 判断字符串是否含有中文

  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;

你可能感兴趣的:(oracle,mysql)