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使用时,会自动进行类型转换,又是不需要手动转换,比如查询一串字符串类型的数字,进行加减时,可以自动将其变成数字类型进行加减
- 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) - to_date(‘2022-10-10’,‘yyyyMMdd HH24:mi:ss’) -> CAST(“2008.08.09 08:09:30” AS DATETIME)
- to_char(‘2022-10-10’,‘yyyyMMdd HH24:mi:ss’) -> date_format(‘2022-10-10’,‘%Y%m%d %H:%i:%s’)
format格式如上 - to_char(‘2022-10-10’,‘yyyyMMdd HH24:mi:ss’) -> time_format(‘2022-10-10’,‘%Y%m%d %H:%i:%s’)
效果和date_format差不多,但是只能精确到小时,秒,date_format可以精确到如周次,上下午等
- 空值在排序中最前 示例:
order by field nulls first -> order by NOT ISNULL(field),field - 空值在排序中最后 示例:
order by field nulls last -> order by ISNULL(field),field
-
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年 -
Oracle :
第一种,直接加减数字。
select sysdate 当前时间,
sysdate + 1 加一天,
sysdate - 1 减一天,
sysdate + (1 / 24) 加一小时,
sysdate + (1 / 24 / 60) 加一分钟,
sysdate + (1 / 24 / 60 / 60) 加一秒钟
from dual;
select sysdate 当前时间,
add_months(sysdate, 1) 加一月,
add_months(sysdate, - 1) 减一月,
add_months(sysdate, 1 * 12) 加一年
from dual;
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;
- MySQL :
CONCAT(string1,string2,…)参数无限多可以添加字符串,但是如果任意一个参数为null,则返回null
GROUP_CONCAT( [DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])为将查询结果以逗号为间隔连接起来
运算,直接进行加减乘除,只对数字有效 - Oracle :
使用“||”进行字符串拼接,可以无限拼接
使用concat但是只能连接两个参数,且如果参数不是字符串,Oracle也会将参数转化为字符串类型
-
判空函数
- nvl() -> ifNull()
- nvl2() -> case when语句
- MySQL还有函数coalesce,该函数可以有无穷多个参数,该函数会从最左边的参数到最右边的参数进行输出,只会输出第一个非NULL的值,如果全为null则输出最后一个参数
-
Oracle :
substr(str,num1,[num2]) 从第num1个字符开始,截取字符串str的num2个字符串 -
MySQL :
LOCATE(substr , str ):返回子串 substr 在字符串 str 中第一次出现的位置,如果字符substr在字符串str中不存在,则返回0
SUBSTRING_INDEX(str ,substr ,n):返回字符substr在str中第n次出现位置之前的字符串
SUBSTRING(str ,n ,m):返回字符串str从第n个字符截取到第m个字符 -
一般MySQL和Oracle都使用substring截取字符串,同时Oracle可以参数出现为0的情况,MySQL不行。并且两者的substring函数可以从右侧开始截取,只需要第一个参数是负数
-
MySQL也可以使用between函数进行分页查询,最好是可以遇到索引,这样查询方便,分的页数越大,则导致limit语句查询越慢,而between语句查询性能不受影响,因为limit语句是进行的全局排序,多次load会使得查询效率降低,limit只适用于取前N条数据
-
查看排名
- Oracle :
rank() over (order by 参数 desc) 根据参数查询排名
Oracle还有隐藏行rownumber,只需要查询结果后在外面加一层查询,就可以查询出排名 - MySQL :
rank 遇重复值排序并列,然后跳跃到当前排序记录次数开始(递增或递减)排序
row_number 遇重复值排序不并列,连续不间断(递增或递减)排序
dense_rank 遇重复值排序并列,然后继续不间断(递增或递减)排序
且MySQL产生的参数不能是rank,如果要用需要加上单引号
-
取余
Oracle和MySQL都使用mod()函数
-
时间差值
Oracle : 使用 trunc(date格式)-trunc(date格式)
MySQL : 使用 to_days(date格式)-to_days(date格式) -
其他
- MySQL每一个生成的表都需要添加 别名 ,否则会报错,因为Oracle会自动识别同名临时表的字段,如果不是多个表共有的字段则不需要明显引用表名
- MySQL中 limit不能与in/all/any/some 连用,可以在这两层之间多加一层select隔绝,或者是使用inner join与查询自身得到的记录集内联
- MySQL的case when语句不允许与count()函数混用
- 所有值和null进行计算后都会是null,所以可以在单组分组函数里面和外面均嵌套一层判断非空函数(应该有更简便的方法)
- 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进行投诉反馈,一经查实,立即删除!