数据库差异小记

数据库差异小记

一、 数据类型区别

1.整型
Mysql:使用int、decimal、float、double等
Oracle:常用的只有number,没有int、decimal、float、double等类型
2.字符串型
Mysql:只有varchar型,没有varchar2型
Oracle:只有varchar2型,没有varchar型(varchar2把空串等同于null处理,而varchar仍按照空串处理)
3.时间类型
Mysql:date和time都有,都占3个字节
Oracle:只有date,且占7个字节
4.自动增长列
Mysql:有自动增长列字段,可以直接添加
Oracle:没有自动增长列字段,使用Sequence或者触发器完成
5.非空字段
Mysql:非空字段也能存空字符串
Oracle:非空字段不能存空字符串

二、 函数区别

1.获取字符串位置函数
Mysql:instr(字段名,字符串)返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始),或者使用locate()函数
Oracle:instr('源字符串','目标字符串','开始位置','第几次出现')返回内容一致,后两个参数可省略
2.截取字符串函数
Mysql:substring('abcd',2,2)
Oracle:substr('abcd',2,2)
3.字符串长度函数
Mysql:char_length('AAAASDF')
Oracle:length('AAAASDF')
4.字符串转换成时间函数
Mysql:STR_TO_DATE(str,format)
Oracle:to_date(str,format)
5.时间加减函数
  Mysql:
  1、 date_sub(date,interval date);
  date_sub(curdate(),interval 1 day) 加一天
  date_sub(curdate(),interval 1 mouth) 加一个月
  date_sub(curdate(),interval -1 year)减一年
  2、 DATEDIFF(date1,date2)、TIMEDIFF(date1,date2),date1减date2;
  Oracle:可直接加减时间或日期;ADD_MONTHS(sysdate,1)获取下个月,没有add_days和add_years函数,获取时间差可直接date1-date2;
6.返回不小于X的最小整数函数
Mysql:ceiling(x)
Oracle:ceil(x)

三、循环结构区别

1.If循环
Mysql :if……elseif
Oracle:if……elsif
2.While循环
Mysql:WHILE……DO……END WHILE
Oracle:WHILE......LOOP......END LOOP
3.For/loop循环
Mysql: LOOP     // lp1 为循环体名称 LOOP 为关键字
insert into user_profile (uid) values (i);
set i = i+1;
if i > 30 then
leave lp1;              // 离开循环体
end if;
end LOOP;              // 结束循环
Oracle: FOR X IN REVERSE 1..10 LOOP --reverse由大到小
DBMS_OUTPUT.PUT_LINE('内:x='||x);
END LOOP;
DBMS_OUTPUT.PUT_LINE('end loop:x='||X); x=1;
END;

四、存储结构区别

1.创建存储过程
Mysql:mysql使用create创建存储过程,且在存储过程中不能创建别的存储过程
Oracle:使用create or replace的方法创建存储过程,且存储过程如果定义在包中,一个包中可以包含多个存储过程和方法.如果定义在Procedures中,存储过程中不可以定义多个存储过程
2.创建函数
Mysql:使用create创建,且Functions不可以定义多个函数,返回值用returns
Oracle:使用create or replace的方法创建,且oracle 函数可以定义在package中,也可以定义在Functions中. 如果定义在包中,一个包中可以包含多个存储过程和函数.如果定义在Functions中,每个函数只能定义一个函数,返回值用return
3.传入参数
Mysql:函数中参数类型in/out/inout写在参数名前面,且in可以省略,out和inout不可省略
Oracle:函数中参数类型in/out/inout写在参数名后面,且都必须写,不可省略
4.在存储过程中调用存储过程
Mysql:存储过程调用存储过程,需要使用Call pro_name(参数)
Oracle:调用存储过程直接写存储过程名就可以了
5.过程和函数的声明变量的位置不同
Mysql:声明变量在begin...end体内,begin之后其他任何内容之前
Oracle:声明变量在begin…end体之前

五、触发器区别

1.创建语句
Mysql:Mysql使用 create trigger创建触发器,每个触发器只支持一个事件
Oracle:Oracle使用create or replace trigger语法创建触发器,可以在一个触发器触发insert,delete,update事件
2.显示编辑
Mysql:mysql trigger 不能在客户端显示或编辑.需要在服务器所在的机器上操作
Oracle:Oracle trigger 能在客户端显示或编辑.需要在服务器所在的机器上操作

六、基本语法区别

1.退出语句
Mysql:使用leave语句,如果leave语句后面跟的是存储过程名,则退出当前存储过程. 如果leave语句后面跟的是lable名. 则退出当前lable
Oracle:使用exit语句,如果exit语句在循环中就退出当前循环.如果exit语句不再循环中,就退出当前过程或方法
2.注释方式
Mysql:使用"-- message" 或 "/** …. /" 或 "/ …. /"来注释
Oracle:Oracle使用"-- message" 或 "/ …. */" 或 "#"来注释
3.时间格式及获取当前时间
Mysql:Mysql时间格式:%Y-%m-%d %H:%i:%s ,获取当前时间为now()
Oracle:Oracle时间格式:yyyy-MM-dd hh:mi:ss ,获取当前时间为SYSDATE
4.连接字符串
Mysql:Mysql使用concat方法连接字符串. MySQL的concat函数可以连接一个或者多个字符串
Oracle:oracle使用||连接字符串,也可以使用concat函数. 但Oracle的concat函数只能连接两个字符串

七、其他区别

1.分页查询
Mysql:查询分页时使用limit辅助查询
Oracle:使用rownum辅助分页查询
2.连接查询
Mysql:只能使用left join ,right join等关键字
Oracle:Oracle左连接,右连接可以使用(+)来实现,"(+)"所在位置的另一侧为连接的方向
3.模糊查询速度
Mysql:使用 字段名 like '%字符串%'进行模糊查询
Oracle:Oracle里也可以用字段名 like '%字符串%'进行模糊查询 但这种方法不能使用索引, 速度不快,用字符串比较函数 instr(字段名,'字符串')>0 会得到更精确的查找结果

使用建议:

a.尽量避免使用空字符串
b.在Oracle数据库使用instr()函数时只使用前两个参数
c.在Mysql数据库中使用cancat()函数时,一次只连接两个字符串,需要连接多个的时候嵌套使用函数

posted @ 2019-10-10 14:34  ID_小汤  阅读(325)  评论(0编辑  收藏  举报