DDL:數(shù)據(jù)定義 DML:數(shù)據(jù)操縱 DCL:數(shù)據(jù)控制語(yǔ)言集成在一起(權(quán)限控制,完整性控制) 關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言--SQL(Structured Query Language),ANSI解釋為Standard Query Language。 SQL是一種高度的非過(guò)程化語(yǔ)言(僅有What,不問(wèn)How)。 交互式和嵌入式兩種使用方式,統(tǒng)一的語(yǔ)法結(jié)構(gòu) 語(yǔ)言簡(jiǎn)潔,易學(xué)易用 完成核心功能只有9個(gè)動(dòng)詞: 數(shù)據(jù)查詢: SELECT 數(shù)據(jù)定義: CREATE,DROP,ALTER 數(shù)據(jù)操縱: INSERT,DELETE,UPDATE 數(shù)據(jù)控制: GRANT,REVOKE SQL數(shù)據(jù)定義功能 定義和修改基本表(定義模式): CREATE TABLE DROP TABLE ALTER TABLE 定義視圖(定義外模式): CREATE VIEW DROP VIEW 定義索引(定義內(nèi)模式): CREATE INDEX DROP INDEX 說(shuō)明:視圖是從基本表導(dǎo)出的虛表,索引依賴于基本表,SQL沒(méi)有修改視圖和索引的操作,可通過(guò)先刪除,再創(chuàng)建達(dá)此目的。 基本表的定義和修改 1,定義:基本格式為 CREATE TABLE 表名(列名1 類(lèi)型 [列級(jí)完整性約束] [,列名2 類(lèi)型 [列級(jí)完整性約束]…); CREATE TABLE S( S# CHAR(3) NOT NULL UNIQUE, SN CHAR(15), SD CHAR(15),) 其中,NOT NULL---不允許取空值,UNIQUE---取值唯一 SQL支持空值的概念。允許空值的列未輸入數(shù)據(jù)時(shí)系統(tǒng)自動(dòng)置為空值。 SQL支持的數(shù)據(jù)類(lèi)型隨系統(tǒng)不同而有所差異。 2,修改基本表 增加列: ALTER TABLE 表名 ADD 列名 類(lèi)型 [完整性約束]; (不支持NOT NULL選擇) 例如:ALTER TABLE S ADD SD INT; 修改列 ALTER TABLE 表名 MODIFY 列名 類(lèi)型; 例如:ALTER TABLE S MODIFY SD CHAR(20); 刪除完整性約束 ALTER TABLE 表名 DROP 完整性約束名; 注意:不能刪除列,新增列的值一律為空值, 可增加列寬,但一般不能減小列寬,修改可能會(huì)破壞已有數(shù)據(jù)。 在定義基本表時(shí)要考慮充分。 3,刪除 DROP TABLE 表名; 注意:刪除基本表時(shí),表中的數(shù)據(jù)、建立在表上的索引和視圖將一并被刪除,因此應(yīng)格外小心。 4,索引的建立和刪除 由DBA或表的屬主進(jìn)行,存取數(shù)據(jù)時(shí)由系統(tǒng)自動(dòng)選取合適的索引作為存取路徑,用戶不必也不能選擇索引。 5,創(chuàng)建索引 CREATE [ UNIQUE ] [CLUSTER] INDEX 索引名 ON 表名(列名 ASC/DESC,列名 ASC/DESC)…; 其中ASC為升序,DESC為降序。 如 CREATE UNIQUE INDEX XSNO ON S(S#); CREATE UNIQUE INDEX SCNO ON SC(SNO ASC,CNO DESC); 6,刪除索引 DROP INDEX 索引名; SQL數(shù)據(jù)操縱----查詢 查詢是數(shù)據(jù)庫(kù)的核心操作。SQL僅提供了唯一的語(yǔ)句SELECT,其使用方式靈活,功能非常豐富。 SELECT [ALL | DISTINCT] * | 目標(biāo)列 FROM 基本表(或視圖) [ WHERE 條件表達(dá)式 ] [ GROUP BY 列名1 [ HAVING 內(nèi)部函數(shù)表達(dá)式 ] ] [ ORDER BY 列名2 ASC/DESC ]; 其中,上面的語(yǔ)句中,”*“代表全部字段,“?”相當(dāng)于投影 From 后面的語(yǔ)句,表示被查詢的表。 Where 表示選擇/連接。 Having 表示:滿足條件的組才輸出。 ASC/DESC:表示對(duì)查詢結(jié)果的排序。 1,簡(jiǎn)單查詢 例如1:求選修了課程的學(xué)生學(xué)號(hào) SELECT DISTINCT S# FROM SC; //從結(jié)果中去掉重復(fù)的元組 例2:SELECT的后面可以是表達(dá)式。 如求計(jì)算機(jī)系學(xué)生的學(xué)號(hào)和出生年份: SELECT S#,'Birthday:’,2000-SA FROM S WHERE SD='CS’; 例3:連續(xù)范圍查詢,使用BETWEEN (NOT BETWEEN) SELECT S#,SA FROM S WHERE SA BETWEEN 20 AND 22; //即求20到22歲之間的學(xué)生學(xué)號(hào)和年齡 例4:離散范圍查詢,使用 IN (NOT IN) SELECT * //星號(hào)表示無(wú)投影 FROM S WHERE SD IN ('MA’,'CS’); //相當(dāng)于若干'OR’的縮寫(xiě) // SD='MA’ OR SD='CS’ 例5:模糊查詢,使用 LIKE (NOT LIKE) SELECT * FROM S WHERE SN LIKE '%清%’; //查姓名中有'清’字的學(xué)生 DB2中,下劃線 '_’表示匹配任何單個(gè)字符 百分號(hào)'%’表示匹配任何字符串 其它語(yǔ)言中, 常用 '?’ 常用 '*’ 例6: 涉及空值的查詢 , IS NULL (IS NOT NULL) SELECT S#, C# FROM SC WHERE G IS NULL ; 2,連接查詢:涉及至少兩個(gè)表的查詢 SQL中沒(méi)有專門(mén)的JOIN命令,而是靠SELECT語(yǔ)句中的 WHERE子句來(lái)達(dá)到連接運(yùn)算的目的,因此更加靈活、簡(jiǎn)便。 用來(lái)連接兩個(gè)表的條件稱為連接條件或連接謂詞。 注意:在多個(gè)表中出現(xiàn)的列名,必須用表名限定,僅在一個(gè)表中出現(xiàn)的屬性,可省略表名。 SELECT S.S#, SN, G //此處,必須要用表名限定,因?yàn)榇肆忻诙鄠€(gè)表中出現(xiàn)了。 FROM S, SC WHERE S.S#=SC.S# AND SC.C#='C1’; 3,使用外連接查詢時(shí) 求每個(gè)學(xué)生選修的課程及成績(jī)。 SELECT S.S#, SN, C#, G FROM S, SC WHERE S.S# = SC.S#(*) ; //有些數(shù)據(jù)庫(kù)系統(tǒng)用+ , 有些將*放在=前后,*=、=* 。 4,嵌套查詢(子查詢)--SELECT-FROM-WHERE 查詢塊嵌入另一個(gè)查詢塊中 (1)嵌套查詢由內(nèi)向外處理 (2)SQL允許多層嵌套 (3)嵌套查詢中最常用的 謂詞是IN (4)嵌套查詢層次分明、 容易理解 5,UNION查詢 (1)用UNION查詢時(shí),每個(gè)子查詢選擇的目標(biāo)列必須相同, 但所基于的表可以不同 (2)UNION查詢實(shí)際上是將幾個(gè)子查詢的結(jié)果合并在一起 (3)UNION查詢時(shí)自動(dòng)去掉重復(fù)的行 (4)可以通過(guò)將各子查詢的限制條件合并而將UNION查詢 變成一個(gè)單一查詢 庫(kù)函數(shù)(聚集函數(shù)) COUNT 統(tǒng)計(jì)一列中的(NOT NULL)值的個(gè)數(shù) COUNT(*) 計(jì)算記錄個(gè)數(shù) SUM 對(duì)一列求和 AVG 對(duì)一列求平均值 MAX 對(duì)一列求最大值 MIN 對(duì)一列求最小值 將表按列的值分組,列的值相同的分在一組,產(chǎn)生一個(gè)結(jié)果行。GROUP BY常 和庫(kù)函數(shù)一起使用,用于分組統(tǒng)計(jì)。 WHERE是選擇記錄的條件; HAVING是選擇分組的條件且必須和GROUP BY一起使用。 庫(kù)函數(shù)只能作用于HAVING和目標(biāo)列,而不能用于WHERE。 SQL數(shù)據(jù)操縱----數(shù)據(jù)更新 1,插入數(shù)據(jù) 插入單個(gè)元組 INSERT INTO 表名 [(字段名 [,字段名 ] … ] VALUES (常量 [,常量] … ] ; 例1:插入一條選課記錄(S1,C5)。 INSERT INTO SC(S#,C#) VALUES('S1’,'C1’); 說(shuō)明: ★ 當(dāng)在INTO后面僅指定部分屬性列時(shí),插入記錄后其它列的值為空值; ★ 如果INTO后面沒(méi)有指定屬性列,則必須按表列的定義次序?yàn)槊總€(gè)列指定一個(gè)值; ★ 具有NOT NULL屬性的列,必須指定值。 2,修改數(shù)據(jù) UPDATE 表名 SET 列名 = 表達(dá)式[,列名 = 表達(dá)式]… [WHERE 條件]; 說(shuō)明: ★ 當(dāng)省略WHERE子句時(shí),修改表中所有記錄,否則僅修改滿足條件的記錄; ★ 條件也可以使用子查詢。 3,刪除數(shù)據(jù): DELETE FROM 表名 [ WHERE 條件 ]; 只能刪除表記錄,不刪除表結(jié)構(gòu)。無(wú)條件時(shí),刪除全部記錄,僅剩一個(gè)空表;有條件時(shí)刪除滿足條件的記錄。 為物理刪除命令。 刪除表結(jié)構(gòu)用DROP TABLE。 4,更新操作與數(shù)據(jù)庫(kù)的一致性 增、刪、改操作只能對(duì)一個(gè)表操作,可能會(huì)造成數(shù)據(jù)的不一致性。 例如: 刪除“物理”課程的全部信息,需使用兩個(gè)操作實(shí)現(xiàn),刪除C表的課程記錄和刪除SC表的選課記錄。若在完成第一個(gè)操作后發(fā)生意外,致使第二個(gè)操作未能實(shí)現(xiàn),則造成數(shù)據(jù)庫(kù)的不一致。因?yàn)镾C中的物理課程號(hào)還存在,而被參照的C表中已沒(méi)有該課程號(hào)的課程了。所以應(yīng)保證這兩個(gè)操作要么全做,要么全不做,為此,在數(shù)據(jù)庫(kù)系統(tǒng)中引入了事物的概念。 為保證數(shù)據(jù)的一致性,大型數(shù)據(jù)庫(kù)系統(tǒng)一般都提供若干策略: 刪除主表(被參照表)中的數(shù)據(jù)時(shí) (1)自動(dòng)刪除參照表中的相應(yīng)數(shù)據(jù); (2)檢查參照表中是否有數(shù)據(jù)參照,若有則拒絕刪除。 向參照表中插入數(shù)據(jù)時(shí) 檢查所有被參照表中是否有被參照的信息,若沒(méi)有則拒絕插入。 修改主表中的被參照字段 檢查參照表中是否有數(shù)據(jù)參照,若有則拒絕修改。 SQL數(shù)據(jù)控制功能 數(shù)據(jù)控制功能包括事物管理功能和數(shù)據(jù)保護(hù)功能。即 數(shù)據(jù)的安全性、完整性、事務(wù)控制、并發(fā)控制和恢復(fù)功能。 一、授權(quán) 1、機(jī)制:大的DBMS中有一個(gè)超級(jí)用戶DBA,其他用戶能否存在、對(duì)某類(lèi)數(shù)據(jù)具有何種操作權(quán)力是由DBA決定的,系統(tǒng)提供授權(quán)機(jī)制。執(zhí)行過(guò)程為: (1)用數(shù)據(jù)控制語(yǔ)言把授權(quán)決定告知系統(tǒng); (2)系統(tǒng)把授權(quán)的結(jié)果存入數(shù)據(jù)字典; (3)當(dāng)用戶提出 操作請(qǐng)求時(shí),系統(tǒng)根據(jù)授權(quán)情況進(jìn)行檢查, 以決定是否執(zhí)行。 2、權(quán)力的授予與收回 授予: GRANT 權(quán)力 [,權(quán)力 ] … [ ON 對(duì)象類(lèi)型 對(duì)象名 ] //若干權(quán)力和操作對(duì)象 TO 用戶名 [,用戶名] … //獲得權(quán)力的對(duì)象 [ WITH GRANT OPTION ]; //有此項(xiàng),被授權(quán)用戶可再授權(quán)給其他用戶 收回: REVOKE 權(quán)力 [,權(quán)力 ] … [ ON 對(duì)象類(lèi)型 對(duì)象名 ] FROM 用戶名 [,用戶名] …; 數(shù)據(jù)庫(kù)的屬主、表的屬主、數(shù)據(jù)庫(kù)對(duì)象的屬主在他創(chuàng)建的對(duì)象上具有一切可能的權(quán)力,其他用戶得不到主人的授權(quán)就不能在該對(duì)象上操作; · SQL的授權(quán)機(jī)制十分靈活,各種系統(tǒng)又作了適當(dāng)?shù)难a(bǔ)充, 使用十分方便; ? SQL的安全性控制除了上述授權(quán)機(jī)制外,還可設(shè)置口令進(jìn)一步保密。 嵌入式SQL 一、SQL的使用方式 1、交互式:在終端上每輸入一條SQL語(yǔ)句,系統(tǒng)立即執(zhí)行,然后等待用戶輸入下一條語(yǔ)句。 2、自編程式:在實(shí)際的DMBS中,都對(duì)SQL進(jìn)行了擴(kuò)充,增加了條件、循環(huán)等控制語(yǔ)句,并提供編程機(jī)制。如SYBASE中,用戶可以編寫(xiě)存儲(chǔ)過(guò)程并調(diào)用它。 3、嵌入式(嵌入到某種主語(yǔ)言中使用): 宿主語(yǔ)言負(fù)責(zé):運(yùn)算、處理、流程控制等 SQL負(fù)責(zé):數(shù)據(jù)庫(kù)操作 二、嵌入式SQL使用時(shí)的問(wèn)題 必須解決和主語(yǔ)言相互配合、連接等問(wèn)題 1、標(biāo)識(shí)SQL語(yǔ)句 用前綴,如EXEC SQL或$等,標(biāo)記SQL語(yǔ)句的開(kāi)始; 用END-EXEC或分號(hào)';’等標(biāo)記SQL語(yǔ)句的結(jié)束。 SQL語(yǔ)句標(biāo)識(shí)是通知主語(yǔ)言的預(yù)編譯程序?qū)QL語(yǔ)句轉(zhuǎn)化為等價(jià)的主語(yǔ)言語(yǔ)句,然后再由編譯程序形成目標(biāo)代碼 2、SQL語(yǔ)句與主語(yǔ)言之間的通信 (1)通過(guò)SQL通信區(qū)(SQLCA)將SQL語(yǔ)句的執(zhí)行狀態(tài)傳遞給主語(yǔ)言。 SQLCA是一個(gè)數(shù)據(jù)結(jié)構(gòu),其中有一個(gè)重要變量SQLCODE,存放SQL語(yǔ)句是否執(zhí)行成功的信息,每執(zhí)行一個(gè)SQL語(yǔ)句,主語(yǔ)言都應(yīng)測(cè)試該變量。 (2)SQL語(yǔ)句中可使用主語(yǔ)言的程序變量(叫主變量),但要加前綴標(biāo)志,一般用冒號(hào)':’。 (3)SQL語(yǔ)句和主語(yǔ)言的數(shù)據(jù)交換一般通過(guò)字段變量和主變量進(jìn)行,但兩者數(shù)據(jù)類(lèi)型要匹配. (4)一個(gè)SQL語(yǔ)句可以產(chǎn)生一組記錄,而主語(yǔ)言一次只能處理一個(gè)記錄,為此需協(xié)調(diào)兩種方式: 辦法:用游標(biāo)(Cursor),有的叫位置指針 (5)通常用CONNECT語(yǔ)句來(lái)連接(申請(qǐng)使用)數(shù)據(jù)庫(kù) 關(guān)系系統(tǒng)及其查詢優(yōu)化 一、關(guān)系系統(tǒng)的定義 1、關(guān)系模型: 數(shù)據(jù)結(jié)構(gòu): 關(guān)系(二維表) 數(shù)據(jù)操縱: 關(guān)系代數(shù)(或關(guān)系演算) 完整性約束:實(shí)體完整性、參照完整性、用戶定義的完整性 2、關(guān)系系統(tǒng)的定義 * 關(guān)系系統(tǒng)是關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)的簡(jiǎn)稱 * 從概念上講,支持關(guān)系模型的系統(tǒng)稱為關(guān)系系統(tǒng)。 * 按最小要求定義關(guān)系系統(tǒng): 一個(gè)系統(tǒng)稱為關(guān)系系統(tǒng),當(dāng)且僅當(dāng) (1)支持關(guān)系數(shù)據(jù)結(jié)構(gòu); (2)支持選擇、投影和連接運(yùn)算。 對(duì)運(yùn)算不要求定義任何物理存取路徑。 關(guān)系上完備的系統(tǒng): 支持關(guān)系結(jié)構(gòu), 支持所有的關(guān)系代數(shù)操作 如:SYBASE、ORACLE、DB2 全關(guān)系系統(tǒng):支持關(guān)系模型的所有特征 如:SYBASE、ORACLE、DB2等系統(tǒng)已接近這個(gè)目標(biāo) 三、全關(guān)系系統(tǒng)的十二條基本準(zhǔn)則 基礎(chǔ)(準(zhǔn)則 0):關(guān)系型DBMS必須能完全通過(guò)它的關(guān)系能力來(lái)管理數(shù)據(jù)庫(kù) //在關(guān)系一級(jí)上支持?jǐn)?shù)據(jù)的插入、刪除、修改,沒(méi)有任何操作必須通過(guò)非關(guān)系的能力才能實(shí)現(xiàn)。 準(zhǔn)則1:信息準(zhǔn)則。邏輯上可用一種方法(表中的值)來(lái)表示所有信息。 //用戶數(shù)據(jù)、元數(shù)據(jù)、索引、應(yīng)用元數(shù)據(jù)統(tǒng)一用表格來(lái)表示 好處:u 提高用戶生產(chǎn)率 u 便于DBA維護(hù)數(shù)據(jù)庫(kù) u 便于與其它軟件接口 關(guān)系系統(tǒng)的查詢優(yōu)化 關(guān)系數(shù)據(jù)語(yǔ)言只需用戶指出“干什么”,不必指出“怎么干”,為什么能做到這一點(diǎn)? 一個(gè)重要原因就是系統(tǒng)能自動(dòng)進(jìn)行查詢優(yōu)化。 查詢優(yōu)化的總目標(biāo): 選擇有效的策略,求得給定的關(guān)系表達(dá)式的值 事物管理--數(shù)據(jù)庫(kù)恢復(fù)技術(shù) 作為一個(gè)完善的DBMS,應(yīng)該提供統(tǒng)一的數(shù)據(jù)保護(hù)功 能來(lái)保證數(shù)據(jù)的安全可靠和正確有效! 數(shù)據(jù)保護(hù)也叫數(shù)據(jù)控制,主要包括: 數(shù)據(jù)庫(kù)恢復(fù),并發(fā)控制,數(shù)據(jù)的安全性,數(shù)據(jù)的完整性。 1,事務(wù)(transaction) 一個(gè)數(shù)據(jù)庫(kù)操作序列(主要是更新操作),是數(shù)據(jù)庫(kù)應(yīng)用程序的基本邏輯單元。 這些操作要么都做,要么都不做,是一個(gè)不可分割的執(zhí)行單位。 事務(wù)標(biāo)記: BEGIN TRANSACTION (事務(wù)開(kāi)始) COMMIT (事務(wù)提交:事務(wù)完成了其包含的所有活動(dòng),正常結(jié)束) 或 ROLLBACK(事務(wù)回滾(中止):撤消已做的所有操作,回到事務(wù)開(kāi)始時(shí)的狀態(tài)) 2,事務(wù)應(yīng)具有的性質(zhì) 1)原子性(Atomicity):事務(wù)執(zhí)行時(shí)的不可分割性,即事務(wù)所包含的活動(dòng)要么都做,要么都不做。 若事務(wù)因故障而中止,則要設(shè)法消除該事務(wù)所產(chǎn)生的影響,使數(shù)據(jù)庫(kù)恢復(fù)到該事務(wù)執(zhí)行前的狀態(tài)。 (2)一致性(Consistency):事務(wù)對(duì)數(shù)據(jù)庫(kù)的作用應(yīng)使數(shù)據(jù)庫(kù)從一個(gè)一致?tīng)顟B(tài)到另一個(gè)一致?tīng)顟B(tài)。 (3)隔離性(Isolation): 多事務(wù)并發(fā)執(zhí)行,應(yīng)向各事務(wù)獨(dú)立執(zhí)行一樣,不能相互干擾。一個(gè)正在執(zhí)行的事務(wù)其中間結(jié)果不能為其它事務(wù)所訪問(wèn)。 4)持久性(Durability): 一旦事務(wù)提交,不論執(zhí)行何種操作或發(fā)生何種故障,都不應(yīng)對(duì)該事務(wù)的執(zhí)行結(jié)果有任何影響。(能恢復(fù)) (5)可串行性(Serializability):并發(fā)控制正確性的標(biāo)準(zhǔn)用戶程序在邏輯上是正確的,它在串行執(zhí)行時(shí)沒(méi)有問(wèn)題; 當(dāng)多個(gè)事務(wù)并發(fā)執(zhí)行時(shí),可以等價(jià)于一個(gè)串行執(zhí)行序列。 3、事務(wù)管理任務(wù) 事務(wù)管理的任務(wù)就是要保證事務(wù)滿足上述性質(zhì)。使事務(wù)不具有上述性質(zhì)的因素可能是: (1)事務(wù)在運(yùn)行過(guò)程中被強(qiáng)行終止; (2)多個(gè)事務(wù)并行運(yùn)行時(shí),不同事務(wù)的操作交叉執(zhí)行 因此事物管理又分為兩個(gè)方面: 恢復(fù):保證事務(wù)在故障時(shí)滿足上述性質(zhì)的技術(shù)。 并發(fā)控制:保證事務(wù)在并發(fā)執(zhí)行時(shí)滿足上述性質(zhì)的技術(shù)。 |
|