SQL Server,MySQL,Oracle三者的區別


SQL Server,MySQL,Oracle三者的區別

2016-10-14

轉自:SQL Server,MySQL,Oracle三者的區別

目錄

1 Oracle、Sql Server、MySql簡介
  1.1 Oracle
  1.2 SQL Server
  1.3 MySQL
2 Oracle和MySQL的主要區別
  2.1 客戶端和命令窗口
  2.2 市場占有率及其他
  2.3 Oracle也與MySQL操作上的一些區別
    2.3.1 組函數用法規則
    2.3.2 自動增長的數據類型處理
    2.3.3 主鍵
    2.3.4 單引號的處理
    2.3.5 翻頁的SQL語句的處理
    2.3.6 長字符串的處理
    2.3.7 日期字段的處理
    2.3.8 空字符的處理
    2.3.9 字符串的模糊比較

1 Oracle、Sql Server、MySql簡介


 返回

1.1 Oracle

Oracle 能在所有主流平台上運行(包括Windows)。完全支持所有的工業標准。采用完全開放策略。可以使客戶選擇最適合的解決方案。對開發商全力支持,Oracle並行服務器通過使一組結點共享同一簇中的工作來擴展Windows NT的能力,提供高可用性和高伸縮性的簇的解決方案。如果Windows NT不能滿足需要,用戶可以把數據庫移到UNIX中。Oracle的並行服務器對各種UNIX平台的集群機制都有着相當高的集成度。Oracle獲得最高認證級別的ISO標准認證.Oracle性能最高,保持開放平台下的TPC-D和TPC-C的世界記錄Oracle多層次網絡計 算,支持多種工業標准,可以用ODBC、JDBC、OCI等網絡客戶連接。 Oracle 在兼容性、可移植性、可聯結性、高生產率上、開放性也存在優點。Oracle產品采用標准SQL,並經過美國國家標准技術所(NIST)測試。與 IBM SQL/DS,DB2,INGRES,IDMS/R等兼容。 

Oracle的產品可運行於很寬范圍的硬件與操作系統平台上。可以安裝在70種以上 不同的大、中、小型機上;可在VMS、DOS、UNIX、WINDOWS等多種操作系統下工作。能與多種通訊網絡相連,支持各種協議(TCP/IP、 DECnet、LU6.2等)。提供了多種開發工具,能極大的方便用戶進行進一步的開發。Oracle良好的兼容性、可移植性、可連接性和高生產率是 Oracle RDBMS具有良好的開放性。

Oracle價格是比較昂貴的。據說一套正版的Oracle軟件早在2006年年底的時候在市場上的價格已經達到了6位數。所以如果你的項目不是那種超級大的項目,還是放棄Oracle吧。

1.2 SQL Server

SQL Server 是 Microsoft推出一套產品,它具有使用方便、可伸縮性好、與相關軟件集成程度高等優點,逐漸成為Windows平台下進行數據庫應用開發較為理想的 選擇之一。SQLServer是目前流行的數據庫之一,它已廣泛應用於金融、保險、電力、行政管理等與數據庫有關的行業。而且,由於其易操作性及友好的界 面,贏得了廣大用戶的青睞,尤其是SQLServer與其它數據庫,如Access、FoxPro、Excel等有良好的ODBC接口,可以把上述數據庫 轉成SQLServer的數據庫,因此目前越來越多的讀者正在使用SQLServer。 SQL Server由於是微軟的產品,又有着如此強大的功能,所以他的影響力是幾種數據庫系統中比較大,用戶也是比較多的。它一般是和同是微軟產品的.net平台一起搭配使用。當然其他的各種開發平台,都提供了與它相關的數據庫連接方式。因此,開發軟件用SQL Server做數據庫是一個正確的選擇。

Oracle與Sql server都遵循SQL-92標准:http://owen.sj.ca.us/rkowen/howto/sql92F.html

1.3 MySQL

MySQL不支持事務處理,沒有視圖,沒有存儲過程和觸發器,沒有數據庫端的用戶自定義函數,不能完全使用標准的SQL語法。 從數據庫行家聽說的第一件事就是MySQL缺乏transactions,rollbacks, 和subselects的功能。如果你計划使用MySQL寫一個關於銀行、會計的應用程序,或者計划維護一些隨時需要線性遞增的不同類的計數器,你將缺乏transactions功能。在現有的發布版本的 MySQL下,請不要有任何的這些想法。(請注意,MySQL的測試版3.23.x系列現在已經支持transactions了)。    

在非常必要的情況下,MySQL的局限性可以通過一部分開發者的努力得到克服。在MySQL中你失去的主要功能是subselect語句,而這正是其它的所有數據庫都具有的。換而言之,這個失去的功能是一個痛苦。

MySQL沒法處理復雜的關聯性數據庫功能,例如,子查詢(subqueries),雖然大多數的子查詢都可以改寫成join 另一個MySQL沒有提供支持的功能是事務處理(transaction)以及事務的提交(commit)/撤銷(rollback)。一個事務指的是被當作一個單位來共同執行的一群或一套命令。如果一個事務沒法完成,那么整個事務里面沒有一個指令是真正執行下去的。對於必須處理線上訂單的商業網站來說,MySQL沒有支持這項功能,的確讓人覺得很失望。但是可以用MaxSQL,一個分開的服務器,它能通過外掛的表格來支持事務功能。 

