最近项目需要把oracle数据库改为mysql数据库,所以原有的SQL就需要改动一下。
以下是oracle和mysql的一些区别。
数据类型
oracle | mysql | 备注 | |
---|---|---|---|
数值类型 | number | int/decimal | Oracle中的Number(10,2)对应MySQL中的decimal(10,2),Number(5) 对应 int(5) |
时间类型 | date、timestamp、interval | Date、Time、Datetime等类型 | MySQL中Date类型仅表示日期(年-月-日),Time类型仅表示时间(时:分:秒),而Datetime类型表示日期时间(年-月-日 时:分:秒),Oracle中的Date类型和MySQL中的Datetime类型一致。 |
字符串类型 | Varchar2(n) | varchar(n) |
常用函数等差异
功能 | oracle | mysql | 备注 |
---|---|---|---|
日期转字符串 | to_char(sys_date, ‘yyyyMMdd’) | date_format(sys_date,‘%Y%m%d’) | |
非日期转字符串 | to_char(200000.443133) | cast(200000.443133 as char) | MySQL可选类型: DATE:转换成日期。格式:“YYYY-MM-DD” DATETIME:转换成DATETIME 格式:“YYYY-MM-DD HH:MM:SS” TIME:转换成时间。格式:“HH:MM:SS” CHAR:转换成字符串 SIGNED:转换成签名(签名的64位整数) UNSIGNED:转换成UNSIGNED(无符号的64位整数) BINARY:转换 value 到BINARY(二进制字符串) |
字符串转日期 | to_date(‘2022-03-18’, ‘yyyy-MM-dd’) | str_to_date(‘2022-03-18’, ‘%Y-%m-%d’) | |
非空取值 | nvl(str, 0) | ifnull(str,0) | |
多条件判断取值 | decode(Source, 1, ‘02’, 2, ‘01’, ‘03’) | if(Source=1,‘02’,if(Source=2,‘01’,‘03’)) | |
字符串拼接 | a||b 拼接 | concat(a,b) | 另oracle的空是null,mysql有null和’'两种,判断的时候注意 |
左连接,右连接 | 左连接,右连接可以使用(+) | left join ,right join | |
获取前面n条记录 | rownum获取前n条记录 | limit来获取前n条记录 | |
返回不小于 X 的最小整数 | ceil(X) | ceiling(X) | |
截取字符串 | substr(‘abcd’,2,2) | substring(‘abcd’,2,2) | |
instr(‘abcdefg’,’ab’) | locate(‘ab’,’abcdefg’) | 注意:locate的子串和总串的位置要互换 | |
字符串长度 | length(str) | char_length(str) | |
trunc(-1.002) | cast(-1.002 as SIGNED) | mysql可用的类型: 二进制,同带binary前缀的效果 : BINARY 字符型,可带参数 : CHAR() 日期 : DATE 时间: TIME 日期时间型 : DATETIME 浮点数 : DECIMAL 整数 : SIGNED 无符号整数 : UNSIGNED | |
字符串转数值类型 | to_number(str) | cast(str AS SIGNED INTEGER) | |
当前日期 | SYSDATE | now() / SYSDATE() | |
日期加减 | Next_day(sysdate,7) | DATE_ADD(sysdate() ,interval +7 day) | DATE_ADD(d,INTERVAL expr type) type值:YEAR、MONTH、DAY、HOUR、WEEK |
日期加减 | ADD_MONTHS(sysdate, 2) | DATE_ADD(sysdate(), interval 2 month) | |
两个日期相差天数 | 2个日期相减(D1-D2) | DATEDIFF(date1,date2) | |
生成随机数列 | sys_guid() | UUID() |
其他区别
如 MySQL可识别双引号和单引号,Oracle只能识别单引号。
构建临时表:oracle可用with;mysql可用(),但必须加上临时表名
-- Oracle with使用
WITH tmptab AS (SELECT a.s_id FROM student a)
SELECT s_id FROM tmptab
-- MySQL 构建临时表使用(此处必须给括号中的临时表设置表名)
select b.s_id from (select s_id from student ) b
相同部分
数字函数:round()、abs()、floor()、max()、min()、sum()
字符函数:ascii()、char()、replace()、coalesce()、instr()、lpad()、upper()、lower()、
开窗函数:ROW_NUMBER() OVER(PARTITION BY 分组字段 order by 排序字段 asc)
另外关于时间格式用法,可以学习:http://www.zzvips.com/article/45368.html
资料都是整理的!!!如有雷同,不是巧合。
(未完待续!)