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 +
Mysql concat()
Oracle ||

          

         3、空值處理數

SqlServer isnull()
Mysql ifnull()
Oracle Nvl()

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

 

        4、獲取系統時間

SqlServer getdate()
Mysql now()
Oracle sysdate

 

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

SqlServer convert(varchar(8),getdate(),112)
Mysql date_format(xcs_received_date,'%Y%m%d')
Oracle to_char(sysdate,'yyyymmdd')

 

        6、檢查是否有表再刪除

SqlServer SELECT DATEADD(month, -1, getdate())
Mysql select date_sub(now(),interval 1 month) 
Oracle select add_months(sysdate,1) from dual;

 

        7、日期格式化(以常用的yyyymmdd格式爲例)

SqlServer

IF OBJECT_ID('xxx') IS NOT NULL

(需要用到系統表(dbo.sysobjects)來判斷)

Mysql drop table if exists tablename
Oracle

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

 

        8、查詢部分記錄

SqlServer top關鍵字
Mysql limit
Oracle rownum

 

        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

Mysql IF 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 可直接當作字段使用,自動生成序列
Mysql select a.* ,@rownum:=@rownum+1 as rownum From UD_DAILY_REPORT a,(select @rownum:=0) b;
Oracle 可直接當作字段使用,自動生成序列

 

        13、主鍵自增長

SqlServer create table tb(id int identity(1,1) primary key ) 
Mysql create table tb(id int auto increment primary key )
Oracle

create sequence se_id start with 1 increment by 1  

           -- 使用序列實現自動增長:se_id.nextval    

 

        14、提交方式

SqlServer 默認是自動提交
Mysql mysql默認是自動提交
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、…………

 

 

總結: 以上區別信息可能存在錯漏,請各位大大見諒並指正,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章