數(shù)據(jù)庫(kù)系統(tǒng)提供了數(shù)據(jù)定義語(yǔ)言DDL描述數(shù)據(jù)庫(kù)schema,數(shù)據(jù)操作語(yǔ)言DML來(lái)表示數(shù)據(jù)庫(kù)查詢和更新抛猖。
在實(shí)踐中乔煞,DDL和DML不是兩個(gè)單獨(dú)的語(yǔ)言,而是簡(jiǎn)單地構(gòu)成了一門數(shù)據(jù)庫(kù)語(yǔ)言的部分忍啤,比如SQL語(yǔ)言。
幾乎所有的關(guān)系數(shù)據(jù)庫(kù)都使用SQL語(yǔ)言仙辟。
1.4.1 數(shù)據(jù)定義語(yǔ)言
我們使用DDL來(lái)描述數(shù)據(jù)庫(kù)schema以及數(shù)據(jù)的其他性質(zhì)同波。
我們使用一類特殊的DDL語(yǔ)言,即數(shù)據(jù)存儲(chǔ)和定義語(yǔ)言來(lái)描述存儲(chǔ)結(jié)構(gòu)以及數(shù)據(jù)庫(kù)系統(tǒng)使用的訪問(wèn)方法叠国。這類特殊的DDL語(yǔ)言定義了數(shù)據(jù)庫(kù)schema的實(shí)現(xiàn)細(xì)節(jié)未檩,通常是對(duì)用戶隱藏的。
在數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)值必須滿足某些一致性約束粟焊。比如冤狡,一個(gè)大學(xué)要求一個(gè)系的賬戶余額必須永不為負(fù)數(shù)。
DDL提供了工具來(lái)描述這些約束项棠。
每當(dāng)數(shù)據(jù)庫(kù)更新時(shí)悲雳,數(shù)據(jù)庫(kù)系統(tǒng)必須檢查這些約束。
雖然沾乘,一個(gè)約束可以是任何一個(gè)判斷怜奖,但是測(cè)試任意的判斷是有開(kāi)銷的。
因此翅阵,數(shù)據(jù)庫(kù)實(shí)現(xiàn)的僅是那些具有最小測(cè)試開(kāi)銷的約束歪玲,比如:
- 定義域約束
- 引用約束
- 權(quán)限約束
DDL語(yǔ)句的處理會(huì)有一些輸出迁央。
DDL的輸出被放在數(shù)據(jù)字典里。
1.4.2 SQL數(shù)據(jù)定義語(yǔ)言
SQL提供了豐富的DDL來(lái)支持定義表及數(shù)據(jù)類型和完整性約束滥崩。
create table department (dept_name char(20), building char(15), budget numric(12,2));
執(zhí)行前面的DDL語(yǔ)句岖圈,會(huì)創(chuàng)建一張有3列(dept_name、building钙皮、budget)的department表蜂科,其中每列都關(guān)聯(lián)有具體的數(shù)據(jù)類型。
SQL DDL也支持若干類型的完整性約束短条。比如导匣,主鍵約束,你可以設(shè)置dept_name的屬性值是一個(gè)主鍵茸时,保證沒(méi)有兩個(gè)系有相同的系名稱贡定。再比如,外鍵約束可都,你可以描述在任何一個(gè)instructor記錄里的dept_name屬性值必須出現(xiàn)在department表中的某個(gè)記錄的dept_name屬性里缓待。
1.4.3 數(shù)據(jù)操作語(yǔ)言
數(shù)據(jù)查詢語(yǔ)言DML是一門能使用戶訪問(wèn)和操作根據(jù)數(shù)據(jù)模型組織的數(shù)據(jù)。
數(shù)據(jù)查詢語(yǔ)言支持的訪問(wèn)類型有:
- 檢索存儲(chǔ)在數(shù)據(jù)庫(kù)中的信息
- 向數(shù)據(jù)庫(kù)中插入信息
- 從數(shù)據(jù)庫(kù)中刪除信息
- 修改存儲(chǔ)在數(shù)據(jù)庫(kù)中的信息
有兩種類型的數(shù)據(jù)操作語(yǔ)言:
- 過(guò)程式DML
要求用戶描述需要什么樣的數(shù)據(jù)以及如何獲取那些數(shù)據(jù)渠牲; - 聲明式DML
要求用戶描述需要什么樣的數(shù)據(jù)旋炒,但不用描述如何獲取那些數(shù)據(jù)
跟過(guò)程式DML相比,聲明式DML更容易學(xué)習(xí)和使用签杈。
既然用戶不用描述如何獲取數(shù)據(jù)瘫镇,則數(shù)據(jù)庫(kù)系統(tǒng)必須找出有效訪問(wèn)數(shù)據(jù)的方式。數(shù)據(jù)庫(kù)系統(tǒng)中的查詢處理器組件負(fù)責(zé)將DML查詢轉(zhuǎn)換成物理層的操作序列答姥。
不管是在商業(yè)上汇四,還是實(shí)驗(yàn)室里,在使用的數(shù)據(jù)庫(kù)查詢語(yǔ)言有多個(gè)踢涌。我們研究的是使用最廣泛的SQL查詢語(yǔ)言。
在1.3節(jié)里討論的數(shù)據(jù)抽象分層不僅可以用來(lái)定義或者結(jié)構(gòu)化數(shù)據(jù)序宦,而且可以用來(lái)操作數(shù)據(jù)睁壁。在物理層抽象,我們必須定義支持有效訪問(wèn)數(shù)據(jù)的算法互捌。在更高的抽象層中潘明,我們更強(qiáng)調(diào)易用性,目標(biāo)是支持人們跟數(shù)據(jù)庫(kù)系統(tǒng)有效地交互秕噪。
1.4.4 SQL數(shù)據(jù)查詢語(yǔ)言
SQL查詢語(yǔ)言不是過(guò)程式語(yǔ)言钳降。
一次查詢的輸入是幾張表,有可能是一張腌巾。
一次查詢的返回通常是一張表遂填。
示例1 輸入是一張表的查詢:找出歷史系的所有教員的姓名
select name from instructor where dept_name = 'History';
示例2 輸入是多張表的查詢:找出預(yù)算大于95000美元的系里所有教員的ID
以及系名稱
select instructor.ID, department.dept_name from instructor, department where instructor.dept_name = department.dept_name and department.budget > 95000;
1.4.5 從應(yīng)用程序中進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn)
SQL VS 通用的圖靈機(jī)
諸如SQL等聲明式查詢語(yǔ)言沒(méi)有通用的圖靈機(jī)器功能強(qiáng)大铲觉,即有些計(jì)算使用SQL是無(wú)法實(shí)現(xiàn)的。
SQL也不支持一些操作吓坚,比如接受來(lái)自用戶的輸入撵幽、輸出結(jié)果到顯示器、網(wǎng)絡(luò)通信礁击。
這些SQL無(wú)法實(shí)現(xiàn)的操作必須使用主機(jī)語(yǔ)言并嵌入SQL查詢來(lái)編寫盐杂,比如C++、Java哆窿、Python等链烈,這是跟數(shù)據(jù)庫(kù)交互的程序的實(shí)現(xiàn)方式,比如在大學(xué)中用來(lái)支持學(xué)生注冊(cè)課程挚躯、生成班級(jí)名冊(cè)强衡、計(jì)算GPA、生成支付賬單等的程序秧均。
為了訪問(wèn)數(shù)據(jù)庫(kù)食侮,DML語(yǔ)句需要從主機(jī)語(yǔ)言中發(fā)出,在數(shù)據(jù)庫(kù)中執(zhí)行目胡。最常見(jiàn)的是使用一個(gè)應(yīng)用程序接口API來(lái)實(shí)現(xiàn)锯七,該API能用來(lái)發(fā)送DML和DDL語(yǔ)句到數(shù)據(jù)庫(kù)和檢索結(jié)果。ODBC標(biāo)準(zhǔn)定義了C語(yǔ)言及其他語(yǔ)言跟數(shù)據(jù)庫(kù)交互使用的API誉己。JDBC標(biāo)準(zhǔn)定義了Java語(yǔ)言跟數(shù)據(jù)庫(kù)交互使用的API眉尸。
總結(jié):
DDL和DML跟數(shù)據(jù)模型之間的關(guān)系
SQL VS 編程語(yǔ)言
數(shù)據(jù)定義語(yǔ)言
描述數(shù)據(jù)庫(kù)的schema以及數(shù)據(jù)的額外性質(zhì)(比如完整性約束等)
數(shù)據(jù)操作語(yǔ)言
使得用戶能訪問(wèn)或者操作按照數(shù)據(jù)模型描述組織的數(shù)據(jù)。