mysql与oracle的区别 2_第1页
mysql与oracle的区别 2_第2页
mysql与oracle的区别 2_第3页
mysql与oracle的区别 2_第4页
mysql与oracle的区别 2_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1.组函数用法规则mysql中组函数在select语句中可以随意使用,但在oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的,或者是group by子句中的列否则报错eg:select name,count(money) from user;这个放在mysql中没有问题在oracle中就有问题了。2.自动增长的数据类型处理MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。CREATE SEQUENCE序列号的名称(最好是表名+序列号标记)INC

2、REMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;其中最大的值按字段的长度来定,如果定义的自动增长的序列号NUMBER(6),最大值为999999INSERT语句插入这个字段值为:序列号的名称.NEXTVAL3.单引号的处理MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。4.翻页的SQL语句的处理MYSQL处理翻页的SQL语句比较简单,用LIMIT开始位置,记录个数;PHP里还可以用SEEK定位到结果集的位置。ORACLE处理翻页

3、的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置,并且只能用ROWNUM<100,不能用ROWNUM>80。以下是经过分析后较好的两种ORACLE翻页SQL语句(ID是唯一关键字的字段名):语句一:SELECT ID, FIELD_NAME,. FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) WHERE NUMROW > 80 AND NUMROW < 100 ) OR

4、DER BY 条件3;语句二:SELECT * FROM ( SELECT ROWNUM AS NUMROW, c.* from (select FIELD_NAME,. FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;5.长字符串的处理长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节,如果要插入更长的字符串,请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LO

5、B程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。6.日期字段的处理MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为SYSDATE,精确到秒,或者用字符串转换成日期型函数TO_DATE(2001-08-01,YYYY-MM-DD)年-月-日24小时:分钟:秒的格式YYYY-MM-DD HH24:MI:SS TO_DATE()还有很多种日期格式,可以参看ORACLE DOC.日期型字段转换成字符串函数TO_CHAR(2001-08-01,YYYY-MM-DD

6、 HH24:MI:SS)日期字段的数学运算公式有很大的不同。MYSQL找到离当前时间7天用DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE - 7;MYSQL中插入当前时间的几个函数是:NOW()函数以'YYYY-MM-DD HH:MM:SS'返回当前的日期时间,可以直接存到DATETIME字段中。CURDATE()以YYYY-MM-DD的格式返回今天的日期,可以直接存到DATE字段中。CURTIME()以HH:MM:SS的格式返回当前的时

7、间,可以直接存到TIME字段中。例:insert into tablename (fieldname) values (now()而oracle中当前时间是sysdate7.空字符的处理MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构,导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。8.字符串的模糊比较MYSQL里用字段名like%字符串%,ORACLE里也可以用字段名like%字符串%但这种方法不能使用索引,速度不快,用字符串比较函数instr

8、(字段名,字符串)>0会得到更精确的查找结果。9. 程序和函数里,操作数据库的工作完成后请注意结果集和指针的释放。Oracle和mysql的一些简单命令对比1)SQL> select to_char(sysdate,'yyyy-mm-dd') from dual;SQL> select to_char(sysdate,'hh24-mi-ss') from dual;mysql> select date_format(now(),'%Y-%m-%d');mysql> select time_format(now(),&

9、#39;%H-%i-%S');日期函数增加一个月:SQL> select to_char(add_months(to_date ('20000101','yyyymmdd'),1),'yyyy-mm-dd') from dual;结果:2000-02-01SQL> select to_char(add_months(to_date('20000101','yyyymmdd'),5),'yyyy-mm-dd') from dual;结果:2000-06-01mysql> se

10、lect date_add('2000-01-01',interval 1 month);结果:2000-02-01mysql> select date_add('2000-01-01',interval 5 month);结果:2000-06-01截取字符串:SQL> select substr('abcdefg',1,5) from dual;SQL> select substrb('abcdefg',1,5) from dual;结果:abcdemysql> select substring('

11、;abcdefg',2,3);结果:bcdmysql> select mid('abcdefg',2,3);结果:bcdmysql> select substring('abcdefg',2);结果:bcdefgmysql> select substring('abcdefg' from 2);结果:bcdefg2) 在MySQL中from 后的表如果是(select.)这种,那么后面必须有别名3) 连接字符串在Oracle中用| ,SqlServer中用+,MySQL中用concat('a','

12、b','c')4)在SqlServer中的写法:复制代码代码如下:declare id varchar(50);set id='4028e4962c3df257012c3df3b4850001'select * from sims_sample_detect where ID= id;在MySQL中的写法:复制代码代码如下:set a = 189;select * from bc_article where id = a /不用declare在Orcale中的写法:5)MySQL存储过程:复制代码代码如下:DELIMITER $DROP PROCEDUR

13、E IF EXISTS SIMS.transaction_delSampleInfo$CREATE DEFINER=root% PROCEDURE transaction_delSampleInfo(in sampleInfoId varchar(50)BEGINstart transaction;update sims_sample_info set del='1' where ID = sampleInfoId;update sims_sample_detect set del='1' where SAMPLE_ID_PARENT = sampleInfoI

14、d;update sims_sample_detect_info set del='1' where DETECT_ID in(select ID from sims_sample_detect where SAMPLE_ID_PARENT = sampleInfoId);commit;END$DELIMITER ;变量名不能跟列名相同,否则效果为1=1,且MySQL不区分大小写。6)mysql 游标mysql没有像orcale的动态游标,只有显示游标,例子如下:复制代码代码如下:DELIMITER $DROP PROCEDURE IF EXISTS test.liyukun$

15、CREATE DEFINER=idslocalhost PROCEDURE liyukun(out z int)BEGINdeclare count1 int;DECLARE done INT DEFAULT 0;declare v_haoma varchar(50);declare v_yingyeting varchar(100);DECLARE cur1 CURSOR FOR select haoma,yingyeting from eryue where id<2;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;/这里和orac

16、le有区别,Oracle的PL/SQL的指针有个隐性变量%notfound,Mysql是通过一个Error handler的声明来进行判断的OPEN cur1;cur1: LOOPFETCH cur1 INTO v_haoma,v_yingyeting;IF done=1 THEN /如果没有数据了,则离开LEAVE cur1;ELSEselect count(*) into count1 from year2012 where haoma=v_haoma ;if(count1=0) theninsert into year2012(haoma, yingyeting)values(v_hao

17、ma,v_yingyeting);elseset z = z+1;update year2012 set eryue = 100' where haoma=v_haoma;end if;END IF;END LOOP cur1;CLOSE cur1;END$DELIMITER ;执行:复制代码代码如下:call liyukun(a);select a;7) mysql的group by 语句可以select 没有被分组的字段,如select id,name,age from A group by age 这样但是在orcale和sqlserver中是会报错的。这个取出的id,name所

18、在的行是每个分组中的第一行数据。8)orcale用decode()来转换数据,mysql,sqlserver用case when:case t.DETECT_RESULT when '2402' then t.SAMPLEID end (必须有end)9)mysql: 两个select 出的数据相减:(COUNT(distinct(t.SAMPLEID)-CONVERT(COUNT(distinct(case t.DETECT_RESULT when '2402' then t.SAMPLEID end), SIGNED) AS NEGATIVEFROM vie

19、w_sims_for_report t10)convert,cast用法mysql将varchar转为intconvert(字段名, SIGNED)字符集转换 : CONVERT(xxx USING gb2312)类型转换和SQL Server一样,就是类型参数有点不同 : CAST(xxx AS 类型) , CONVERT(xxx,类型)可用的类型二进制,同带binary前缀的效果 : BINARY字符型,可带参数 : CHAR()日期 : DATE时间: TIME日期时间型 : DATETIME浮点数 : DECIMAL整数 : SIGNED无符号整数 : UNSIGNED11)如果从my

20、sql数据库中取的时候没有乱码,而在Java的List中得到的是乱码的话,那么可能是SQL语句中的有字段不是 varchar的数据类型,这时需要转换convert(字段名, 类型)转换一下,Orcale则用ToChar函数12)Orcale的大字段用clob,图像用blob,clob字段在Hibernate的映射文件中用String就可以13) mysql,orcale,sqlserver 语句执行顺序开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->

21、;最终结果每个子句执行后都会产生一个中间结果 ,供接下来的子句使用,如果不存在某个子句,就跳过。14) LPAD函数1在oracle的数据库里有个函数 LPAD(String a,int length,String addString).2作用:把addString添加到a的左边,length 是返回值的长度。3例子复制代码代码如下:A : SQL> select lpad('test',8,0) from dual;LPAD('TEST',8,0)-0000testB: select lpad('test',8) from dual;LP

