SQL Server 和 Oracle 以及 MySQL 的区别

SQL Server 和 Oracle 以及 MySQL 的区别

  • 历史说明区别 》

        Oracle: 中文译作甲骨文,成立于1977年,早期的理论基础,反而来自于一篇IBM的论文《A Relational Model of Data for Large Shared Data Banks》【1】。作者CODD选取了关系代数的五种运算,并基于运算,架构了一种新型的数据存储模型。基于这种模型,Oracle成为了一个非常典型的关系数据库。因此也变的严谨、安全、高速、稳定,并且变的越来越庞大。由于其诞生早、结构严谨、高可用、高性能等特点,使其在传统数据库应用中大杀四方,金融、通信、能源、运输、零售、制造等各个行业的大型公司基本都是用了Oracle,早些年的时候,世界500强几乎100%都是Oracle的用户

        MySQL: MySQL的最初的核心思想,主要是开源、简便易用。其开发可追溯至1985年,而第一个内部发行版本诞生,已经是1995年。到1998年,MySQL已经可以支持10中操作系统了,其中就包括win平台。但依然问题多多,如不支持事务操作、子查询 、外键、存储过程和视图等功能。MySQL的爆发实际是在01、02年,尤其是02年发布的4.0 Beta版,正式选定InnoDB作为默认引擎,对事务处理能力及数据缓存能力有了极大的提高。同年4.1版开始支持子查询,至此MySQL终于蜕变成一个成熟的关系型数据库系统。05年的5.0版本又添加了存储过程、服务端游标、触发器、查询优化以及分布式事务功能,但同年被Oracle抄了后路,InnoDB被Oracle收编。08年,MySQL被Sun收购,09年,Oracle收购了Sun和MySQL。而由于MySQL更多的的追求轻量、易用,以及早期的事物操作及复杂查询优化的缺失,在传统的数据库应用场景中,份额极少,其主要应用场景就是互联网开发。
        SQL Server:一提到SQL Server,大家一般都只想到Microsoft SQL Server,而非Sybase SQL Server。SQL Server最初是由Microsoft, Sybase and Ashton-Tate三家公司拦下的生意,是为IBM(又出现了)公司的OS/2操作系统开发的。随着OS/2项目的失败,大家也分道扬镳。 Microsoft自然转向自己的win操作系统,作为windows NT软件方案的一部分。而Sybase则专注于Linux/Unix方向的数据库开发。
