程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 你搞懂 ORACLE、 SQLSERVER、MYSQL與DB2的區別了嗎,sqlserverdb2

你搞懂 ORACLE、 SQLSERVER、MYSQL與DB2的區別了嗎,sqlserverdb2

編輯:Oracle教程

你搞懂 ORACLE、 SQLSERVER、MYSQL與DB2的區別了嗎,sqlserverdb2



ORACLE、 SQLSERVER、MYSQL與DB2的區別
--平台性: 
   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 與 Oracle 數據庫兩者一個最大的區別,就是其應用平台的差異。 現在SQL Server數據庫只能夠部署在微軟的操作系統上。而Oracle數據庫其不但可以支持微軟的操作系統,而且還可以支持開源的操作系統,如Linux等等。 感覺最大區別是在鎖機制上,一個是頁級鎖,一個是行級鎖,效能相差很大 體系機構好像不同,ORACLE是一個數據庫多用戶多個表空間,SQL是多個數據庫。不知對不對。 oracle for windows和 oracle for linux區別還是很大的,很顯然,一個是以線程為主的,一個是以進程為主的。  至於Oracle for windows和SQL server,媽的,價格有區別啊!SQL server便宜,oracle貴,您要回扣我們就買oracle. oracle   國內銷售作的火,大多數企業,事業使用 
sqlserver   中小型數據庫的首選 
mysql   免費,配合php,perl   一般作網站的數據庫 
db2   對大型分布式應用系統尤為適用。   開放性: 
SQL Server         
只能在windows上運行,沒有絲毫的開放性,操作系統的系統的穩定對數據庫是十分重要的。Windows9X系列產品是偏重於桌面應用,NT  server只適合中小型企業。 而且windows平台的可靠性,安全性和伸縮性是非常有限的。它不象unix那樣久經考驗,尤其是在處理大數據量的關鍵業務時.        Oracle          能在所有主流平台上運行(包括windows)。完全支持所有的工業標准。采用完全開放策略。可以使客戶選擇最適合的解決方案。對開發商全力支持。 
DB2 
能在所有主流平台上運行(包括windows)。最適於海量數據。DB2在企業級的應用最為廣泛,在全球的500家最大的企業中,幾乎85%以上用DB2數據庫服務器,而國內到97年約占5%.    可伸縮性,並行性  SQL server:並行實施和共存模型並不成熟。很難處理日益增多的用戶數和數據卷。伸縮性有限。 Oracle平行服務器通過使一組結點共享同一簇中的工作來擴展windownt的能力,提供高可用性和高伸縮性的簇的解決方案。如果windowsNT不能滿足需要,用戶可以把數據庫移到UNIX中。 DB:2DB2具有很好的並行性。DB2把數據庫管理擴充到了並行的、多節點的環境,數據庫分區是數據庫的一部分,包含自己的數據、索引、配置文件、和事務日志。數據庫分區有時被稱為節點或數據庫節點   安全性 SQL server:沒有獲得任何安全證書。         Oracl獲得最高認證級別的ISO標准認證。 DB2:獲得最高認證級別的ISO標准認證。  性能  SQL Server :多用戶時性能不佳     Oracle:性能最高,保持windowsNT下的TPC-D和TPC-C的世界記錄。  DB2:適用於數據倉庫和在線事物處理性能較高。 客戶端支持及應用模式  SQL Server :C/S結構,只支持windows客戶,可以用ADO,DAO,OLEDB,ODBC連接.          Oracle 
多層次網絡計算,支持多種工業標准,可以用ODBC,JDBC,OCI等網絡客戶連接     
DB2 
跨平台,多層結構,支持ODBC,JDBC等客戶 
操作簡便 
SQL Server                       
操作簡單,但只有圖形界面.   
Oracle 
較復雜, 同時提供GUI和命令行,在windowsNT和unix下操作相同               
DB2 
操作簡單,同時提供GUI和命令行,在windowsNT和unix下操作相同       
使用風險 
SQL server                 
完全重寫的代碼,經歷了長期的測試,不斷延遲,許多功能需要時間來證明。並不十分兼容早期產品。使用需要冒一定風險。 
  
Oracle 
長時間的開發經驗,完全向下兼容。得到廣泛的應用。完全沒有風險。 
DB2 
在巨型企業得到廣泛的應用,向下兼容性好。風險小。   1. ORACLE 
oracle能在所有主流平台上運行(包括 windows)。完全支持所有的工業標准采用完全開放策略。 可以使客戶選擇最適合的解決方案。對開發商全力支持.oracle並行服務器通過使一組結點共享同一簇中的工作來擴展windownt的能力,提供高可用性和高伸縮性的簇的解決方案。 如果windowsNT不能滿足需要,用戶可以把數據庫移到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具有良好的開放性。 

2. SQLSERVER 
SQL Server 是Microsoft推出一套產品,它具有使用方便、可伸縮性好、與相關軟件集成程度高等優點,逐漸成為Windows平台下進行數據庫應用開發較為理想的選擇之一。 SQLServer是目前流行的數據庫之一,它已廣泛應用於金融,保險,電力,行政管理等與數據庫有關的行業.而且,由於其易操作性及友好的界面,贏得了廣大用戶的青睐,尤其是SQLServer與其它數據庫,如Access,FoxPro,Excel等有良好的ODBC接口,可以把上述數據庫轉成SQLServer的數據庫,因此目前越來越多的讀者正在使用SQLServer. 
3. MYSQL 

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

    在非常必要的情況下,MySQL的局限性可以通過一部分開發者的努力得到克服。 在MySQL中你失去的主要功能是subselect語句,而這正是其它的所有數據庫都具有的。 換而言之,這個失去的功能是一個痛苦。 
MySQL沒法處理復雜的關聯性數據庫功能,例如,子查詢(subqueries),雖然大多數的子查詢都可以改寫成join 
另一個MySQL沒有提供支持的功能是事務處理(transaction)以及事務的提交(commit)/撤銷(rollback)。 一個事務指的是被當作一個單位來共同執行的一群或一套命令。 如果一個事務沒法完成,那麼整個事務裡面沒有一個指令是真正執行下去的。 對於必須處理線上訂單的商業網站來說,MySQL沒有支持這項功能,的確讓人覺得很失望。 但是可以用MaxSQL,一個分開的服務器,它能通過外掛的表格來支持事務功能。  
外鍵(foreignkey)以及參考完整性限制(referentialintegrity)可以讓你制定表格中資料間的約束,然後將約束(constraint)加到你所規定的資料裡面。 這些MYSQL沒有的功能表示一個有賴復雜的資料關系的應用程序並不適合使用MySQL。 當我們說MySQL不支持外鍵時,我們指的就是數據庫的參考完整性限制--MySQL並沒有支持外鍵的規則,不過有Innodb只要在創建表類型時,TYPE=INNODB就可以進行外鍵的約束。
當然更沒有支持連鎖刪除(cascadingdelete)的功能。 簡短的說,如果你的工作需要使用復雜的資料關聯,那你還是用原來的Access吧。  

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','yyyymmdd'),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',1,5) from dual; 
  結果:abcdemysql> select substring('abcdefg',2,3); 
  結果:bcd 
  mysql> select mid('abcdefg',2,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',8,0) 
---------------- 
0000test 
B: select lpad('test',8) from dual; 
LPAD('TEST',8) 
-------------- 
test 注:不寫最後一個參數,函數會默認在返回值左邊加一個空格。 
C: SQL> select lpad('test',2,0) from dual; 
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; 

mysql: 

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); 
} 
} 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved