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具有很好的網絡支持能力,每個子系統可以連接十幾萬個分布式用戶,可同時激活上千個活動線程,對大型分布式應用系統尤為適用。
MySQL是開源的,支持事務處理,有視圖,有存儲過程和觸發器,有數據庫端的用戶自定義函數,不能完全使用標准的SQL語法。
從數據庫行家聽說的第一件事就是MySQL缺乏transactions,rollbacks, 和subselects的功能。如果你計劃使用MySQL寫一個關於銀行、會計的應用程序,或者計劃維護一些隨時需要線性遞增的不同類的計數器,你將缺乏transactions功能。在現有的發布版本的MySQL下,請不要有任何的這些想法。
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快一些,和兩者的協議有關.
缺點: 價格昂貴
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); } }