MS SQL Server主要面向中小企业。其最大的优势就是在于集成了MS公司的各类产品及资源,提供了强大的可视化界面、高度集成的管理开发工具,在快速构建商业智能(BI)方面颇有建树。 MS SQL Server是MS公司在软件集成方案中的重要一环,也为WIN系统在企业级应用中的普及做出了很大贡献。

 

  • 应用场景区别 》

        Oracle: Oracle的应用,主要在传统行业的数据化业务中,比如:银行、金融这样的对可用性、健壮性、安全性、实时性要求极高的业务;零售、物流这样对海量数据存储分析要求很高的业务。此外,高新制造业如芯片厂也基本都离不开Oracle;电商也有很多使用者,如京东(正在投奔Oracle)、阿里巴巴(计划去Oracle化)。而且由于Oracle对复杂计算、统计分析的强大支持,在互联网数据分析、数据挖掘方面的应用也越来越多。
    
        MySQL: MySQL基本是生于互联网,长于互联网。其应用实例也大都集中于互联网方向,MySQL的高并发存取能力并不比大型数据库差,同时价格便宜,安装使用简便快捷,深受广大互联网公司的喜爱。并且由于MySQL的开源特性,针对一些对数据库有特别要求的应用,可以通过修改代码来实现定向优化,例如SNS、LBS等互联网业务。

        MS SQL Server: windows生态系统的产品,好处坏处都很分明。好处就是,高度集成化,微软也提供了整套的软件方案,基本上一套win系统装下来就齐活了。因此,不那么缺钱,但很缺IT人才的中小企业,会偏爱 MS SQL Server 。例如,自建ERP系统、商业智能、垂直领域零售商、餐饮、事业单位等等。

 

  • 架构的区别 》

        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,包括:连接提示、查询提示、表提示。

 

  • 优缺点区别 》

    Oracle优点:
        开放性:Oracle 能所有主流平台上运行
        可伸缩性,并行性:Oracle 并行服务器通过使组结点共享同簇工作来扩展windownt能力,提供高用性和高伸缩性簇解决方案,windowsNT能满足需要用户把数据库移UNIX,Oracle并行服务器对各种UNIX平台集群机制都有着相当高集成度;
        安全性:获得最高认证级别的ISO标准认证。
        性能:Oracle 性能高 保持开放平台下TPC-D和TPC-C世界记录;
        客户端支持及应用模式:Oracle 多层次网络计算支持多种工业标准用ODBC、JDBC、OCI等网络客户连接 
        使用风险:Oracle 长时间开发经验完全向下兼容得广泛应用地风险低 
   Oracle缺点:
        对硬件的要求很高;
        价格比较昂贵;
        管理维护麻烦一些;
        操作比较复杂,需要技术含量较高;

   MySql优点:
        体积小、速度快、总体拥有成本低,开源,提供的接口支持多种语言连接操作,支持多种操作系统;;
        MySql的核心程序采用完全的多线程编程。线程是轻量级的进程,它可以灵活地为用户提供服务,而不过多的系统资源。用多线程和C语言实现的MySql能很容易充分利用CPU;
        拥有一个非常快速而且稳定的基于线程的内存分配系统,可以持续使用而不必担心其稳定性; 
        MySQL同时提供高度多样性,能够提供很多不同的使用者界面,包括命令行客户端操作,网页浏览器,以及各式各样的程序语言界面,可以用在个人电脑或者是服务器上;
   MySql优点:
        不支持热备份;
        MySQL最大的缺点是其安全系统,主要是复杂而非标准,另外只有到调用mysqladmin来重读用户权限时才发生改变;
        没有一种存储过程(Stored Procedure)语言,这是对习惯于企业级数据库的程序员的最大限制;
        MySQL的价格随平台和安装方式变化。Linux的MySQL如果由用户自己或系统管理员而不是第三方安装则是免费的,第三方案则必须付许可费。Unix或Linux 自行安装 免费 、Unix或Linux 第三方安装 收费;

   SQL Server优点:
        易用性、适合分布式组织的可伸缩性、用于决策支持的数据仓库功能、与许多其他服务器软件紧密关联的集成性、良好的性价比等;
        SQLServer是一个具备完全Web支持的数据库产品,提供了对可扩展标记语言 (XML)的核心支持以及在Internet上和防火墙外进行查询的能力;
   SQL Server缺点:
        开放性 :SQL Server 只能windows上运行没有丝毫开放性操作系统;
        伸缩性并行性 :SQL server 并行实施和共存模型并成熟难处理日益增多用户数和数据卷伸缩性有限;
        安全性:没有获得任何安全证书。
        性能 :SQL Server 多用户时性能佳 ;
        客户端支持及应用模式: 客户端支持及应用模式。只支持C/S模式,SQL Server C/S结构只支持windows客户用ADO、DAO、OLEDB、ODBC连接;
        使用风险:SQL server 完全重写代码经历了长期测试断延迟许多功能需要时间来证明并十分兼容;

 

  • 总体特点区别 》

        Oracle: 最贵,功能最多,安装最不方便,Oracle环境里的其他相关组件最多,支持平台数据量一般,使用中等方便,开发中等方便,不开源,速度最慢、最安全。

        Mysql: 免费,功能中等,安装最方便,mysql环境里的其他相关组件数量中等,支持平台最多,使用最不方便,开发最不方便,运维最不方便,有开源版本,速度最快,最不安全。

        Microsoft SQL Server: 中等贵,功能最少,安装中等方便,sqlserver环境里的其他相关组件最少,支持平台最少,使用最方便,开发最方便,运维最方便,不开源,速度中等,一般安全。

 

  • 平时用法区别 》

        1、 JDBC驱动 / URL 

SqlServer 	driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver" (05版)     
                     // "com.microsoft.jdbc.sqlserver.SQLServerDriver" (00版)
    		url = "jdbc:sqlserver://localhost:1433;DatabaseName=数据库名"(05版) //     
                    // "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=数据库名" (00版)

Mysql           driver = "com.mysql.jdbc.Driver"
                url = "jdbc:mysql://localhost:3306/数据库名?[后接参数]"

Oracle          driver = "oracle.jdbc.driver.OracleDriver"
                url = "jdbc:oracle:thin:@localhost:1521:数据库名"
		
db2             driver = "com.ibm.db2.jdbc.app.DB2Driver"
                url = "jdbc:db2://localhost:5000/数据库名"

