--平台性:
Oracle、MysqL与DB2可在所有主流平台上运行;
sql Server只能在Windows下运行;
--安全性:
Oracle的安全认证获得最高认证级别的ISO标准认证,而sql Server并没有获得什么安全认证;
这方面证明了Oracle的安全性是高于sql Server的;
--数据类型、函数、sql语句:
oracle中有复合数据类型,sql server中没有;
总之:
ORACLE 大型,完善,安全;
sqlSERVER 简单,界面友好,WINDOWS平台下的好选择 ,sqlServer后与SYBASE也比较接近的;
MysqL 免费,功能不错,适合个人网站及一些小企业的网站应用;
DB2 超大型,与ORACLE类似 ,数据仓库和数据挖掘相当的不错,特别是集群技术可以使DB2的可扩性能达到极致。
全称为IBM DB2。是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本。
DB2主要应用于大型应用系统,具有较好的可伸缩性,可支持从大型机到单用户环境,应用于所有常见的服务器操作系统平台下。
DB2提供了高层次的数据利用性、完整性、安全性、可恢复性,以及小规模到大规模应用程序的执行能力,具有与平台无关的基本功能和sql命令。
DB2采用了数据分级技术,能够使大型机数据很方便地下载到LAN数据库服务器,使得客户机/服务器用户和基于LAN的应用程序可以访问大型机数据,并使数据库本地化及远程连接透明化。
DB2以拥有一个非常完备的查询优化器而著称,其外部连接改善了查询性能,并支持多任务并行查询。
DB2具有很好的网络支持能力,每个子系统可以连接十几万个分布式用户,可同时激活上千个活动线程,对大型分布式应用系统尤为适用。
sql Server
只能在windows上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。Windows9X系列产品是偏重于桌面应用,NT server只适合中小型企业。
DB2
能在所有主流平台上运行(包括windows)。最适于海量数据。DB2在企业级的应用最为广泛,在全球的500家最大的企业中,几乎85%以上用DB2数据库服务器,而国内到97年约占5%.
多层次网络计算,支持多种工业标准,可以用ODBC,JDBC,OCI等网络客户连接
DB2
跨平台,多层结构,支持ODBC,JDBC等客户
操作简便
sql Server
操作简单,但只有图形界面.
Oracle
较复杂,同时提供GUI和命令行,在windowsNT和unix下操作相同
DB2
操作简单,同时提供GUI和命令行,在windowsNT和unix下操作相同
使用风险
sql server
完全重写的代码,经历了长期的测试,不断延迟,许多功能需要时间来证明。并不十分兼容早期产品。使用需要冒一定风险。
Oracle
长时间的开发经验,完全向下兼容。得到广泛的应用。完全没有风险。
DB2
在巨型企业得到广泛的应用,向下兼容性好。风险小。
Oracle在兼容性、可移植性、可联结性、高生产率上、开放性也存在优点。Oracle产品采用标准sql,并经过美国国家标准技术所(NIST)测试。
2. sqlSERVER
sqlServer是Microsoft推出一套产品,它具有使用方便、可伸缩性好、与相关软件集成程度高等优点,逐渐成为Windows平台下进行数据库应用开发较为理想的选择之一。
3. MysqL
MysqL是开源的,支持事务处理,有视图,有存储过程和触发器,有数据库端的用户自定义函数,不能完全使用标准的sql语法。
从数据库行家听说的第一件事就是MysqL缺乏transactions,rollbacks,和subselects的功能。如果你计划使用MysqL写一个关于银行、会计的应用程序,或者计划维护一些随时需要线性递增的不同类的计数器,你将缺乏transactions功能。在现有的发布版本的MysqL下,请不要有任何的这些想法。
MysqL没法处理复杂的关联性数据库功能,例如,子查询(subqueries),虽然大多数的子查询都可以改写成join
另一个MysqL没有提供支持的功能是事务处理(transaction)以及事务的提交(commit)/撤销(rollback)。
外键(foreignkey)以及参考完整性限制(referentialintegrity)可以让你制定表格中资料间的约束,然后将约束(constraint)加到你所规定的资料里面。
当然更没有支持连锁删除(cascadingdelete)的功能。
sql Server和oracle的区别
首先一点,这三个数据库不是同一个公司的产品; 二、其所对应的使用对象也不一样,oracle是主流的大型数据库,大多数电信项目都是使用的oracle,而sqlserver与MysqL主要是个人以及小型公司使用的的数据库, 但是sqlserver需要收费,MysqL不用; 三、如果按功能上来说,oracle最为强大,oracle支持递归查询,二后两者不支持; 四、三个数据库中,只有sqlserver有完整的图形化操作界面,而oracle与MysqL都要借助于其他的第三方数据库图形操作界面,比如oracle用的大多都是plsql; 一、开放性 1. sql Server 只能在windows上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。 Windows9X系列产品是偏重于桌面应用,NT server只适合中小型企业。而且windows平台的可靠性,安全性和伸缩性是非常有限的。 它不象unix那样久经考验,尤其是在处理大数据库。 2. Oracle 能在所有主流平台上运行(包括 windows)。 完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持。 二、可伸缩性,并行性 1. sql server 并行实施和共存模型并不成熟,很难处理日益增多的用户数和数据卷,伸缩性有限。 2. Oracle 并行服务器通过使一组结点共享同一簇中的工作来扩展windownt的能力,提供高可用性和高伸缩性的簇的解决方案。 如果windowsNT不能满足需要,用户可以把数据库移到UNIX中。Oracle的并行服务器对各种UNIX平台的集群机制都有着相当高的集成度。 三、性能 1. sql Server 多用户时性能不佳 2. Oracle 性能最高, 保持开放平台下的TPC-D和TPC-C的世界记录。 四、客户端支持及应用模式 1. sql Server C/S结构,只支持windows客户,可以用ADO、DAO、OLEDB、ODBC连接。 2. Oracle 多层次网络计算,支持多种工业标准,可以用ODBC、JDBC、OCI等网络客户连接。 五、操作简便 1. sql Server 操作简单,但只有图形界面。 2. Oracle 较复杂,同时提供GUI和命令行,在windowsNT和unix下操作相同。 六、使用风险 1. sql server 完全重写的代码,经历了长期的测试,不断延迟,许多功能需要时间来证明。并不十分兼容。 2. Oracle 长时间的开发经验,完全向下兼容。得到广泛的应用。完全没有风险。 最后价格上 ORACLE贵过sqlSRVER ORACLE, MysqL 和 sql SERVER之区别
MysqL数据库 :
优点: 1.支持5000万条记录的数据仓库
2.适应于所有的平台
3.是开源软件,版本更新较快
4.性能很出色。纯粹就性能而言,MysqL是相当出色的,因为它包含一个缺省桌面格式MyISAM。MyISAM数据库 与磁盘非常地兼容而不占用过多的cpu和内存。MysqL可以运行于Windows 系统而不会发生冲突,在UNIX或类似UNIX系统上运行则更好。你还可以通过使用64位处理器来获取额外的一些性能。因为MysqL在内部里很多时候都使用64位的整数处理。
5.价格便宜
缺点: 缺乏一些存储程序的功能,比如MyISAM引擎联支持交换功能
Mssqlserver数据库:
优点: 1.真正的客户机/服务器体系结构
2.图形化的用户界面,使系统管理和数据库管理更加直观、简单
3.丰富的编程接口工具,为用户进行程序设计提供了更大的选择余地
4.与WinNT完全集成,利用了NT的许多功能,如发送和接受消息,管理登录安全性等,sql Server也可以很好地与Microsoft BackOffice产品集成。
5.有很好的伸缩性,可以跨平台使用。
6.提供数据仓库功能,这个功能只在Oracle和其他 昂贵的DBMS中才有。
Oracle数据库:
优点: 1.Oracle的稳定性要比sql server好。
2.Oracle在导数据工具sqlload.exe功能比sqlserver的Bcp功能强大,Oracle可以按照条件把文本文件数据导入.
3.Oracle的安全机制比sql server好。
4.sql server的易用性和友好性方面要比Oracle好。
5.在处理大数据方面Oracle会更稳定一些。
6.sql Server在数据导出方面功能更强一些。
7.处理速度方面比Oracle快一些,和两者的协议有关.
缺点: 价格昂贵
MysqL与Oracle的语法区别详细对比
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(),'%H-%i-%S');
日期函数
增加一个月:
sql> select to_char(add_months(to_date ('20000101','yyyymmdd'),1),'yyyy-mm-dd') from dual;
结果:2000-02-01
sql> select to_char(add_months(to_date('20000101',5),'yyyy-mm-dd') from dual;
结果:2000-06-01
MysqL> select date_add('2000-01-01',interval 1 month);
结果:2000-02-01
MysqL> select date_add('2000-01-01',interval 5 month);
结果:2000-06-01
截取字符串:
sql> select substr('abcdefg',1,5) from dual;
sql> select substrb('abcdefg',5) from dual;
结果:abcdeMysqL> select substring('abcdefg',2,3);
结果:bcd
MysqL> select mid('abcdefg',3);
结果:bcd
MysqL> select substring('abcdefg',2);
结果:bcdefg
MysqL> select substring('abcdefg' from 2);
结果:bcdefg
2) 在MysqL中from 后的表如果是(select.......)这种,那么后面必须有别名
3) 连接字符串在Oracle中用||,sqlServer中用+,MysqL中用concat('a','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 PROCEDURE IF EXISTS `SIMS`.`transaction_delSampleInfo`$$ CREATE DEFINER=`root`@`%` PROCEDURE `transaction_delSampleInfo`(in sampleInfoId varchar(50)) BEGIN start transaction; update sims_sample_info set del='1' where ID = sampleInfoId; update sims_sample_detect set del='1' where SAMPLE_ID_PARENT = sampleInfoId; 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`$$ CREATE DEFINER=`ids`@`localhost` PROCEDURE `liyukun`(out z int) BEGIN declare 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; //这里和oracle有区别,Oracle的PL/sql的指针有个隐性变
量%notfound,MysqL是通过一个Error handler的声明来进行判断的 OPEN cur1; cur1: LOOP FETCH cur1 INTO v_haoma,v_yingyeting; IF done=1 THEN //如果没有数据了,则离开
LEAVE cur1; ELSE select count(*) into count1 from year2012 where haoma=v_haoma ; if(count1=0) then insert into year2012(haoma,yingyeting) values(v_haoma,v_yingyeting); else
set 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所在的行是每个分组中的第一行数据。
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 NEGATIVE
FROM `view_sims_for_report` t
10)convert,cast用法
MysqL将varchar转为int
convert(字段名,SIGNED)
字符集转换 : CONVERT(xxx USING gb2312)
类型转换和sql Server一样,就是类型参数有点不同 : CAST(xxx AS 类型),CONVERT(xxx,类型)
可用的类型
二进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR()
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED
11)如果从MysqL数据库中取的时候没有乱码,而在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子句->最终结果
每个子句执行后都会产生一个中间结果 ,供接下来的子句使用,如果不存在某个子句,就跳过。
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',0) ---------------- 0000test B: select lpad('test',8) from dual; LPAD('TEST',8) -------------- test 注:不写最后一个参数,函数会默认在返回值左边加一个空格。 C: sql> select lpad('test',2,0) ---------------- te D:sql> select lpad('test',3) from dual; LPAD('TEST',3) -------------- tes
15)Orcale中没有TOP,是通过
select * from (select * from A order by id desc) where rownum=1
注:不能直接写 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=2
16)Orcale,MysqL while循环比较
Orcale:
while num<10 loop str := to_char(num); num := num+1; end loop;
也可以:
for num in 1..10 --这样的缺陷是无法间隔取值 loop str := to_char(num); end loop;
while num<10
do str := to_char(num); num := num+1; end while;
17)orcale 生成唯一序列是 select sys.guid() from dual ,MysqL是 select uuid() from dual
18)MysqL和Orcale的ID自增
MysqL由于是在数据库中实现ID自增,所以如果想返回插入一条序列的该条ID,只能用如下方法:
public int insertSign(final SpaceSign sign) throws Exception { try{ KeyHolder 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 createPreparedStatement(Connection connection) throws sqlException { PreparedStatement ps = connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); ps.setInt(1,sign.getUserId()); ps.setString(2,sign.getUserName()); ps.setString(3,sign.getNickName()); ps.setString(4,sign.getContentText()); ps.setString(5,sign.getContentHtml()); ps.setInt(6,sign.getIsPublic()); ps.setInt(7,sign.getCommnetCount()); ps.setString(8,sign.getUserIp()); ps.setInt(9,sign.getStatus()); ps.setTimestamp(10,new java.sql.Timestamp(sign.getInsertTime().getTime())); return ps; } },keyHolder); Long generatedId = keyHolder.getKey().longValue(); return generatedId.intValue(); } catch (Exception e) { // TODO Auto-generated catch block
e.printStackTrace(); throw new sqlException("失败",e); } }