Oracle,Sql Server,Mysql 三者的5方面区别:
1.定义:
Oracle 能在所有主流平台上运行(包括Windows)。完全支持所有的工业标准,采用完全开放策略,提供高可用性和高伸缩性的簇的解决方案。 Oracle 在兼容性、可移植性、可联结性、高生产率上、开放性也存在优点。Oracle产品采用标准SQL,与 IBM SQL/DS,DB2,INGRES,IDMS/R等兼容。
SQL Server 具有使用方便、可伸缩性好、与相关软件集成程度高等优点,逐渐成为Windows平台下进行数据库应用开发较为理想的 选择之一。
MySQL是一种关系数据库管理系统
,使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,其体积小、速度快、总体拥有成本低,开放源码。
Oracle和mysql都是甲骨文的产品,SQL Server 是微软的产品
2.面向对象:
Oracle:主流的大型数据库,用于中大型网站开发,商业收费
SQL Server:一般做中小型数据库,用于中小型网站,以及个人使用 ,商业收费
Mysql:一般做中小型数据库,用于中小型网站,以及个人使用,开源免费
3.架构:
Oracle: 数据文件包括:控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件。这是根据文件功能行进行划分,并且所有文件都是二进制编码后的文件,对数据库算法效率有极大的提高。由于Oracle文件管理的统一性,就可以对SQL执行过程中的解析和优化,指定统一的标准:RBO(基于规则的优化器)、CBO(基于成本的优化器)通过优化器的选择,以及无敌的HINT规则,给与了SQL优化极大的自由,对CPU、内存、IO资源进行方方面面的优化。
MySQL:最大的一个特色,就是自由选择存储引擎。每个表都是一个文件,都可以选择合适的存储引擎。常见的引擎有 InnoDB、 MyISAM、 NDBCluster等。但由于这种开放插件式的存储引擎,比如要求数据库与引擎之间的松耦合关系。从而导致文件的一致性大大降低。在SQL执行优化方面,也就有着一些不可避免的瓶颈。在多表关联、子查询优化、统计函数等方面是软肋,而且只支持极简单的HINT。
SQL Server :数据架构基本是纵向划分,分为:Protocol Layer(协议层), Relational Engine(关系引擎), Storage Engine(存储引擎), SQLOS。SQL执行过程就是逐层解析的过程,其中Relational Engine中的优化器,是基于成本的(CBO),其工作过程跟Oracle是非常相似的。在成本之上也是支持很丰富的HINT,包括:连接提示、查询提示、表提示
4.安装:
Oracle:安装难度中等,安装包比较大,占内存较多,图形界面得借助第三方工具。
Sql Server:安装难度较大,出错要删除注册码,还不行就得重装系统,安装包也比较大,占内存中等,有完整的图形界面。
Mysql:安装难度易,安装包小,占内存较小,图形界面得借助第三方工具
5.操作:
1.组函数用法规则
Oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的,或者是group by子句中的列,否则报错
MySQL中组函数在select语句中可以随意使用
注:select name,count(money) from user;这个放在MySQL,Sql Server中没有问题在Oracle中就有问题了。
2.自动增长的数据类型处理
Oracle没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。
Sql Server,MySQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。
3.主键
Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可;
SQL Server一般使用自动增长类型,通过IDENTITY来设置。
MySQL一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,MySQL将自动增长;
4.翻页的SQL语句的处理
Oracle
-- 读取前10条 select * from table1 where rownum<=10; -- 读取后10条 select * from table1 where rownum<=10 order by id desc; --取出第三条到第六条数据(效率不高) select * from (select * from table1 where rownum<=6) minus (select * from table1 where rownum<3); --或者下面这个 select * from (select * from (select rownum rn ,a.* from table1 a) where rn>=3) where rn<=6;