sybase          driver = "com.sybase.jdbc.SybDriver"
                url = "jdbc:sybase:Tds:localhost:5007/数据库名"

 

         2、字符串拼接:

SqlServer+
Mysqlconcat()
Oracle||

          

         3、空值处理函数

SqlServerisnull()
Mysqlifnull()
OracleNvl()

       注意:mysql也有isnull()函数,但意义不一样select a.mobile,isnull(a.mobile) ,ifnull(a. mobile,'空')from ud_connect_new a;

 

        4、获取系统时间

SqlServergetdate()
Mysqlnow()
Oraclesysdate

 

        5、日期格式化(以常用的yyyymmdd格式为例)

SqlServerconvert(varchar(8),getdate(),112)
Mysqldate_format(xcs_received_date,'%Y%m%d')
Oracleto_char(sysdate,'yyyymmdd')

 

        6、当前日期加1个月

SqlServerSELECT DATEADD(month, -1, getdate())
Mysqlselect date_sub(now(),interval 1 month) 
Oracleselect add_months(sysdate,1) from dual;

 

        7、检查是否有表再删除

SqlServer

IF OBJECT_ID('xxx') IS NOT NULL

(需要用到系统表(dbo.sysobjects)来判断)

Mysqldrop table if exists tablename
Oracle

select count(1) from user_tables where table_name = 'xxx'

 

        8、查询部分记录

SqlServertop关键字
Mysqllimit
Oraclerownum

 

        9、Rollup()

SqlServer

group by with rollup(xx)    -- order by xx desc

Mysql

group by with rollup(xx)    -- mysql不能带order by 语句

Oracle

group by rollup(xx)            -- 区别于sqlserver及mysql没有with

 

        10、如何实现取每组的前几名 (场景:查询出每个班级成绩最高的前三名学生,用到的表名及字段如下:Table:tmp_class_score  班级:class_id  成绩:score)

SqlServer

Select From (
        select a.*, row_number() over(

                partition by class_id   order by score

        ) rank from tmp_class_score a

) where rank<=3;

Mysql

select * from (
        select b.*, @rownum:=@rownum+1,

                if(@pdept=b.class_id, @rank:=@rank+1, @rank:=1)                    as rank, @pdept:=b.class_id 
        from

               (select * from tmp_class_score order by class_id,                               score  desc) b ,

               (select @rownum :=0 , @pdept:= null ,@rank:=0) c
) result where rank<=3;

Oracle同SqlServer

 

        11、if ... else ...

SqlServer

IF @count>0 

Set @num=36 
[ ELSE 
set @num=30

MysqlIF search_condition THEN statement_list 
[ELSEIF search_condition THEN statement_list]   
[ELSE statement_list] 
END IF;
Oracle同MySQL    

        注意:对于mysql及oracle来说,then,end if是必须的。

 

        12、rownum为列

SqlServer可直接当作字段使用,自动生成序列
Mysqlselect a.* ,@rownum:=@rownum+1 as rownum From UD_DAILY_REPORT a,(select @rownum:=0) b;
Oracle可直接当作字段使用,自动生成序列

 

        13、主键自增长

SqlServercreate table tb(id int identity(1,1) primary key ) 
Mysqlcreate table tb(id int auto increment primary key )
Oracle

create sequence se_id start with 1 increment by 1  

           -- 使用序列实现自动增长:se_id.nextval    

 

        14、提交方式

SqlServer默认是自动提交
Mysqlmysql默认是自动提交
Oracle

默认不自动提交,需要用户手动提交。

Sql脚本中经常用到commit;   

 

        15、大体上讲,Oracle的数字类型更加简单,大部分情况直接设置number类型就行。而不需要像mysql及sqlserver设置个种数值类型。

        16、Oracle对子查询的支持非常好,而Mysql中的子查询效率就非常低。

        17、MySQL支持insert into tabl1 values (1,1), (1,1), (1,1), (1,1), (1,1), (1,1), (1,1)。而sqlserver及oracle则不能这么插入,可用union all实现。

        18、oracle中一些常用的一些函数非常使用使用简单如decode(xx,1,’是’,2,’否’,3’未知’),同case when xx=1 then ’是’ when xx=2 then ‘否’when xx=3 then’未知’ end。 其他还有to_char()、add_month、last_day()都是常用且容易理解简单的函数。

        19、…………

 

 

总结: 以上区别信息可能存在错漏,请各位大大见谅并指正,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值