22、AD('TEST',8)-test 注:不写最后一个参数,函数会默认在返回值左边加一个空格。C: SQL> select lpad('test',2,0) from dual;LPAD('TEST',2,0)-teD:SQL> select lpad('test',3) from dual;LPAD('TEST',3)-tes15)Orcale中没有TOP,是通过select * from (select * from A order by id desc) where rownum=1注:不能直接写

23、select * from A where rownum=1 order by id desc 因为语句执行的顺序是先where再order by ,如果这样写就无法按id的排序来取第一个了。不能写rownum=2或rownum>1这样,因为Orcale 默认必须包含第一条。如果非要取第二条的话,可以写成:复制代码代码如下:select * from (select id,rownum as row_num from lws_q_bl_result r where r.sample_id = 'B10226072') where row_num=216)Orcale,My

24、Sql while循环比较Orcale:复制代码代码如下:while num<10loopstr := to_char(num);num := num+1;end loop;也可以:复制代码代码如下:for num in 1.10 -这样的缺陷是无法间隔取值loopstr := to_char(num);end loop;mysql:复制代码代码如下:while num<10dostr := to_char(num);num := num+1;end while;17)orcale 生成唯一序列是 select sys.guid() from dual ,mysql是 select

25、 uuid() from dual18)MySql和Orcale的ID自增MySql由于是在数据库中实现ID自增,所以如果想返回插入一条序列的该条ID,只能用如下方法:复制代码代码如下:public int insertSign(final SpaceSign sign) throws Exception tryKeyHolder keyHolder = new GeneratedKeyHolder();final String sql = "insert into space_sign(userId,userName,nickName,contentText,contentHtml,isPublic,commentCount,userIp,status,insertTime)" +" values(?,?,?,?,?,?,?,?,?,?)"template.update(new PreparedStatementCreator() public PreparedStatement createPrepa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论