外鍵(foreignkey)以及參考完整性限制(referentialintegrity)可以讓你制定表格中資料間的約束,然后將約束 (constraint)加到你所規定的資料里面。這些MySQL沒有的功能表示一個有賴復雜的資料關系的應用程序並不適合使用MySQL。當我們說 MySQL不支持外鍵時,我們指的就是數據庫的參考完整性限制--MySQL並沒有支持外鍵的規則,當然更沒有支持連鎖刪除(cascadingdelete)的功能。簡短的說,如果你的工作需要使用復雜的資料關聯,那你還是用原來的Access吧。 

你在MySQL中也不會找到存儲進程(storedprocedure)以及觸發器(trigger)。(針對這些功能,在Access提供了相對的事件進程(eventprocedure)。 MySQL+php+apache三者被軟件開發者稱為“php黃金組合”。

2 Oracle和MySQL的主要區別


 返回

2.1 客戶端和命令窗口

  • Oracle:客戶端和命令窗口,都是由用戶決定內容->  conn user_name/password;
  • MySQL:客戶端和命令窗口,都是由數據庫決定內容->  use datebase;

都可以創建多數據庫多用戶,個人傾向於Oracle一個數據庫中多個用戶的形式,MySQL多個數據庫多個用戶形式(最好每個數據庫對應一個用戶)

2.2 市場占有率及其他

  • Oracle是大型數據庫而MySQL是中小型數據庫,Oracle市場占有率達40%,MySQL只有20%左右,同時MySQL是開源的而Oracle價格非常高。

  • Oracle支持大並發,大訪問量,是OLTP(On-Line Transaction Processing聯機事務處理系統)最好的工具。

  • 安裝所用的空間差別也是很大的,MySQL安裝完后才152M而Oracle有3G左右,且使用的時候Oracle占用特別大的內存空間和其他機器性能。

2.3 Oracle也與MySQL操作上的一些區別

2.3.1 組函數用法規則

  • MySQL中組函數在select語句中可以隨意使用,
  • Oracle中如果查詢語句中有組函數,那其他列名必須是組函數處理過的,或者是group by子句中的列,否則報錯

eg: select name,count(money) from user;這個放在MySQL中沒有問題在Oracle中就有問題了。

2.3.2 自動增長的數據類型處理

  • MySQL有自動增長的數據類型,插入記錄時不用操作此字段,會自動獲得數據值。
  • Oracle沒有自動增長的數據類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦於此字段。

2.3.3 主鍵 

  • MySQL一般使用自動增長類型,在創建表時只要指定表的主鍵為auto increment,插入記錄時,不需要再指定該記錄的主鍵值,MySQL將自動增長;
  • Oracle沒有自動增長類型,主鍵一般使用的序列,插入記錄時將序列號的下一個值付給該字段即可;

 

CREATE TABLE Person (  
  Id int PRIMARY KEY,  
  CountryId int,
  Name varchar(20) NOT NULL UNIQUE,  
  Sex int DEFAULT 0
);

 

  SQLServer MySQL Oracle
自增 identity(1,1)  AUTO_INCREMENT   SEQUENCE/觸發器
自增行插入 INSERT INTO Person VALUES(NULL,1,'魏延',1) INSERT INTO Person VALUES(1,'魏延',1) INSERT INTO Person VALUES(SEQID.NEXTVAL,1,'魏延',1)

 

2.3.4 單引號的處理

  • MySQL里可以用雙引號包起字符串,
  • Oracle里只可以用單引號包起字符串。

2.3.5 翻頁的SQL語句的處理

MySql

-- 讀取前10條
select * from table1 where 1=1 limit 10;
-- 讀取第5到第10條
select * from tb_email where toname='caixiangyu' limit 5,10;

SQL Server

-- 讀取前10條
select top (10) * from table1 where 1=1;
-- 讀取后10條
select top (10) * from table1 order by id desc;
-- 在SQL Server里面,如何讀取按照某個排序,第3到6這四個記錄
select top 4 * from table1 where id not in(select top 2 id from table1);

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;

2.3.6 長字符串的處理

長字符串的處理Oracle也有它特殊的地方。INSERT和UPDATE時最大可操作的字符串長度小於等於4000個單字節,如果要插入更長的字符串,請考慮字段用CLOB類型,方法借用Oracle里自帶的DBMS_LOB程序包。插入修改記錄前一定要做進行非空和長度判斷,不能為空的字段值和超出長度字段值都應該提出警告,返回上次操作。

2.3.7 日期字段的處理

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.
  • MySQL中插入當前時間的幾個函數是:NOW()函數以`'YYYY-MM-DD HH:MM:SS'返回當前的日期時間,可以直接存到DATETIME字段中。CURDATE()以'YYYY-MM-DD'的格式返回今天的日期,可以直接存到DATE字段中。CURTIME()以'HH:MM:SS'的格式返回當前的時間,可以直接存到TIME字段中。例:insert into tablename (fieldname) values (now()) 而Oracle中當前時間是sysdate

日期型字段轉換成字符串函數TO_CHAR('2001-08-01','YYYY-MM-DD HH24:MI:SS') 日期字段的數學運算公式有很大的不同。

  • MySQL找到離當前時間7天用DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)
  • Oracle找到離當前時間7天用 DATE_FIELD_NAME >SYSDATE - 7;  

2.3.8 空字符的處理

  • MySQL的非空字段也有空的內容,
  • Oracle里定義了非空字段就不容許有空的內容。按MySQL的NOT NULL來定義Oracle表結構,導數據的時候會產生錯誤。因此導數據時要對空字符進行判斷,如果為NULL或空字符,需要把它改成一個空格的字符串。

2.3.9 字符串的模糊比較

  • MySQL里用字段名like%'字符串%',
  • Oracle里也可以用字段名like%'字符串%'但這種方法不能使用索引,速度不快,用字符串比較函數instr(字段名,'字符串')>0會得到更精確的查找結果。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM