




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第3章 SQL語言3.1 SQL語言的基本概念與特點語言的基本概念與特點 一、主要特點1. SQL語言集數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制功能于一體。2. 類似自然語言,簡潔易用。3. 非過程語言4. 面向集合的語言5.自含式語言,又是嵌入式語言??瑟毩⑹褂?,也可嵌入到宿主語言中。二、基本概念n基本表(BASE TABLE):n視圖(VIEW):SQL視圖1視圖2基本表1基本表2基本表3基本表4存儲文件1存儲文件2外模式模式內(nèi)模式圖3.1 SQL語言支持的關(guān)系數(shù)據(jù)庫的三級邏輯結(jié)構(gòu) SQL語言支持數(shù)據(jù)庫的三級模式結(jié)構(gòu),如圖語言支持數(shù)據(jù)庫的三級模式結(jié)構(gòu),如圖3.1所示。所示。其中其中外模式外模
2、式對應(yīng)于視圖和部分基本表,對應(yīng)于視圖和部分基本表,模式模式對應(yīng)于基對應(yīng)于基本表,本表,內(nèi)模式內(nèi)模式對應(yīng)于存儲文件。對應(yīng)于存儲文件。 3.2 數(shù)據(jù)定義操作對象操 作 方 式創(chuàng) 建刪 除修 改數(shù)據(jù)庫C R E A T E DATABASEDROP DATABASEALTER DATABASE基本表CREATE TABLE DROP TABLEALTER TABLE索 引CREATE INDEXDROP INDEX 視 圖CREATE VIEWDROP VIEW 數(shù)據(jù)定義語言數(shù)據(jù)定義語言(Data Definition Language) Create、Drop、Alter 定義一組關(guān)系(基本表)、
3、說明各關(guān)系的信息定義一組關(guān)系(基本表)、說明各關(guān)系的信息 各關(guān)系的模式各關(guān)系的模式 各屬性的值域各屬性的值域 完整性約束完整性約束 索引索引 安全性和權(quán)限安全性和權(quán)限3.2.1 創(chuàng)建與刪除數(shù)據(jù)庫創(chuàng)建與刪除數(shù)據(jù)庫(1) 數(shù)據(jù)庫的創(chuàng)建創(chuàng)建數(shù)據(jù)庫的語句格式為:C R E AT E D ATA B A S E AUTHORIZATION ;例如,CREATE DATABASE ST-COURSE AUTHORIZATION 王非;(2) 數(shù)據(jù)庫的刪除數(shù)據(jù)庫的刪除DROP DATABASE CASCADE|RESTRICT;刪除的方式有兩種:CASCADE(連鎖式)方式(連鎖式)方式:RESTRICT(
4、約束式)方式(約束式)方式3.2.2 創(chuàng)建、刪除、修改基本表創(chuàng)建、刪除、修改基本表SQL語言中的二種數(shù)據(jù)類型:系統(tǒng)提供的數(shù)據(jù)類型,簡稱為數(shù)據(jù)類型;用戶定義的數(shù)據(jù)類型,稱為域。表表3.3 系統(tǒng)提供的數(shù)據(jù)類型系統(tǒng)提供的數(shù)據(jù)類型數(shù) 據(jù) 類 型類 型 說 明分 類類型表示字符類型Char(n)長度為n的定長字符串Varchar(n)最大長度為n的變長字符串整數(shù)類型Int長整數(shù)Smallint短整數(shù)浮點類型Float雙字長浮點數(shù)Real實數(shù)Decimal(n,p)小數(shù),共n位,小數(shù)點后面有p位數(shù)字位串類型Bit(n)長度為n的二進制位串Bitvarying(n)最大長度為n的變長二進制位串日期和時間類型
5、Date日期:格式為YYYYMMDDTime時間:格式為HH:MM:SS定義域的語句形式為:CREATE DOMAIN As ;如果該域不再需要,可以使用下列語句將其刪掉DROP DOMAIN postcode; 域定義語句(域定義語句(SQL-92支持)支持) 需重復(fù)使用的需重復(fù)使用的 Create Domain stu_name varchar(20) Create Domain zip_code char(6)DDLSQL中的域類型中的域類型(1) 基本表的創(chuàng)建基本表的創(chuàng)建CREATE TABLE . ( , ,n,,n;列級完整性約束列級完整性約束是針對屬性值設(shè)置的限制條件,主要有:N
6、OT NULLUNIQUEDEFAULTCHECK表級完整性約束表級完整性約束 如果列級約束條件表達式涉及到多列屬性,則成為表級完整性約束。表級約束主要有下列幾種:PRIMARY KEYFOREIGN KEY例3.1 用SQL建立STCOURSE庫中的下列四個基本表(見2.4節(jié)),其表結(jié)構(gòu)為:課程類表T(TNO,TNAME,CREDIT,HOURS,PTNO)開課表 C(CNO,TNO,CTERM,TNAME, TEACHER) 學(xué)生表S(SNO,SNAME,SSEX,SAGE, SNATIVE)學(xué)生選課表 S-C(SNO,CNO,GRADE)創(chuàng)建基本表的創(chuàng)建基本表的SQL語句如下:語句如下:
7、創(chuàng)建課程類表:CREATE TABLE T (TNO Char(5) PRIMARY KEY, TNAME Varchar(10) NOT NULL, CREDIT Char(1), HOURS Smallint, PTNO,Char(5);創(chuàng)建開課表:CREATE TABLE C (CNO Char(4) PRIMARY KEY, TNO Char(5), CTERM Char(6), TNAME Varchar(10) , TEACHER Char(8),FOREIGN KEY (TNO) REFERENCES T(TNO);創(chuàng)建學(xué)生表:CREATE TABLE S (SNO Char(6
8、) PRIMARY KEY,SNAME Char(8) NOT NULL,SSEX Char(2) DEFAULT男男,SAGE Smallint,SNATIVE Varchar(20),CHECK (SSEX IN (男男,女女); 創(chuàng)建選課表:CREATE TABLE S-C (SNO Char(6),CNO Char(4),GRADE Smallint,PRIMARY KEY(SNO,CNO),),F(xiàn)OREIGN KEY(SNO)REFERENCES S(SNO),),F(xiàn)OREIGN KEY (CNO) REFERENCES C(CNO),), CHECK (GRADE BETWEEN
9、0 AND 100);); 刪除表中的某屬性刪除表中的某屬性 去除屬性及相應(yīng)的數(shù)據(jù)去除屬性及相應(yīng)的數(shù)據(jù)Alter Table r Drop A(2)基本表的修改)基本表的修改 增加表中的屬性增加表中的屬性 向已經(jīng)存在的表中添加屬性向已經(jīng)存在的表中添加屬性 allow null 已有的元組中該屬性的值被置為已有的元組中該屬性的值被置為NullAlter Table r Add A DAlter Table S phone char(16);修改模式修改模式 Alter 用用SQL刪除關(guān)系(表)刪除關(guān)系(表) 將整個關(guān)系模式(表結(jié)構(gòu))徹底刪除將整個關(guān)系模式(表結(jié)構(gòu))徹底刪除 表中的數(shù)據(jù)也將被刪除表
10、中的數(shù)據(jù)也將被刪除Drop Table rDrop Table S;(3)基本表的刪除)基本表的刪除 Drop 用用SQL刪除關(guān)系(表)刪除關(guān)系(表) 將整個關(guān)系模式(表結(jié)構(gòu))徹底刪除將整個關(guān)系模式(表結(jié)構(gòu))徹底刪除 Drop Table r 用用SQL刪除表中的某屬性刪除表中的某屬性 去除屬性及相應(yīng)的數(shù)據(jù)去除屬性及相應(yīng)的數(shù)據(jù) Alter Table r Drop A 用用SQL增加表中的屬性增加表中的屬性 向已經(jīng)存在的表中添加屬性向已經(jīng)存在的表中添加屬性 已有的元組中該屬性的值被置為已有的元組中該屬性的值被置為Null Alter Table r Add A D3.2.3 創(chuàng)建與刪除索引創(chuàng)建
11、與刪除索引(1)索引的創(chuàng)建索引的創(chuàng)建 IndexCREATE UNIQUE CLUSTERED | NONCLUSTERED INDEX index-name On TableName(Column,Column,) 索引的種類索引的種類 聚簇索引(聚簇索引(Clustered Index) 非聚簇索引(非聚簇索引(Non-Clustered Index) 聚簇索引(聚簇索引(Clustered Index) 表中的元組按聚簇索引的順序物理地存放表中的元組按聚簇索引的順序物理地存放 根級頁面根級頁面-中間層頁面中間層頁面-葉級頁面(葉級頁面(數(shù)據(jù)頁面數(shù)據(jù)頁面) 一個表中只能有一個聚簇索引一個表
12、中只能有一個聚簇索引 更新的復(fù)雜性,需要大量的臨時空間更新的復(fù)雜性,需要大量的臨時空間 非聚簇索引(非聚簇索引(Non-Clustered Index) 表中元組存儲的物理順序與索引的順序無關(guān)表中元組存儲的物理順序與索引的順序無關(guān) 葉級索引頁面是指向數(shù)據(jù)頁面的指針葉級索引頁面是指向數(shù)據(jù)頁面的指針 每個表可有多個非聚簇索引每個表可有多個非聚簇索引例例3.2 為為STCOURSE數(shù)據(jù)庫中的四個表課程類表數(shù)據(jù)庫中的四個表課程類表T,開課表,開課表C,學(xué)生表,學(xué)生表S和選課表和選課表SC建立索引。建立索引。CREATE UNIQUE INDEX TNO-INDEX ON T (TNO ASC););C
13、REATE UNIQUE INDEX CNO-INDEX ON C (CNO DESC););CREATE UNIQUE INDEX SNO-INDEX ON S (SNO););CREATE UNIQUE INDEX SC-INDEX ON S-C (SNO ASC,CNO DESC);); 2. 索引的刪除索引的刪除DROP INDEX ;例3.3 刪除索引CNO-INDEX和SNO-INDEX。DROP INDEX CNO-INDEX,SNO-INDEX;刪除索引時,系統(tǒng)會同時從數(shù)據(jù)字典中刪去有關(guān)該索引的定義?;窘Y(jié)構(gòu)基本結(jié)構(gòu)Select A1, A2, ., AnFrom r1, r2
14、, ., rmWhere PA1, A2, ., An( p(r1r1.rm)SelectWhereFrom3.2 3.2 查詢查詢 對對 From 子句中的各關(guān)系,作笛卡兒子句中的各關(guān)系,作笛卡兒積(積() 對對 Where 子句中的邏輯表達式進行選子句中的邏輯表達式進行選擇(擇()運算,找出符合條件的元組)運算,找出符合條件的元組 根據(jù)根據(jù) Select 子句中的屬性列表,對上子句中的屬性列表,對上述結(jié)果作投影(述結(jié)果作投影( )操作)操作 結(jié)果集結(jié)果集查詢操作的對象是關(guān)系,結(jié)果還是一個關(guān)查詢操作的對象是關(guān)系,結(jié)果還是一個關(guān)系,是一個結(jié)果集,是一個動態(tài)數(shù)據(jù)集系,是一個結(jié)果集,是一個動態(tài)數(shù)據(jù)
15、集SelectSelect語句的含義語句的含義3.3.1 簡單查詢簡單查詢Select sdept From Student Select 子句的缺省情況是保留重復(fù)元組( ALL ),可用 Distinct 去除重復(fù)元組Select Distinct sdept From Student 去除重復(fù)元組:費時 需要臨時表的支持Select子句子句重復(fù)元組重復(fù)元組 星號星號 * * 表示所有屬性表示所有屬性星號星號 * * :按關(guān)系模式中屬性的順序:按關(guān)系模式中屬性的順序排列,并具有一定的排列,并具有一定的邏輯數(shù)據(jù)獨立性邏輯數(shù)據(jù)獨立性 Select * From S 顯式列出屬性名:按用戶順序排列
16、顯式列出屬性名:按用戶順序排列Select S.*,cno,gradeFrom S,S_CWhere S.sno = S_C.snoSelect子句 * *與屬性列表 為結(jié)果集中的某個屬性改名為結(jié)果集中的某個屬性改名 使結(jié)果集更具可讀性使結(jié)果集更具可讀性 Select sno as stu_no,cno as course_no, gradeFrom SC查詢結(jié)果為:查詢結(jié)果為:Select子句更名stu_nocourse_no grade010301C00176010301C00384010301C00688010302C00180010302C00480010302C00690010303
17、C00290010303C00480求學(xué)生的姓名、性別、出生年,并用別名表示Select sno 姓姓名名,sname 性別性別, 生于生于 出生于出生于,2004 sage 出生年份出生年份From S 查詢結(jié)果為:查詢結(jié)果為:姓名姓名性別性別出生于出生于出生年份出生年份李明男生于生于1985王平男生于生于1984林麗萍女生于生于1985定義別名的定義別名的“as”可省,且可省,且SELECT子句中可出現(xiàn)常子句中可出現(xiàn)常量量。表表3.4 WHERE子句中常用的運算符子句中常用的運算符 運算符謂 詞算術(shù)運算符+,-,*,/比較運算符=,!=,=,!,!邏輯運算符AND,OR,NOT表表3.5
18、WHRER子句中常用的表達式子句中常用的表達式 表達式謂詞說明舉例算術(shù)表達式 由算術(shù)運算符將常數(shù)或變量聯(lián)結(jié)起來的式子20,男關(guān)系表達式 由比較運算符將算術(shù)表達式聯(lián)結(jié)起來的式子SSXE=男,SAGE20邏輯表達式 由邏輯運算符將關(guān)系表達聯(lián)結(jié)起來的式子SSEX=男AND SAGE20條件表達式BETWEENAND NOT BETWEENAND在某值之間不在某值之間BETWEEN 20AND 23INNOT IN 在某組中不在某組中IN (湖北武漢,湖南衡陽)IS NULLIS NOT NULL 是空值不是空值 字符串比較LIKENOT LIKE LIKE王%Where 子句子句運算符運算符 比較:
19、比較:、=、=、not + 確定范圍:確定范圍:Between A and B、Not Between A and B 確定集合:確定集合:IN、NOT IN 字符匹配:字符匹配:LIKE,NOT LIKE 空值:空值:IS NULL、IS NOT NULL 多重條件:多重條件:AND、OR、NOTWhere 子句子句Like 字符匹配:字符匹配:Like、Not Like 通配符通配符 % 匹配任意字符串匹配任意字符串 _ 匹配任意一個字符匹配任意一個字符 大小寫敏感大小寫敏感求所有年齡在20歲以下的男學(xué)生的姓名及年齡。SELECT SNAME,SAGEFROM SWHERE SAGE ,=
20、,、=、=、=、 例:找出與例:找出與010303 同齡的學(xué)生同齡的學(xué)生Select *From StudentWhere sage = ( Select sage From Student Where sno = 010303 )子查詢單值比較子查詢返回子查詢返回多行一列多行一列運算符:運算符:In、All、Some(Any)、Exists子查詢多值標量值與子查詢返回集中的某一個相等,true IN 被用來測試多值中的成員被用來測試多值中的成員例:查詢選修例:查詢選修C001課程的學(xué)生的學(xué)號、課程的學(xué)生的學(xué)號、姓名。姓名。Select sno,snameFrom StudentWhere s
21、no IN (Select sno From SCWhere cno = C001 )子查詢子查詢多行一列多行一列子查詢多值成員In例:例: 查詢選修了查詢選修了 C語言語言的學(xué)生的學(xué)號和姓名的學(xué)生的學(xué)號和姓名Select sno,snameFrom SWhere sno IN ( Select sno From SC Where cno IN ( Select cnoFrom CWhere tname = C語言語言)多值比較:多值比較:多行一列多行一列 父查詢與多值子查詢之間的比較需用父查詢與多值子查詢之間的比較需用All來連接來連接 標量值標量值s比子查詢返回集比子查詢返回集R中的每個都
22、大時,中的每個都大時,sAll R 為為True All表示所有表示所有 all、 all、=all、 all all 等價于等價于 not in例:找出年齡最小的學(xué)生例:找出年齡最小的學(xué)生Select * From S Where sage ANY大于子查詢結(jié)果中的某個值,即表示大于查詢結(jié)果中最小值A(chǔ)LL大于子查詢結(jié)果中的所有值,即表示大于查詢結(jié)果中最大值A(chǔ)NY小于子查詢結(jié)果中的某個值,即表示小于查詢結(jié)果中最大值=ANY大于等于子查詢結(jié)果中的某個值,即表示大于等于結(jié)果集中最小值=ALL大于等于子查詢結(jié)果中的所有值,即表示大于等于結(jié)果集中最大值=ANY小于等于子查詢結(jié)果中的某個值,即表示小于等
23、于結(jié)果集中最大值=ALL小于等于子查詢結(jié)果中的所有值,即表示小于等于結(jié)果集中最小值=ANY等于子查詢結(jié)果中的某個值,即相當于IN=ALL等于子查詢結(jié)果中的所有值(通常沒有實際意義)!=(或) ANY不等于子查詢結(jié)果中的某個值!=(或) ALL不等于子查詢結(jié)果中的任何一個值,即相當于NOT IN多值比較:多值比較:多行一列多行一列 父查詢與多值子查詢之間的比較需用父查詢與多值子查詢之間的比較需用Some/Any來連接來連接 標量值標量值s比子查詢返回集比子查詢返回集R中的中的某一個某一個都大時都大時 s Some R為為True 或或 s Any R為為True Some(早期用早期用Any)表
24、示某一個表示某一個,只要有一個即返只要有一個即返回真回真 some、 some、=some、 some = some 等價于等價于 in、 some 不等價于不等價于 not in 子查詢多值比較Some/Any例:找出不是最小年齡的學(xué)生例:找出不是最小年齡的學(xué)生Select * From SWhere sage some ( Select sage From S )子查詢子查詢多值比較多值比較例:找出具有最高平均成績的學(xué)號及平均成績例:找出具有最高平均成績的學(xué)號及平均成績Select sno ,avg(grade)From SC Group By sno Having avg(grade)
25、= all (Select avg(grade) From SC Group By sno) 子查詢子查詢多值比較多值比較SQL-92SQL-92支持多列的成員資格測試支持多列的成員資格測試例:例:找出同系、同年齡、同性別的學(xué)生找出同系、同年齡、同性別的學(xué)生Select Select * *from S as Tfrom S as TWhere Where (T.sdept,T.sage,T.ssexT.sdept,T.sage,T.ssex) IN ) IN ( Select ( Select From student as SFrom student as SWhere S.sno T.s
26、noWhere S.sno T.sno ) ) 子查詢多列元組的比較多列元組的比較子查詢子查詢存在判斷存在判斷Exists Exists + 子查詢用來判斷該子查詢是否返回元組子查詢用來判斷該子查詢是否返回元組當子查詢的結(jié)果集非空時,當子查詢的結(jié)果集非空時,Exists為為True當子查詢的結(jié)果集為空時,當子查詢的結(jié)果集為空時,Exists為為False不關(guān)心子查詢的具體內(nèi)容,因此用不關(guān)心子查詢的具體內(nèi)容,因此用 Select *Exists和和Not Exists具有外部引用的子查詢,稱為相關(guān)子查詢(Correlated Queries)外層元組的屬性作為內(nèi)層子查詢的條件子查詢子查詢相關(guān)子查
27、詢相關(guān)子查詢 例:列出選修了例:列出選修了C01課程的學(xué)生的學(xué)號、姓名課程的學(xué)生的學(xué)號、姓名Select sno,snameFrom SWhere Exists ( Select * From SC Where SC.sno = S.sno And cno = C01)相關(guān)子查詢Correlated & Exists 例:列出得過例:列出得過100分的學(xué)生的學(xué)號、姓名分的學(xué)生的學(xué)號、姓名Select sno,snameFrom SWhere Exists ( Select * From SCWhere SC.sno = S.sno Andgrade = 100)子查詢Correlate
28、d & Exists例:查詢選修了例:查詢選修了C01課程的學(xué)生的系主任課程的學(xué)生的系主任Select managerFrom departmentWhere Exists ( Select * From SWhere sdept = department.depid And Exists ( Select * From SC Where SC.sno = S.sno Andcno = C01)子查詢子查詢Correlated & Exists* 例:列出沒有選例:列出沒有選C003課程的學(xué)生的學(xué)號、姓名課程的學(xué)生的學(xué)號、姓名Select sno,snameFrom SWher
29、e Not Exists ( Select * From SCWhere SC.sno = S.sno Andcno = C003)子查詢子查詢Correlated & Not Exists例:查詢選修了所有課程的學(xué)生的姓名例:查詢選修了所有課程的學(xué)生的姓名(ForAll)Select snameFrom SWhere Not Exists ( Select * From CWhere Not Exists ( Select *From SCWhere S.sno = SC.sno AndSC.cno = C.cno)這門課他沒選這門課他沒選這樣的課是不存在的這樣的課是不存在的子查詢子
30、查詢Correlated & Not Exists*另解:查詢選修了所有課程的學(xué)生的姓名Select snameFrom StudentWhere sno in ( Select sno From SC group by sno having count(cno)= ( Select count(*) From Course)3.3.4 組合查詢組合查詢組合查詢中包括使用集函數(shù)進行查詢,分組查詢和集合查詢。 使用集函數(shù) SQL提供的集函數(shù)如表3.7所示。用這些函數(shù)可以產(chǎn)生某個列的統(tǒng)計值。SQL集函數(shù)可做為列標識符出現(xiàn)在SELECT子句的目標列或HAVING子句的條件中。
31、把一列中的值進行聚合運算,返回單值的把一列中的值進行聚合運算,返回單值的函數(shù)函數(shù)五個預(yù)定義的聚合函數(shù)五個預(yù)定義的聚合函數(shù) 平均值:平均值:AvgAvg 總和:總和: SumSum 最小值:最小值:MinMin 最大值:最大值:MaxMax 計數(shù):計數(shù): CountCountCount(Count(* *) )、Count(DistinctCount(Distinct) )數(shù)值數(shù)值 SQL集函數(shù)例:列出學(xué)生的平均年齡。Select Avg(sage) From S例:列出C001課程的最高成績、最低成績Select Max(grade), Min(grade) From SCwhe
32、re cno=C001例:列出010301學(xué)生選修課程的門數(shù) Select Count(cno) From SCwhere sno=010301集函數(shù)簡例 集函數(shù)和分組n當希望集函數(shù)集函數(shù)作用在一組元組集上時,可以和分組子句Group byGroup by一起使用。n子句Group by Group by 將表的元組按列名列名值相同進行分組。nSelect子句子句中的列、表達式按組取單值n例:查詢每個選課學(xué)生的學(xué)號、平均成績 Select sno, Avg(grade) From SC Group by Group by snoHaving子句子句nHavingl針對聚合函數(shù)的結(jié)
33、果值進行篩選(選擇),針對聚合函數(shù)的結(jié)果值進行篩選(選擇),它作用于分組計算結(jié)果集它作用于分組計算結(jié)果集l跟在跟在Group By子句的后面,子句的后面,沒有沒有Group By則針則針對全表對全表n例:查詢選課門數(shù)在2門以上的學(xué)生的學(xué)號及 選課門數(shù) Select sno, count(cno) From SC Group By sno Having count(cno) 2Having子句和Where子句聯(lián)用聯(lián)用Having子句和子句和Where子句子句聯(lián)用時, Where條件在Having條件之前先執(zhí)行例:列出具有兩門(含兩門)以上不及格的學(xué)生的學(xué)號、不及格的課目數(shù)。Select sno,
34、count(sno) From SC Where grade = 2Having 與與 Where的區(qū)別的區(qū)別Where 決定哪些元組被選擇參加運算,作用于關(guān)系中的元組Having 決定哪些分組符合要求,作用于分組集函數(shù)的條件關(guān)系必須用Having,Where中不應(yīng)出現(xiàn)集函數(shù)。一個錯誤的例: 查詢學(xué)習(xí)C001課程、成績大于或等于該課程的平均成績的學(xué)生的學(xué)號 Select sno From SC Where grade =Avg(grade) 多個多個 Select 語句的結(jié)果可以進行集合操語句的結(jié)果可以進行集合操作,使結(jié)果為作,使結(jié)果為“集合集合”(default) SQL-92支持支持 參加
35、集合操作的關(guān)系(結(jié)果集)必須是參加集合操作的關(guān)系(結(jié)果集)必須是相容相容的的 SQL的集合操作SQL的集合操作的集合操作相容相容 屬性個數(shù)必須一致屬性個數(shù)必須一致 對應(yīng)的類型必須一致對應(yīng)的類型必須一致 屬性名無關(guān)屬性名無關(guān) 最終結(jié)果集采用第一個結(jié)果的屬性名最終結(jié)果集采用第一個結(jié)果的屬性名 缺省為自動去除重復(fù)元組缺省為自動去除重復(fù)元組 除非顯式說明除非顯式說明ALL Order By放在整個語句的最后放在整個語句的最后 union(并,對應(yīng)與關(guān)系代數(shù)的(并,對應(yīng)與關(guān)系代數(shù)的),標準),標準SQL都支持的都支持的 采用集合的觀點,合成多個查詢的結(jié)果采用集合的觀點,合成多個查詢的結(jié)果s
36、elect - without - order by . UNION ALL select - without - order by . UNION ALL select - without - order by . ORDER BY integer ASC | DESC , . SQL的集合操作并例:查詢計算機系的學(xué)生例:查詢計算機系的學(xué)生或者或者年齡不大于年齡不大于1919歲歲的學(xué)生,并按年齡倒排序。的學(xué)生,并按年齡倒排序。(Select sno, sname,sageFrom StudentWhere sdept = CS)UNION(Select sno, sname,sageFrom
37、 StudentWhere sage = 19)Order By sage DESC intersect(交,對應(yīng)與關(guān)系代數(shù)的(交,對應(yīng)與關(guān)系代數(shù)的),并不),并不是所有的是所有的DBMS都支持都支持 例:查詢計算機系的學(xué)生例:查詢計算機系的學(xué)生并且并且年齡不大于年齡不大于1919歲的學(xué)生,并按年齡倒排序。歲的學(xué)生,并按年齡倒排序。 (Select sno, sname,sageFrom S Where sdept = CS)intersect(Select sno, sname,sageFrom Student Where sage = 19)Order By sage DESC SQL的集
38、合操作交另解n例:查詢計算機系的學(xué)生例:查詢計算機系的學(xué)生并且并且年齡不大于年齡不大于1919歲的學(xué)生,并按年齡倒排序。歲的學(xué)生,并按年齡倒排序。Select sno, sname,sageFrom S Where sdept = CS and sage 75在 From中使用查詢表達式NULL 表示數(shù)據(jù)的缺失 一個確實存在,但我們不知道的值 對本實體此數(shù)值無意義,可能是設(shè)計上的失誤 是SQL的關(guān)鍵字,用于任何類型描述缺失的值UNKONW 是三值邏輯的一個真值(True/False/Unkonw)*空值NULL的運算法則 對對NULL值和其他任何值作算術(shù)運算時,值和其他任何值作算術(shù)運算時,結(jié)果
39、為結(jié)果為NULL 對對NULL值和其他任何值作比較時,結(jié)果值和其他任何值作比較時,結(jié)果為為UNKOWN Is Null / Is Not Null空值空值*Unkown 視視True為為1,F(xiàn)alse為為0,Unkown為為1/2 AND:取小取小 OR:取大取大 NOT:取取1的補的補 真值表不必死記硬背真值表不必死記硬背空值空值*數(shù)據(jù)數(shù)據(jù)更新包括包括插入數(shù)據(jù)、插入數(shù)據(jù)、修改數(shù)據(jù)、修改數(shù)據(jù)、刪除數(shù)據(jù)刪除數(shù)據(jù)3.4 數(shù)據(jù)更新 數(shù)據(jù)插入(數(shù)據(jù)插入(Insert) 單行插入單行插入例:新增一個學(xué)生信息例:新增一個學(xué)生信息Insert Into StudentValues ( 010304, Glo
40、ria,25, F, CS) 多行插入多行插入例例:給給CS系的學(xué)生開設(shè)必修課系的學(xué)生開設(shè)必修課C005,建立選課信息,建立選課信息Insert Into SC values( Select sno,cno,null From Student,Course Where sdept = CS and cno = C05)3.4.1 插入數(shù)據(jù)插入數(shù)據(jù) 數(shù)據(jù)插入數(shù)據(jù)插入 按關(guān)系模式的屬性順序按關(guān)系模式的屬性順序Insert Into Student Values ( 95001, 張三張三,27, M, CS ) 按指定的屬性順序,也可以只添加部分屬性(非按指定的屬性順序,也可以只添加部分屬性(非N
41、ull屬性為必需)屬性為必需)Insert Into Student ( sno, sname, sage)Values ( 95002, 李四李四, 26 ) 數(shù)據(jù)更新(數(shù)據(jù)更新(Update) 改變符合條件的某個(某些)元組的改變符合條件的某個(某些)元組的屬性值屬性值例:將例:將95001學(xué)生轉(zhuǎn)入學(xué)生轉(zhuǎn)入MA系系Update SSet sdept = MAWhere sno = 95001例:所有學(xué)生年齡加例:所有學(xué)生年齡加1Update StudentSet sage = sage + 13.4.2 修改數(shù)據(jù)修改數(shù)據(jù)數(shù)據(jù)更新(數(shù)據(jù)更新(Update)例:將選修例:將選修C005課程的學(xué)
42、生的成績改為該課課程的學(xué)生的成績改為該課的平均成績的平均成績Update SCSet grade = (Select avg(grade)From SCWhere cno = C05)Where cno = C05先計算先計算avg,再做,再做Update3.4.3 刪除數(shù)據(jù)n數(shù)據(jù)刪除(數(shù)據(jù)刪除(Delete)l只能對一個關(guān)系起作用,若要從多個關(guān)只能對一個關(guān)系起作用,若要從多個關(guān)系中刪除元組,則必須對每個關(guān)系分別系中刪除元組,則必須對每個關(guān)系分別執(zhí)行刪除命令執(zhí)行刪除命令Delete From r Where Pl從關(guān)系從關(guān)系 r 中刪除滿足中刪除滿足P的元組,只是刪除的元組,只是刪除數(shù)據(jù),而不
43、是定義數(shù)據(jù),而不是定義 刪除單個元組刪除單個元組例:刪除學(xué)號為例:刪除學(xué)號為95001的學(xué)生的選課信息的學(xué)生的選課信息Delete From SCWhere sno = 95001 刪除多個元組刪除多個元組例:刪除選課而未參加考試的學(xué)生的選課信息例:刪除選課而未參加考試的學(xué)生的選課信息Delete From SCWhere grade is null 刪除整個關(guān)系中的所有數(shù)據(jù)刪除整個關(guān)系中的所有數(shù)據(jù)例:刪除所有學(xué)生的選課信息例:刪除所有學(xué)生的選課信息Delete From SC 視圖(視圖(View)3.5.1 創(chuàng)建視圖創(chuàng)建視圖、刪除、刪除Create View v as Drop View
44、v例:計算機系的花名冊例:計算機系的花名冊Create View CS_Stu asSelect sno,sname,ssexFrom S Where sdept = CS3.5 視圖視圖名可以出現(xiàn)在任何關(guān)系名可以出現(xiàn)的地方視圖名可以出現(xiàn)在任何關(guān)系名可以出現(xiàn)的地方例:列出計算機系的男生例:列出計算機系的男生Select sno,snameFrom CS_StuWhere ssex = 男男 例:建立學(xué)生平均成績視圖例:建立學(xué)生平均成績視圖Create View avg_grade(sno,avg) asSelect sno,avg(grade)From SC Group By sno3.5.3
45、 視圖(視圖(View)的查詢)的查詢 視圖(視圖(View)例:找出平均成績大于等例:找出平均成績大于等75的學(xué)生的學(xué)生Select *From avg_gradeWhere avg = 75注意:此例的使用方法是非標準的。注意:此例的使用方法是非標準的。視圖的更新:單表、原始屬性構(gòu)成的視圖可以視圖的更新:單表、原始屬性構(gòu)成的視圖可以更新(像基本表那樣更新)更新(像基本表那樣更新) 由多表構(gòu)成的視圖由很大的限制由多表構(gòu)成的視圖由很大的限制 視圖中的非原始屬性也不能更新視圖中的非原始屬性也不能更新例:例:Update avg_gradeSet avg = 100Where sno = 0103
46、01avg不是原不是原始屬性始屬性3.5.4 視圖(視圖(View)的)的 更新更新 視圖的作用視圖的作用 簡化用戶的操作簡化用戶的操作 不同的用戶可從不同的角度看待同一數(shù)據(jù)不同的用戶可從不同的角度看待同一數(shù)據(jù) 支持一定的邏輯數(shù)據(jù)獨立性支持一定的邏輯數(shù)據(jù)獨立性 數(shù)據(jù)的安全性數(shù)據(jù)的安全性3.6數(shù)據(jù)控制3.6.1權(quán)限的類型 SQL定義了6類權(quán)限供用戶選擇。SELECT 允許對基本表或視圖執(zhí)行查詢INSERT 允許對基本表或視圖執(zhí)行插入DELETE 允許對基本表或視圖執(zhí)行修改UPDATE 允許對基本表或視圖執(zhí)行刪除REFERENCES 允許在定義新關(guān)系時,建立完整性約束,即引用指定關(guān)系的主碼作為新關(guān)
47、系的外部碼。USAGE 允許用戶使用已經(jīng)定義的域。3.6.2授權(quán)授權(quán)GRANT ALLPRIVILIGES ON TOPUBLIC WITH GRANT OPTION其中:ALLPRIVILIGES指所有的權(quán)限;數(shù)據(jù)庫對象指基本表、視圖、過程、域等;PUBLIC指所有的用戶;WITH GRANT OPTION指允許取得權(quán)限的用戶再將該權(quán)限授予別的用戶。例3.31把對學(xué)生表的查詢,插入的權(quán)限授給U,并且U還可以把這些權(quán)限授予其他用戶。GRANT SELECT, INSERT ON S TO U1 WITH GRANT OPTION;把對學(xué)生選課表S-C中的成績修改的權(quán)限授給U。GRANTUPDA
48、TE(GRADE)ONS-CTOU;把引用開課表C的主碼CNO做為新關(guān)系的外碼的權(quán)限授給U。GRANT REFERENCES (CNO) ON C TO U3;假設(shè)定義了一個域NAME,把使用該域的權(quán)限授給U。GRANTUSAGE ONDOMAINNAMETOU;3.6.3收回授權(quán)收回授權(quán)用REVOKE語句將授出的權(quán)限再收回。語句的格式為:REVOKE ALL PRIVILIGES|ONFROMPUBLIC;例3.32REVOKE UPDATE(GRADE)ONS-CFROMU;該語句將收回U對S-C表中的成績GRADE的修改權(quán)限。REVOKESELECT,INSERTONSFROMU;該語句
49、將收回U1對表S的查詢、插入的權(quán)限,并且自動地收回他給其他用戶的授權(quán),即收回權(quán)限的操作會級聯(lián)下去。3.7嵌入式嵌入式SQL SQL語言有兩種使用方式:交互式交互式SQL 在終端交互方式下使用,稱為交互式SQL,也稱為自主式或自含式SqL;嵌入式嵌入式SQL 嵌入在高級語言的程序中使用,稱為嵌入式SQL。對嵌入了對嵌入了SQL語句的源程序的處理語句的源程序的處理 一種是擴充宿主語言的編譯程序,使之能處理SQL語句,稱為增強編譯方式; 另一種是采用預(yù)處理方式。目前多數(shù)系統(tǒng)采用后一種方式。預(yù)處理方式的具體過程如圖3.7所示。預(yù)處理程序宿主語言編譯程序宿主語言+嵌入式SQL宿主語言+函數(shù)調(diào)用目標程序圖
50、3.7 預(yù)處理方式的處理過程3.7.1 基本技術(shù)基本技術(shù)1、SQL和宿主語言的接口 存儲設(shè)備上的數(shù)據(jù)庫是用SQL語句來存取的,即SQL語句負責(zé)管理數(shù)據(jù)庫, 主語言語句負責(zé)控制程序流程和其他功能。 SQL語句和宿主語言間信息的傳遞是通過共享變量實現(xiàn)的。共享變量也就成了SQL和宿主語言的接口。 共享變量先由宿主語言程序定義,再用SQL的變量聲明語句說明,隨后SQL語句就可以引用這些變量。共享變量的說明共享變量的說明 用SQL的變量聲明語句說明共享變量, 把要使用的變量放在兩個嵌入式的SQL語句之間,這兩個語句稱為變量聲明語句。 其格式如下所示: EXEC SQL BEGIN DECLARE SEC
51、TION;共享變量說明語句 EXEC SQL END DECLARE SECTION;其中共享變量說明語句的格式應(yīng)該依據(jù)宿主語言的格式,并且宿主語言和SQL語言都可以處理這些數(shù)據(jù)。特殊的共享變量特殊的共享變量SQLSTATE SQL2規(guī)定了一個特殊的共享變量SQLSTATE,它的狀態(tài)反映了SQL語句執(zhí)行的狀況, 它是由5個字符組成的字符數(shù)組。當一個SQL語句執(zhí)行成功時,系統(tǒng)自動給它賦上全零值(即“00000”),表示未發(fā)生錯誤; 否則其值為非全零,分別表示執(zhí)行SQL語句時發(fā)生的各種錯誤。在執(zhí)行完一個SQL語句后,程序可以根據(jù)SQLSTATE的值轉(zhuǎn)向不同的分支,以控制程序的流向。2、主變量(即共
52、享變量)、主變量(即共享變量) 在SQL語句中引用這些共享變量時,要在這些變量前加上冒號“:”作為前綴標識,如:number。 當這些變量在宿主語言中使用時,不需要加冒號。 注意:宿主語言不能引用數(shù)據(jù)庫中的字段變量。 在主變量中還分為輸入主變量和輸出主變量。輸入主變量是指由宿主語言語句對其賦值,SQL語句引用;利用輸入主變量,可以:指定向數(shù)據(jù)庫中插入的數(shù)據(jù)、將數(shù)據(jù)庫中的數(shù)據(jù)修改為指定值、指定要執(zhí)行的操作。輸出主變量是指由SQL語句對其賦值或設(shè)置狀態(tài)信息,返回給宿主語言程序。利用輸出主變量可以得到SQL語句的結(jié)果數(shù)據(jù)和狀態(tài)。一個主變量有可能既是輸入主變量又是輸出主變量。下面舉例說明。例3.33
53、SQL語句嵌套在C語言程序中 EXEC SQL BEGIN DECLARE SECTION; Char s_code (7); Char name(9); Char sex(3); Int age; /*共享變量說明*/ Char come(21); Char c_code(5); Int grade;EXEC SQL END DECLARE SECTION; EXEC SQL INSERT INTO S(SNO,SNAME,SSEX,SAGE,SNATIVE)VALUES (:s_code,:name,:sex,:age,:come);/*上述s_code,name,sex,age,come
54、為輸入主變量,在此之前已被宿主語言語句賦值。*/ EXEC SQL SELECT GRADE INTO :grade FROM S-C WHERE SNO=:s_code AND CNO=:c_code;/*上述 grade為輸出主變量,其值由SQL的查詢語句賦值;s_code和c_code為輸入主變量,在此之前已被宿主語言語句賦值。*/ 在共享變量說明語句中字符數(shù)組的長度都比原來字符串長度大1,這是由于在C語言中規(guī)定變量值在作字符串使用時應(yīng)有結(jié)束符“0”。 3、嵌入到宿主語言中的、嵌入到宿主語言中的SQL語句的標識語句的標識在 所 有 的 S Q L 語 句 前 必 須 加 上 前 綴 標
55、識“EXEC SQL”,并以“END-EXEC”作為語句結(jié)束標志。格式如下:EXEC SQL END-EXEC結(jié)束標志依不同的宿主語言而不同,在PL/I,C和PASCAL語言程序中規(guī)定結(jié)束標志為分號“;”。4、指示變量(、指示變量(Indication Variable) 一個主變量后可以附帶一個指示變量,用來指示所指主變量的值或條件。 指示變量是一個整型變量,它可以指示輸入主變量是否為空,也可以檢測輸出主變量是否為空值,值是否被截斷。 指示變量也必須在SQL的變量說明語句“BEGIN DECLARE SECTION”和“END DECLARE SECTION”之間進行說明。 SQL語句中的指
56、示變量前也必須加冒號,并且要緊跟在所指示的主變量之后。5、游標、游標在嵌入式SQL中引入了游標的概念,用它來協(xié)調(diào)兩種不同的數(shù)據(jù)處理方式。 游標游標實際上是系統(tǒng)為用戶開設(shè)的一個數(shù)據(jù)緩沖區(qū)和一個指針,緩沖區(qū)用來存放SQL語句的執(zhí)行結(jié)果,指針指向其中的一個元組。 每個游標都有一個名字。用戶可以通過游標逐一獲取記錄,并將記錄賦給主變量,由主變量做進一步處理。 游標的使用需要四條語句。聲明游標DECLARE CURSOR FOR ;打開游標OPEN ;取游標數(shù)據(jù)FETCH INTO , ,n;關(guān)閉游標CLOSE ;在在SQL語句中不必使用游標的有:語句中不必使用游標的有:變量說明語句;數(shù)據(jù)定義語句(DD
57、L);數(shù)據(jù)控制語句(DCL);查詢結(jié)果為單記錄的SELECT語句;數(shù)據(jù)插入語句(INSERT);非CURRENT形式的UPDATE語句;非CURRENT形式的DELETE語句;在在SQL語句中要使用游標的有:語句中要使用游標的有:查詢結(jié)果為多條記錄的SELECT語句;CURRENT形式的UPDATE語句;CURRENT形式的DELETE語句;3.7.2 舉例舉例 1、不使用游標的嵌入式SQL語句例3.34 從學(xué)生選課關(guān)系表S-C中刪除開課碼為某一給定值的元組。該開課碼由共享變量給出。 EXEC SQL DELETE FROM S-C WHERE CNO=:c_code; 將學(xué)生選課關(guān)系表S-C
58、中某個開課碼所對應(yīng)課程的成績均上調(diào)某個值。開課碼和上調(diào)的成績值由共享變量給出。 EXEC SQL UPDATE S-C SET GRADE=GRADE+:grade WHERE CNO=:c_code; 2、使用游標的嵌入式、使用游標的嵌入式SQL語句語句(1)當SELECT語句查詢出的結(jié)果為多條記錄時,就要使用游標了。例3.35 查詢學(xué)校所開設(shè)課程的全部信息 EXEC SQL BEGIN DECLARE SECTION; Char t_code(6),t_name(11),credit(2); Int time; Char p_code(6);EXEC SQL END DECLARE SEC
59、TION; /*共享變量說明*/ EXEC SQL DECLARE TX CURSOR FOR SELECT TNO,TNAME,CREDIT,HOURS,PTNOFROM T; /*聲明游標*/EXEC SQL OPEN TX; /*打開游標*/WHILE(1) /*用循環(huán)結(jié)構(gòu)逐條處理結(jié)果集中的記錄*/ EXEC SQL FETCH TX INTO :t_code,:t_name,:credit,:time,:p_code /*游標指針向前推進一行,從結(jié)果集中取當前行,送至相應(yīng)主變量*/ if (SQLCA.SQLSTATE!=00000) break; /* SQLSTATE不為全零,表示取數(shù)據(jù)出錯,退出循環(huán)。*/ /*由主語言語句對取出的數(shù)據(jù)進行處理*/ ;EXEC SQL CLOSE TX;(2)使用游標)使用游標當我們要對滿足條件的元組集合還要逐行地拿出來進行另外的條件判斷時(即所謂的CURRENT形式的UPDATE和DELETE語句),就要使用游標了。在游標處于活動狀態(tài)時,可以修改或刪
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 信息化技術(shù)在農(nóng)業(yè)生產(chǎn)中的合作協(xié)議
- 農(nóng)民工在崗培訓(xùn)與勞務(wù)派遣合同
- 購買物業(yè)管理服務(wù)協(xié)議書
- 農(nóng)業(yè)生產(chǎn)經(jīng)營資金互助保障協(xié)議
- 智慧寓言伊索寓言故事解讀
- 高考語文復(fù)習(xí):專題六、七
- 體育培訓(xùn)中心學(xué)員意外事故的免責(zé)及保障協(xié)議
- 高考文言文斷句100題專項練習(xí)(附答案及翻譯最方便)
- 小馬過河自我成長的故事解讀
- 農(nóng)業(yè)旅游開發(fā)手冊
- 2024年福建省廈門市翔安區(qū)殘疾人聯(lián)合會招聘殘疾人工作聯(lián)絡(luò)員29人歷年重點基礎(chǔ)提升難、易點模擬試題(共500題)附帶答案詳解
- 幼兒園家長會疾病預(yù)防
- 《儲糧害蟲防治技術(shù)》課件-第六章 儲糧保護劑及其應(yīng)用
- 排水管道施工組織設(shè)計排水管道施工組織設(shè)計排水施工排水管道施工施工設(shè)計
- 人工智能科普教育活動方案設(shè)計
- 2024未來會議:AI與協(xié)作前沿趨勢白皮書
- 2024年廣東普通專升本《公共英語》完整版真題
- 國家中長期科技發(fā)展規(guī)劃(2021-2035)
- 中國民族音樂的宮庭音樂
- 單原子催化劑的合成與應(yīng)用
- 水利工程施工驗收規(guī)范對工程監(jiān)理單位的要求
評論
0/150
提交評論