摘要:當前,數(shù)據(jù)庫教學要緊跟時代發(fā)展需要,要選擇市場使用比較廣泛的二種主流數(shù)據(jù)庫廠商,進行數(shù)據(jù)庫的各內(nèi)容或類型比較、函數(shù)比較、SQL 語法的使用差別,創(chuàng)建使用存儲過程的差別等。通過比較法進行教學講解,不僅使學生在比較學習法中進行體會,同時在相應(yīng)的實驗環(huán)境中進行試驗,這樣就能做到實踐,心中有數(shù)。該文重點介紹數(shù)據(jù)庫教學中的比較用法,通過比較,對數(shù)據(jù)庫的基本概念和SQL操作,有更深的理解和印象,對不同的數(shù)據(jù)庫(oracle和mysql)SQL的基本操作語法以及存儲過程的創(chuàng)建中進行比較,對數(shù)據(jù)庫教學中融入比較概念,面向應(yīng)用和開發(fā)的角度,對數(shù)據(jù)庫教學及應(yīng)用開發(fā)的有較好的引導作用。
關(guān)鍵詞:數(shù)據(jù)庫; 比較法;SQl;Stored Procedure;Oracle;Mysql
中圖分類號:TP393 文獻標識碼:A 文章編號:1009-3044(2017)33-0001-03
當前,高校數(shù)據(jù)庫應(yīng)用課程的教學要緊跟時代發(fā)展需要,可選擇oracle,mysql或SQLSERVER數(shù)據(jù)庫進行教學,要選擇市場使用比較廣泛的兩種數(shù)據(jù)庫廠商進行教學類型的比較,本課程在進行數(shù)據(jù)庫的教學類型比較,函數(shù)比較,SQL 語法的使用差別,創(chuàng)建存儲過程的差別等。通過比較法進行教學的講解,不僅使學生在比較學習法中進行體會,同時在相應(yīng)的實驗環(huán)境中進行試驗,這樣就能做到實踐,心中有數(shù),本文給出一些具體的比較及案例,并介紹主流的ORALCE 的數(shù)據(jù)庫和目前互聯(lián)網(wǎng)應(yīng)用廣泛的Mysql數(shù)據(jù)庫,對加深主流數(shù)據(jù)庫的基本功能及應(yīng)用開發(fā)有較好的參考或幫助作用。
Oracle 數(shù)據(jù)庫是一款面向關(guān)鍵(Critical business)行業(yè)的主流數(shù)據(jù)庫軟件產(chǎn)品。而 Mysql數(shù)據(jù)庫則是目前世界上使用最為廣泛的數(shù)據(jù)庫管理系統(tǒng),目前Mysql數(shù)據(jù)庫已被Oracle數(shù)據(jù)庫收購,二者作為一個通用的數(shù)據(jù)庫系統(tǒng),它們都具有完整的數(shù)據(jù)管理功能的關(guān)系型數(shù)據(jù)庫,支持通用的SQL 語言和語法。
SQL語言不僅簡單易學,而且靈活自如,可在sql * plus 下或mysql終端下使用,也可在c/s(客戶/服務(wù)器) 進行編程語言使用,可嵌入在主流的C/C++,或Dephi,Powerbuilder等窗口設(shè)計較多的場合(scenarios),也可嵌入B/s(瀏覽器/服務(wù)器)模式開發(fā)的PHP,Python,C#,Java等互聯(lián)網(wǎng)應(yīng)用編程等主流語言中。在這些應(yīng)用場合中通過ODBC,JDBC 等方法連接后臺的ORACLE數(shù)據(jù)庫或Mysql數(shù)據(jù)庫,進行數(shù)據(jù)的更新(update)修改,查詢(select),新增(insert)刪除(delete)操作,以及數(shù)據(jù)的定義,如創(chuàng)建表(create table)等數(shù)據(jù)庫對象的創(chuàng)建,從而實現(xiàn)數(shù)據(jù)查詢(Data Query)、數(shù)據(jù)操縱(Data Manipulation)、數(shù)據(jù)定義(Data Definition)和數(shù)據(jù)控制(Data Control)功能。
所以當今高校數(shù)據(jù)庫選用主流的Oracle、MYSQL這些大中型的數(shù)據(jù)庫管理系統(tǒng),同時選擇一門編程語言,如像Dephi、PowerBuilder、C/C++、PHP、Python,C#等常用的開發(fā)語言,利用SQL語言的靈活性來處理面向?qū)ο蟮倪^程,如數(shù)據(jù)記錄的逐行修改或利用SQL語言的面向集合的功能,從數(shù)據(jù)庫獲取查詢,統(tǒng)計功能的工具,作為數(shù)據(jù)庫查詢接口返回查詢結(jié)果進行數(shù)據(jù)的高效處理的語言,通過這樣可進一步加深對SQL的靈活使用和數(shù)據(jù)庫應(yīng)用的開發(fā),具有非常重要的應(yīng)用和實踐作用。
SQL是高級的非過程化編程語言,允許用戶在高層數(shù)據(jù)結(jié)構(gòu)上工作。它不要求用戶指定對數(shù)據(jù)的存儲方法,也不需要用戶了解具體的數(shù)據(jù)存儲方式,所以對具有完全不同底層結(jié)構(gòu)的不同數(shù)據(jù)庫系統(tǒng),可以使用相同的SQL語言作為數(shù)據(jù)輸入與管理的接口。它以記錄集合作為操作對象,所有SQL語句接受集合作為輸入,返回集合作為輸出,這種集合特性允許一條SQL語句的輸出作為另一條SQL語句的輸入,所以SQL語句可以嵌套,這使他具有極大的靈活性和強大的功能,在多數(shù)情況下,在其他語言中需要一大段程序?qū)崿F(xiàn)的功能只需要一個SQL語句就可以達到目的,這也意味著用SQL語言可以寫出非常復雜的語句。
實現(xiàn)SQL在各場景(scenarios)下的應(yīng)用,靈活利用SQL的create、 Insert、 delete、update、alter、drop、grant、Restore, Recover 等功能,熟悉數(shù)據(jù)操縱(Data Manipulation)、數(shù)據(jù)定義(Data Definition)和數(shù)據(jù)控制(Data Control)功能,另外也要考慮到Oracle 數(shù)據(jù)庫和Mysql數(shù)據(jù)庫之間的一些微小差異,包括支持的數(shù)據(jù)類型、函數(shù)使用的比較以及存儲過程創(chuàng)建的比較等內(nèi)容,以及Oracle數(shù)據(jù)庫和Mysql數(shù)據(jù)庫在其他系統(tǒng)性能上的差異比較,使學生通過對比學習加深對Oracle數(shù)據(jù)庫和Mysql數(shù)據(jù)庫主流數(shù)據(jù)庫的認識,通過數(shù)據(jù)庫比較教學法,將有利于學生加深印象和理解。
1 ORACLE 和MYSQL數(shù)據(jù)類型差別
類型就是數(shù)據(jù)格式,就是編碼,ORACLE數(shù)據(jù)庫支持的數(shù)據(jù)類型眾多,包括內(nèi)建(built-in)的數(shù)據(jù)類型主要有:
CHAR ( 字符串類型),NCHAR(包含UNICODE格式數(shù)據(jù)的定長字符串)
NVARCHAR2 (包含UNICODE格式數(shù)據(jù)的變長字符串,最長可存儲4000字節(jié)的信息)
VARCHAR2 (包含UNICODE格式數(shù)據(jù)的變長字符串,最長可存儲4000字節(jié)的信息)
VARCHAR (同VARCHAR2類型)
NUMBER(p,s) (數(shù)字類型數(shù)據(jù))
INTEGER (數(shù)字類型整數(shù)數(shù)據(jù))
DATE (日期類型數(shù)據(jù))endprint
TIMESTAMP(時間戳型數(shù)據(jù))
RAW and LONG RAW Datatypes
LOB (large object)是一種用于存儲大對象的數(shù)據(jù)類型,如醫(yī)學記錄(如X-射線)、視頻、圖像等。
LOB有三種類型:BLOB:、CLOB:、DBCLOB:Double-byte Character Large Object。每個LOB最多可以有4GB。
這樣oracle 數(shù)據(jù)庫就可以處理復雜的數(shù)據(jù)類型,內(nèi)置的LOB數(shù)據(jù)類型包括BLOB、CLOB、NCLOB、BFILE(外部存儲)的大型化和非結(jié)構(gòu)化數(shù)據(jù),如文本、圖像、視屏、空間數(shù)據(jù)存儲。
BLOB、CLOB、NCLOB類型
BFILE (二進制文件外部存儲數(shù)據(jù)類型 ,存儲在數(shù)據(jù)庫外的系統(tǒng)文件,文件屬性只讀,數(shù)據(jù)庫會將該文件當二進制文件處理)
BLOB (Binary Large Object,即二進制大對象數(shù)據(jù),一般是圖像、聲音、視頻等文件類型)
CLOB (Character Large Object,即字符大對象數(shù)據(jù),如一段長的文本可定義該類型,它存儲單字節(jié)和多字節(jié)字符數(shù)據(jù)。支持固定寬度和可變寬度的字符集)
NCLOB(存儲UNICODE類型的CLOB數(shù)據(jù),支持固定寬度和可變寬度的字符集)
UROWID 數(shù)據(jù)類型,在數(shù)據(jù)庫中的每一行都有一個地址。然而,一些表行的地址不是物理或永久的,或者不是ORACLE數(shù)據(jù)庫生成的。
例如,外部表的ROWID(如通過網(wǎng)關(guān)訪問DB2表)不是??標準的ORACLE的Rowid。
LOB 代表大對象數(shù)據(jù),包括 BLOB 和 CLOB 兩種類型,前者用于存儲大塊的二進制數(shù)據(jù),如圖片數(shù)據(jù),視頻數(shù)據(jù)等,而后者用于存儲長文本數(shù)據(jù),如論壇的帖子內(nèi)容,產(chǎn)品的詳細描述等。值得注意的是:在不同的數(shù)據(jù)庫中,大對象對應(yīng)的字段類型是不盡相同的,如 DB2 對應(yīng) BLOB/CLOB,MySQL 對應(yīng) BLOB/LONGTEXT,SqlServer 對應(yīng) IMAGE/TEXT。需要指出的是,有些數(shù)據(jù)庫的大對象類型可以像簡單類型一樣訪問,如 mysql 的 LONGTEXT 的操作方式和 VARCHAR 類型一樣。在一般情況下, LOB 類型數(shù)據(jù)的訪問方式不同于其他簡單類型的數(shù)據(jù),我們經(jīng)常會以流的方式操作 LOB 類型的數(shù)據(jù)。此外,LOB 類型數(shù)據(jù)的訪問不是線程安全的,需要為其單獨分配相應(yīng)的數(shù)據(jù)庫資源,并在操作完成后釋放資源。最后,Oracle 9i 非常有個性地采用非 JDBC 標準的 API 操作 LOB 數(shù)據(jù)。
而MYSQL 支持所有標準SQL中的數(shù)值類型,如CHAR,VARCHAR,BINARY,BLOB,TEXT,ENUM,DATE, TIME 等類型。
2 分組函數(shù)使用的一些差別
分組子語句(group by) 在統(tǒng)計分析或報表生成過程中,作用非常重要。但oracle和Mysql數(shù)據(jù)庫中分組使用有些注意事項,如:
Mysql中組函數(shù)在select語句中可以隨意使用,但在oracle中如果查詢語句中有組函數(shù),那其他列名必須是組函數(shù)指定過的,或者是group by子句中的列,否則報錯
例如:
select name,count(money) from user;這個放在mysql中沒有問題,而在oracle中就有問題了。
應(yīng)為:selectname,count(money) from user group by name;
3 Oracle 和MYSQL 中的單引號‘和雙引號“”的區(qū)別
MYSQL里可以用雙引號包起字符串,ORACLE里只可以用單引號包起字符串,所以在ORACLE數(shù)據(jù)庫在插入和修改字符串前必須做單引號的替換:把所有出現(xiàn)的一個單引號替換成兩個單引號。
4 自動增長的數(shù)據(jù)類型處理
MYSQL 中包含了 auto_increment 類型的列,而ORACLE 中沒有auto_increment這種類型的列, 相應(yīng)的使用序列號來自動遞增序列號,MYSQL有自動增長的數(shù)據(jù)類型,插入記錄時不用操作此字段,會自動獲得數(shù)據(jù)值。ORACLE沒有自動增長的數(shù)據(jù)類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦于此字段。
CREATE SEQUENCE序列號的名稱(最好是表名+序列號標記)INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按字段的長度來定,如果定義的自動增長的序列號NUMBER(6),最大值為999999。
INSERT語句插入這個字段值為:序列號的名稱.NEXTVAL。
5 行rownum限制輸出表中內(nèi)容
MYSQL處理表中行輸出的SQL語句比較簡單,用LIMIT開始位置,記錄個數(shù);ORACLE處理翻頁的SQL語句就比較繁瑣了。每個結(jié)果集只有一個ROWNUM字段標明它的位置,并且只能用ROWNUM。
6 日期字段的處理
日期變量類型是所有應(yīng)用型數(shù)據(jù)記錄中通??紤]定義的類型,如數(shù)據(jù)的修改(刪除或更新)時間,銀行 存款貸款還款都涉及日期,超市流水的生成等也涉及日期字段的定義和處理。MYSQL日期字段分DATE和TIME兩種,ORACLE日期字段只有DATE,包含年月日時分秒信息,用當前數(shù)據(jù)庫的系統(tǒng)時間為SYSDATE,精確到秒,或者用字符串轉(zhuǎn)換成日期型函數(shù)TO_DATE(‘2017-08-01,YYYY-MM-DD),年-月-日24小時:分鐘:秒的格式為YYYY-MM-DD HH24:MI:SS, TO_DATE()還有很多種日期格式。日期型字段轉(zhuǎn)換成字符串函數(shù)為TO_CHAR,如TO_CHAR (‘2001-08-01,YYYY-MM-DD HH24:MI:SS)endprint
日期字段的數(shù)學運算公式有很大的不同。MYSQL找到離當前時間7天可用DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)表達式。
ORACLE找到離當前時間7天可用 DATE_FIELD_NAME >SYSDATE — 7表達式完成;
MYSQL中插入當前時間的幾個函數(shù)是:NOW()函數(shù)以`'YYYY-MM-DD HH:MM:SS'返回當前的日期時間,可以直接存到DATETIME字段中。
另外CURDATE()以YYYY-MM-DD的格式返回今天的日期,可以直接存到DATE字段中。CURTIME()以HH:MM:SS的格式返回當前的時間,可以直接存到TIME字段中。例:insert into sale (id,name,price,id_time) values (‘2017091801,U disk,100,now())
而oracle中當前時間是sysdate。[1]
7 空字符的處理
MYSQL的非空字段也有空的內(nèi)容,ORACLE里定義了非空字段就不容許有空的內(nèi)容。按MYSQL的NOT NULL來定義ORACLE表結(jié)構(gòu),導數(shù)據(jù)的時候會產(chǎn)生錯誤。因此導數(shù)據(jù)時要對空字符進行判斷,如果為NULL或空字符,需要把它改成一個空格的字符串。
8 字符串的模糊比較
MYSQL里用字段名like%‘字符串%,ORACLE里也可以用字段名like%‘字符串%但這種方法不能使用索引,速度不快,用字符串比較函數(shù)instr(字段名,‘字符串)>0會得到更精確的查找結(jié)果。
9 存儲過程的創(chuàng)建和執(zhí)行的比較
(1) 在創(chuàng)建存儲過程時如果存在同名的存儲過程,會刪除老的存儲過程.
oracle使用create or replace.
mysql使用先刪除老的存儲過程,然后再創(chuàng)建新的存儲過程.
(2) oracle 存儲過程可以定義在package中,也可以定義在Procedures中. 如果定義在包中,一個包中可以包含多個存儲過程和方法.如果定義在Procedures中,存儲過程中不可以定義多個存儲過程.
Mysql 存儲過程中不可以定義多個存儲過程.
(3) oracle中字符串類型可以使用varchar2.
Mysql 需要使用varchar
(4) Oracle中參數(shù)varchar長度不是必須的, Mysql中參數(shù)varchar長度是必須的, 比如varchar(100)
(5) 在創(chuàng)建函數(shù)時如果存在同名的函數(shù),會刪除老的函數(shù).
oracle使用create or replace.
mysql使用先刪除老的函數(shù),然后再創(chuàng)建新的函數(shù).
(6) oracle 函數(shù)可以定義在package中,也可以定義在Functions中. 如果定義在包中,一個包中可以包含多個存儲過程和函數(shù).如果定義在Functions中,每個函數(shù)只能定義一個函數(shù).Mysql Functions不可以定義多個函數(shù).
(7) oracle返回值用return.
Mysql返回值用returns.
(8) 存儲過程異常處理不一樣
Oracle異常處理
EXCEPTION
WHEN OTHERS THEN
ROLLBACK ;
error_msg := c_sp_name||'('|| li_debug_pos ||'):'||
TO_CHAR(SQLCODE)||': '||SUBSTR(SQLERRM,1,100);
Msql異常處理
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK ;
seterror_msg=concat(c_sp_name,'(', li_debug_pos ,'):',
TO_CHAR(SQLCODE),': ',SUBSTR(SQLERRM,1,100));
END;
10 結(jié)論
通過比較二種最流行的數(shù)據(jù)庫ORACLE及MYSQL的差異方面,來加深二者之間的差別,加深學生了解這兩種數(shù)據(jù)庫的異同,對于今后使用其中之一或進行二者之間的轉(zhuǎn)換也有指導幫助作用,對于數(shù)據(jù)庫的教學能和市場數(shù)據(jù)庫應(yīng)用開發(fā)密切聯(lián)系起一定的作用。
參考文獻:
[1] http://blog.csdn.net/io_field/article/details/52669811.
[2] 俞海 .數(shù)據(jù)庫基本原理及應(yīng)用開發(fā)教程[J].南京:南京大學出版社, 2017.endprint