SQL Server 與 Oracle 資料庫兩者一個最大的區別,就是其應用平臺的差異。 現在SQL Server資料庫只能夠部署在微軟的操作系統上。而Oracle資料庫其不但可以支持微軟的操作系統,而且還可以支持開源的操作系統,如Linux等等。 感覺最大區別是在鎖機制上,一個是頁級鎖,一個是行級 ...
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 國內銷售作的火,大多數企業,事業使用
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具有很好的網路支持能力,每個子系統可以連接十幾萬個分散式用戶,可同時激活上千個活動線程,對大型分散式應用系統尤為適用。
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沒法處理複雜的關聯性資料庫功能,例如,子查詢(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);
}
}