第三章-數(shù)據(jù)庫(kù)系統(tǒng)原理與設(shè)計(jì)_第1頁(yè)
第三章-數(shù)據(jù)庫(kù)系統(tǒng)原理與設(shè)計(jì)_第2頁(yè)
第三章-數(shù)據(jù)庫(kù)系統(tǒng)原理與設(shè)計(jì)_第3頁(yè)
第三章-數(shù)據(jù)庫(kù)系統(tǒng)原理與設(shè)計(jì)_第4頁(yè)
第三章-數(shù)據(jù)庫(kù)系統(tǒng)原理與設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩151頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

“數(shù)據(jù)庫(kù)系統(tǒng)原理及應(yīng)用”課程第三章關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言SQL主講人:李俊山教授聯(lián)系方式:743419辦公地點(diǎn):訓(xùn)練樓516房間SQL語(yǔ)句的分類:

數(shù)據(jù)定義語(yǔ)句:用于定義數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu),包括定義基本表、定義視圖和定義索引。

數(shù)據(jù)查詢語(yǔ)句:用于按不同查詢條件實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的檢索查詢。

數(shù)據(jù)操縱語(yǔ)句:用于更改和操作表中的數(shù)據(jù),包括數(shù)據(jù)插入、數(shù)據(jù)修改、數(shù)據(jù)刪除及數(shù)據(jù)查詢。

數(shù)據(jù)控制語(yǔ)句:用于實(shí)現(xiàn)用戶授權(quán)、基本表和視圖授權(quán)、事務(wù)控制、完整性和安全性控制等。

3.1.1表的定義、修改與撤消

1.表的定義

表的定義語(yǔ)句格式為:

CREATETABLE<表名>(<列名1><數(shù)據(jù)類型>[<列1的完整性約束>][,<列名2><數(shù)據(jù)類型>[<列2的完整性約束>],……,<列名n><數(shù)據(jù)類型>[<列n的完整性約束>],[<表的完整性約束>]]);

其中:

●典型的<數(shù)據(jù)類型>

(a)CHAR(m):長(zhǎng)度為m的字符(串)型數(shù)據(jù),長(zhǎng)度不夠時(shí)用空白字符補(bǔ)充,不超過(guò)240。(b)VARCHAR(m):長(zhǎng)度小于等于m的字符(串)型數(shù)據(jù),長(zhǎng)度不夠時(shí)不補(bǔ)充其它字符。(c)INT/INTEGER:長(zhǎng)整型數(shù)據(jù)。(d)DATE:日期型數(shù)據(jù),形式為YYYY-MM-DD,分別表示年、月、日。其中:

●典型的<列的完整性約束>(a)NULL:指出該列可以為空值。(b)NOTNULL:指出該列不能為空值。每一個(gè)表中至少應(yīng)有一個(gè)列的可選項(xiàng)為NOTNULL。(c)PRIMARYKEY:指出該列名為表的主鍵。(d)DEFAULT:給所在的列設(shè)置一個(gè)缺省值。(e)CHECK:指出該列的值只能取CHECK約束條件范圍的值。例3.2創(chuàng)建圖1.30所示的教學(xué)管理數(shù)據(jù)庫(kù)系統(tǒng)中的學(xué)生關(guān)系表S,可用如下的表定義語(yǔ)句定義:CREATETABLES(S#CHAR(9)PRIMARYKEY,SNAMECHAR(10)NOTNULL,SSEXCHAR(2)CHECK(SSEXIN(′男′,′女′)),SBIRTHINDATENOTNULL,PLACEOFBCHAR(16),SCODECHAR(5)NOTNULL,CLASSCHAR(5)NOTNULL);其中:

<表的完整性約束>

(a)表的主鍵約束

格式為:PRIMARYKEY(<列名表>)當(dāng)該表的主鍵由2個(gè)或2個(gè)以上屬性組成時(shí),表的主鍵必須由表的完整性約束給出。

例3.3創(chuàng)建教學(xué)管理數(shù)據(jù)庫(kù)系統(tǒng)中的學(xué)習(xí)關(guān)系SC,可用如下的表定義語(yǔ)句定義:CREATETABLESC(S#CHAR(9),C#CHAR(7),GRADEINTDEFAULT(0),PRIMARYKEY(S#,C#));

<表的完整性約束>

(b)表的外鍵約束

格式為:FOREIGNKEY(<列名1>)REFERENCE<表名>(<列名2>)

本子句定義了一個(gè)列名為“<列名1>”的外鍵,它與表“<表名>”中的“<列名2>”相對(duì)應(yīng),且“<列名2>”在表“<表名>”中是主鍵。

例3.4教學(xué)管理數(shù)據(jù)庫(kù)系統(tǒng)中的學(xué)習(xí)關(guān)系SC,可重新用如下的表定義語(yǔ)句定義如下:CREATETABLESC(S#CHAR(9),C#CHAR(7),GRADEINTDEFAULT(0),PRIMARYKEY(S#,C#),F(xiàn)OREIGNKEY(C#)REFERENCESC(C#));

<表的完整性約束>

(c)表檢驗(yàn)CHECK約束

格式為:CHECK(<值的約束條件>)

表檢驗(yàn)約束CHECK子句的含義和格式與列檢驗(yàn)約束相同,所不同的是,表檢驗(yàn)約束CHECK子句是一個(gè)獨(dú)立的子句而不是子句中的一部分。表檢驗(yàn)約束CHECK子句中的<值的約束條件>不僅可以是一個(gè)條件表達(dá)式,而且還可以是一個(gè)包含SELECT語(yǔ)句的SQL語(yǔ)句。例3.5教學(xué)管理數(shù)據(jù)庫(kù)系統(tǒng)中的學(xué)習(xí)關(guān)系SC,還可用如下的表定義語(yǔ)句定義如下:CREATETABLESC(S#CHAR(9),C#CHAR(7),GRADEINTDEFAULT(0),PRIMARYKEY(S#,C#),F(xiàn)OREIGNKEY(C#)REFERENCESC(C#),CHECK(GRADEBETWEEN0AND100));2.表的修改

(1)改變表名

修改表名的語(yǔ)句格式為:RENAME<原表名>TO<新表名>;

2.表的修改

(2)增加列

在表的最后一列后面增加新的一列,但不允許將一個(gè)列插入到原表的中間。

增加列語(yǔ)句的格式為:ALTERTABLE<表名>ADD<增加的列名><數(shù)據(jù)類型>;例3.7給專業(yè)表SS增加一個(gè)新屬性NOUSE_COLUMN,設(shè)其數(shù)據(jù)類型為NUMERIC(8,1)。

語(yǔ)句應(yīng)為:ALTERTABLESSADDNOUSE_COLUMNNUMERIC(8,1);2.表的修改

(3)刪除列

刪除表中不再需要的列,語(yǔ)句格式為:ALTERTABLE<表名>DROP<刪除的列名>[CASCADE|RESTRICT];其中,可選項(xiàng)“[CASCADE|RESTRICT]”是刪除方式。當(dāng)選擇CASCADE時(shí),表示在刪除名為“<表名>”的表中的列“<刪除的列名>”時(shí),所有引用到該列的視圖或有關(guān)約束也一起被刪除;當(dāng)選擇RESTRICT時(shí),表示當(dāng)沒(méi)有視圖或有關(guān)約束引用列“<刪除的列名>”時(shí),該列才能被刪除,否則拒絕該刪除操作。例3.8刪除專業(yè)表SS中增加的屬性NOUSE_COLUMN的兩種刪除語(yǔ)句分別為:ALTERTABLESSDROPNOUSE_COLUMNCASCADE;ALTERTABLESSDROPNOUSE_COLUMNRESTRICT;2.表的修改

(4)修改列的定義

修改屬性列的定義語(yǔ)句只用于修改列的類型和長(zhǎng)度,列的名稱不能改變。當(dāng)表中已有數(shù)據(jù)時(shí),不能縮短列的長(zhǎng)度,但可以增加列的長(zhǎng)度。

修改列定義語(yǔ)句格式為:ALTERTABLE<表名>MODIFY<列名><新的數(shù)據(jù)類型及其長(zhǎng)度>;例3.8將專業(yè)表SS中的專業(yè)名稱SSNAME(30)修改為SSNAME(40),即長(zhǎng)度增加10。ALTERTABLESSMODIFYSSNAMEVARCHAR(40);3.表的撤銷

表的撤消就是將不再需要的表或定義有錯(cuò)誤的表刪除掉。當(dāng)一個(gè)表被撤消時(shí),該表中的數(shù)據(jù)也一同被撤消(刪除)。

撤消表的語(yǔ)句格式為:DROPTABLE<表名>[CASCADE|RESTRICT];其中,CASCADE表示在撤消表“<表名>”時(shí),所有引用這個(gè)表的視圖或有關(guān)約束也一起被撤消;RESTRICT表示在沒(méi)有視圖或有關(guān)約束引用該表的屬性列時(shí),表“<表名>”才能被撤消,否則拒絕該撤消操作。3.1.2數(shù)據(jù)的插入、修改、刪除、提交與撤消1.數(shù)據(jù)的插入

向表中插入一行數(shù)據(jù)的單元組值插入方式的INSERT語(yǔ)句格式為:INSERTINTO<表名>[(<列名表>)]

VALUES(<值表>);其中:(1)如果選擇可選項(xiàng)“[(<列名表>)]”,表示在插入一個(gè)新元組時(shí),只向由<列名i>指出的列中插入數(shù)據(jù),其他沒(méi)有列出的列不插入數(shù)據(jù)(為空值),且“<列名表>”中必須至少包括表中那些列約束為“NOTNULL”的列和主鍵列。如果不選擇該可選項(xiàng),則默認(rèn)表中所有的列都要插入數(shù)據(jù)。

(2)<值表>指出要插入列的具體值。如果選擇了可選項(xiàng)[<列名表>],則<值表>中的屬性列值必須與<列名表>中的屬性列名一一對(duì)應(yīng);如果沒(méi)有選擇可選項(xiàng)[<列名表>],則<值表>中的屬性列值必須與<列名表>中的屬性列名一一對(duì)應(yīng)。

例3.10給學(xué)習(xí)關(guān)系SC中插入王麗麗同學(xué)(學(xué)號(hào)為200401003)學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)課(課程號(hào)為C403001)的成績(jī)(89分)。INSERTINTOSC(S#,C#,GRADE)VALUES(’200401003’,’C403001’,89);

或:INSERTINTOSC

VALUES(’200401003’,’C403001’,89);3.1.2數(shù)據(jù)的插入、修改、刪除、提交與撤消2.數(shù)據(jù)的修改

語(yǔ)句格式為:UPDATE<表名>SET<列名1>=<表達(dá)式1>[,<列名2>=<表達(dá)式2>,…,<列名n>=<表達(dá)式n>][WHERE<條件>]其中,“<列名i>=<表達(dá)式i>”指出將列“<列名i>”的值修改成<表達(dá)式i>。可選項(xiàng)“[WHERE<條件>]”中的<條件>指定修改有關(guān)列的數(shù)據(jù)時(shí)所應(yīng)滿足的條件。當(dāng)不選擇該選項(xiàng)時(shí),表示修改表中全部元組中相應(yīng)列的數(shù)據(jù)。

例3.13將學(xué)生關(guān)系S中的學(xué)生名字“王麗麗”改為“王黎麗”。UPDATESSETSNAME=’王黎麗’WHERES#=’200401003’;例3.14將所有女同學(xué)的專業(yè)改為S0404。UPDATESSETSCODE=’S0404’WHERESSEX=’女’;

3.1.2數(shù)據(jù)的插入、修改、刪除、提交與撤消3.數(shù)據(jù)的刪除

語(yǔ)句格式為:DELETEFROM<表名>[WHERE<條件>]其中,可選項(xiàng)“[WHERE<條件>]”中的<條件>指定所刪元組應(yīng)滿足的條件。當(dāng)不選該可選項(xiàng)時(shí),表示刪除表中全部數(shù)據(jù)。例3.15在學(xué)生關(guān)系S中刪除學(xué)號(hào)為200403001的學(xué)生信息。DELETEFROMSWHERES#=‘200403001’;例3.16刪除專業(yè)關(guān)系中的全部信息。DELETEFROMSS;3.1.2數(shù)據(jù)的插入、修改、刪除、提交與撤消4.數(shù)據(jù)的提交

工作區(qū)概念:數(shù)據(jù)提交的概念:就是把用戶對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的更新結(jié)果永久地保存到數(shù)據(jù)庫(kù)中。

顯式提交:

隱式提交:3.1.2數(shù)據(jù)的插入、修改、刪除、提交與撤消5.數(shù)據(jù)的撤銷

命令格式:

3.2.1簡(jiǎn)單查詢1.SELECT查詢語(yǔ)句

SQL查詢語(yǔ)句的基本格式為:SELECT<列名表>FROM<表名表>[WHERE<條件>]3.2.1簡(jiǎn)單查詢2.無(wú)條件查詢

例3.17查詢教學(xué)管理數(shù)據(jù)庫(kù)中全部學(xué)生的基本信息。SELECT*FROMS;

例3.19查詢課程關(guān)系C中的記錄數(shù),也即開(kāi)課的總門數(shù)。SELECTCOUNT(*)FROMC;SQL語(yǔ)言中常用的聚合函數(shù)主要有:

(1)COUNT(*)計(jì)算元組的個(gè)數(shù);

(2)COUNT(列名)計(jì)算某一列中數(shù)據(jù)的個(gè)數(shù);

(3)COUNTDISTINCT(列名)計(jì)算某一列中不同值的個(gè)數(shù);

(4)SUM(列名)計(jì)算某一數(shù)據(jù)列中值的總和;

(5)AVG(列名)計(jì)算某一數(shù)據(jù)列中值的平均值;

(6)MIN(列名)求(字符、日期、屬性列)的最小值;(7)MAX(列名)求(字符、日期、屬性列)的最大值;例3.20計(jì)算所有學(xué)生所學(xué)課程的最高分?jǐn)?shù)、最低分?jǐn)?shù)和平均分?jǐn)?shù)。

SELECTMAX(GRADE),MIN(GRADE),AVG(GRADE)FROMSC;3.2.1簡(jiǎn)單查詢3.單條件查詢

例3.21查詢所有學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)課(課程號(hào)為C403001)的學(xué)生的學(xué)號(hào)和成績(jī)。

SELECTS#,GRADEFROMSCWHEREC#=‘C403001’;表3.1條件表達(dá)式中的關(guān)系比較符運(yùn)算符含義=!=或<>>>=<<=ISNULLISNOTNULL等于不等于大于大于等于小于小于等于是空值不是空值3.2.1簡(jiǎn)單查詢4.多條件查詢

例3.22查詢選修了計(jì)算機(jī)網(wǎng)絡(luò)課(課程號(hào)為C403001)或信息安全技術(shù)課(課程號(hào)為C403002)的學(xué)生的學(xué)號(hào)。SELECT#SFROMSCWHEREC#=‘C403001’ORC#=‘C403002’;(關(guān)系表見(jiàn)下頁(yè))學(xué)生關(guān)系模式:S(S#,SNAME,SSEX,SBIRTHIN,PLACEOFB,SCODE,CLASS)專業(yè)關(guān)系模式:SS(SCODE#,SSNAME)課程關(guān)系模式:C(C#,CNAME,CLASSH)設(shè)置關(guān)系模式:CS(SCODE#,C#)學(xué)習(xí)關(guān)系模式:SC(S#,C#,GRADE)教師關(guān)系模式:T(T#,TNAME,TSEX,TBIRTHIN,TITLEOF,TRSECTION,TEL)講授關(guān)系模式:TEACH(T#,C#)圖1.30圖1.9的教學(xué)管理數(shù)據(jù)庫(kù)系統(tǒng)的概念模式

表3.2邏輯運(yùn)算符

運(yùn)算符含義NOTANDOR邏輯非邏輯與邏輯或例3.23若有學(xué)生關(guān)系S1(S#,SNAME,SSEX,SAGE,PLACEOFB,SCODE,CLASS),即該學(xué)生關(guān)系中給出的不是出生年月,而是年齡。要求查詢年齡在21歲至25歲之間學(xué)生的基本信息。SELECT*FROMS1WHEREAGE>=18ANDAGE<=25;

上例中:這種把某數(shù)值型列的值限定在某個(gè)數(shù)值區(qū)間的比較查詢條件(<、<=、>、>=)可以用比較運(yùn)算符“BETWEEN…AND”來(lái)表示,格式為:<數(shù)值型列名>BETWEEN<數(shù)值區(qū)間下限值>AND<數(shù)值區(qū)間上限值>例3.23的查詢可以改寫(xiě)為:

SELECT*FROMS1WHEREAGEBETWEEN18AND25;5.分組查詢

在SQL語(yǔ)言中,把元組按某個(gè)或某些列上相同的值分組,然后再對(duì)各組進(jìn)行相應(yīng)操作的查詢方式稱為分組查詢。

分組查詢的語(yǔ)句格式為:SELECT<列名表>FROM<表名表>[WHERE<條件>][GROUPBY<列名表>[HAVING<分組條件>]];

(1)GROUPBY子句

GROUPBY子句用來(lái)將列的值分成若干組,從而控制查詢的結(jié)果排序。

例3.24計(jì)算各個(gè)同學(xué)的平均分?jǐn)?shù)。SELECT#S,AVG(GRADE)FROMSCGROUPBY#S;

例3.25計(jì)算每個(gè)專業(yè)的男、女生分別有多少人數(shù)。SELECTSCODE,SSEX,COUNT(*)FROMSGROUPBYSCODE,SSEX;

(2)HAVING子句

在數(shù)據(jù)查詢中,有時(shí)只希望選擇滿足一定條件的分組。一般是利用GROUPBY子句進(jìn)行分組,利用HAVING子句判斷分組應(yīng)滿足的條件。例3.26查詢學(xué)生總數(shù)超過(guò)300人的專業(yè)及其具體的總?cè)藬?shù)。

SELECTSCODE,COUNT(*)FROMSGROUPBYSCODEHAVINGCOUNT(*)>300;6.結(jié)果排序

通常,SELECT的查詢結(jié)果是按元組在數(shù)據(jù)庫(kù)中的存儲(chǔ)順序給出的。但有時(shí)用戶希望按照某種約定的順序給出查詢結(jié)果,ORDERBY子句可以實(shí)現(xiàn)查詢結(jié)果的排序顯示功能,其語(yǔ)句格式為:SELECT<列名表>FROM<表名表>[WHERE<條件>]

ORDERBY<列名>[ASC/DESC][,<列名>[,ASC/DESC]];例3.27按學(xué)號(hào)遞增的順序顯示學(xué)生的基本信息。SELECT*FROMSORDERBYS#ASC;例3.28按學(xué)號(hào)遞增、課程成績(jī)遞減的順序顯示學(xué)生的課程成績(jī)。

SELECTS#,C#,GRADEFROMSCORDERBYS#ASC,GRADEDESC;7.字符串的匹配

在WHERE子句的條件表達(dá)式中,實(shí)現(xiàn)兩個(gè)字符串的部分字符的相等比較。比較運(yùn)算符的格式為:

<列名>LIKE‘[字符串1]通配符[字符串2]’其中:(1)下劃線_:在字符串比較時(shí),如果有一個(gè)字符可以任意,則在該字符位置上用下劃線表示。(2)百分號(hào)%:在字符串比較時(shí),如果有一個(gè)長(zhǎng)度大于等于0子字符串可以任意,則在該子字符串位置上用百分號(hào)表示。例3.29查詢學(xué)生關(guān)系S中姓李的學(xué)生的學(xué)號(hào)和姓名。SELECTS#,SNAMEFROMSWHERESNAMELIKE‘李%’;8.比較完整的SELECT查詢語(yǔ)句

SELECT<列名或列表達(dá)式序列>FROM<表名表>[WHERE<條件>][GROUPBY<列名表>][HAVING<分組條件>]][ORDERBY<列名>[ASC/DESC][,<列名>[,ASC/DESC]]];3.2.2SQL語(yǔ)言中的常用函數(shù)及其使用方式1.日期型函數(shù)

日期是SQL語(yǔ)言中的標(biāo)準(zhǔn)數(shù)據(jù)類型(DATE)。

函數(shù)

功能sysdatelast_daynext_day(d,w_day)add_months(d,n)months_between(d1,d2)to_char(d,new_d)

取當(dāng)前日期和時(shí)間取本月最后一天計(jì)算日期d之后第一周指定星期幾(由w_day指定)的日期取在日期d的基礎(chǔ)上后推n個(gè)月的日期計(jì)算日期d1和d2之間相差的月數(shù)將日期d的缺省格式“DD-MON-YYYY”表示成指定的新格式new_d表3.3常用的日期函數(shù)

例3.30查詢出生日期在1982年1月1日到1982年12月31日之間的所有學(xué)生的學(xué)號(hào)、姓名和出生日期,并按日期的遞增順序排列。SELECTS#,SNAME,SBIRTHINFROMSWHERESBIRTHINBETWEEN‘1-JUN-1982’AND’31-DEC-1982’ORDERBYSBIRTHIN;表3.4常用的日期顯示格式

日期顯示格式(模式)示例缺省格式MM/DD/YYYYYY/MM/DDDYDDMONYYDayMonDD

23-FEB-9902/23/991999/02/23WED12JAN88WednesdayJan12

例3.31在上例中,出生日期的缺省顯示方式不符合我國(guó)的日期表示習(xí)慣,可用日期轉(zhuǎn)換函數(shù)函數(shù)to_char將其轉(zhuǎn)換成“年/月/日”的表示形式。SELECTS#,SNAME,to_char(SBIRTHIN,’YYYY”/”MM”/”DD’)FROMSWHERESBIRTHINBETWEEN‘1-JUN-1982’AND’31-DEC-1982’ORDERBYSBIRTHIN;2.字符串函數(shù)表3.5常用的字符串函數(shù)

函數(shù)

功能length(str)initcap(str)lower(str)upper(str)replace(str,str1,str2)substr(str,m,n)itrim(str)ascii(str)

求字符串的長(zhǎng)度將字符串str中的第一個(gè)字符轉(zhuǎn)換成大寫(xiě)字符將字符串str中的大寫(xiě)字母轉(zhuǎn)換成小寫(xiě)字母將字符串str中的小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)字符將字符串str中的所有str1換成str2從字符串str的第m個(gè)字符開(kāi)始取出n個(gè)字符截掉字符串str尾部的空格取字符串str的ASCII碼值

3.2.2SQL語(yǔ)言中的常用函數(shù)及其使用方式3.算術(shù)函數(shù)表3.6常用的算術(shù)函數(shù)

函數(shù)功能abs(n)ceil(n)floor(n)mod(m,n)power(m,n)round(n,m)sign(n)sqrt(n)求n的絕對(duì)值求大于等于數(shù)值n的最小整數(shù)求小于等于數(shù)值n的最大整數(shù)取余數(shù)。若n=0,則取m求m的n次方四舍五入,保留m位n=0,返回0;n>n,返回1;n<0,返回-1求n的平方

4.空值顯示與空值函數(shù)例3.33查詢學(xué)習(xí)關(guān)系SC中分?jǐn)?shù)GRADE為空值的課程號(hào)。SELECTC#FROMSCWHEREGRADEISNULL;3.2.3SQL高級(jí)查詢技術(shù)1.多表聯(lián)接查詢(二元查詢/多元查詢)SELECTS.S#,SNAMEFROMS,SCWHERES.S#=SC.S#ANDC#=‘C401001’;例3.37查詢所有學(xué)習(xí)了數(shù)據(jù)結(jié)構(gòu)課(課程號(hào)為C401001)的學(xué)生的學(xué)號(hào)和姓名。例3.38查詢選修了“信息安全技術(shù)”課程的學(xué)生的學(xué)號(hào)與姓名。SELECTS.S#,SNAMEFROMS,SC,CWHERES.S#=SC.S#ANDSC.C#=C.C#ANDCNAME=‘信息安全技術(shù)’;3.2.3SQL高級(jí)查詢技術(shù)2.外聯(lián)接查詢

學(xué)號(hào)姓名性別出生年月籍貫專業(yè)代碼班級(jí)200401001張華男14-dec-82北京S0401200401200401002李建平男20-aug-82上海S0401200401200401003王麗麗女02-feb-83上海S0401200401200402001楊秋紅女09-may-83西安S0402200402200402002吳志偉男30-jun-82南京S0402200402200402003李濤男25-jun-83西安S0402200402200403001趙曉艷女11-mar-82長(zhǎng)沙S0403200403專業(yè)代碼專業(yè)名稱S0401計(jì)算機(jī)科學(xué)S0402指揮自動(dòng)化S0403網(wǎng)絡(luò)工程S0404信息研究學(xué)生關(guān)系S:專業(yè)關(guān)系SS注意:雖然存在信息研究專業(yè),但學(xué)生關(guān)系的當(dāng)前值中沒(méi)有信息研究專業(yè)的學(xué)生。

對(duì)于查詢:

SELECTSS.SCODE#,SS.SSNAME,S#,SNAMEFROMSS,SWHERESS.SCODE#=S.SCODEORDERBYSCODE#;

有查詢結(jié)果:SCODESSNAMES#SNAME

S0401計(jì)算機(jī)科學(xué)200401001張華S0401計(jì)算機(jī)科學(xué)200401002李建平S0401計(jì)算機(jī)科學(xué)200401003王麗麗S0402指揮自動(dòng)化200402001楊秋紅S0402指揮自動(dòng)化200402002吳志偉S0402指揮自動(dòng)化200402003李濤S0403網(wǎng)絡(luò)工程200403001趙曉艷

由于信息研究專業(yè)沒(méi)有學(xué)生,所以查詢結(jié)果丟失了信息研究的專業(yè)信息,為此,SQL引入了外聯(lián)接查詢。

外聯(lián)接查詢包括:左外聯(lián)接和右外聯(lián)接。

(1)左外聯(lián)接(Left-outerJoin)

RS=(RS)∪(R1(?…?))其中:

R1=R-πR(RS)(2)右外聯(lián)接(Right-outerJoin)

RS=(RS)∪((?…?)S1)其中:S1=S-πS(RS)

外聯(lián)接查詢包括:左外聯(lián)接和右外聯(lián)接。

設(shè)“R.A=S.B”是WHERE子句中的等值條件表達(dá)式,則:(1)左外聯(lián)接的表示形式為R.A(+)=S.B,其含義是假設(shè)在等值條件右邊的關(guān)系S中有一個(gè)“全空”的元組,且該元組可與等值條件左邊的關(guān)系R中任何不滿足等值聯(lián)接條件的元組匹配構(gòu)成一個(gè)新的元組;(2)右外聯(lián)接的表示形式為R.A=S.B(+),其含義是假設(shè)在等值條件左邊的關(guān)系R中有一個(gè)“全空”的元組,且該元組可與等值條件右邊的關(guān)系S中任何不滿足等值聯(lián)接條件的元組匹配構(gòu)成一個(gè)新的元組。這時(shí),上述的查詢語(yǔ)句:

SELECTSS.SCODE#,SS.SSNAME,S#,SNAMEFROMSS,SWHERESS.SCODE#=S.SCODEORDERBYSCODE#;

就可以改寫(xiě)成:

SELECTSS.SCODE#,SS.SSNAME,S#,SNAMEFROMSS,SWHERESS.SCODE#(+)=S.SCODE#ORDERBYSCODE#;

查詢出的結(jié)果就包含了:S0404信息研究nullnull盡管信息研究專業(yè)沒(méi)有學(xué)生,但專業(yè)仍然存在!3.嵌套查詢

即:在SQL語(yǔ)言中,如果在一個(gè)SELECT語(yǔ)句的WHERE子句中嵌入了另一個(gè)SELECT語(yǔ)句,則稱為嵌套查詢。WHERE子句中的SELECT語(yǔ)句稱為子查詢。例3.39查詢張華同學(xué)(學(xué)號(hào)為200401001)的那個(gè)班的女同學(xué)的基本信息。SELECT*FROMSWHERECLASS=(SELECTCLASSFROMSWHERES#=‘200401001’)ANDSSEX=‘女’;4.謂詞演算查詢表3.7常用的謂詞操作符操作符說(shuō)明betweenAandBnotbetweenAandBlikeinnotinanysomeallexistsnotexists

某列的數(shù)值區(qū)間是[A,B]某列的數(shù)值區(qū)間在[A,B]外兩個(gè)字符串的部分字符相等,其余可以任意某列的某個(gè)值屬于集合成員中的一個(gè)成員某列的值不屬于集合成員中的任何一個(gè)成員某列的值滿足一個(gè)條件即可滿足集合中的某些值某列的值滿足子查詢中所有值的記錄總存在一個(gè)值滿足條件不存在任何值滿足條件

4.謂詞演算查詢

(1)IN和NOTIN謂詞

條件表達(dá)式格式為:<集合1>IN<集合2><集合1>NOTIN<集合2>

前者的含義:如果集合1中的數(shù)據(jù)是集合2中的成員,那么邏輯值為true,否則為false。

后者的含義:如果集合1中的數(shù)據(jù)不是集合2中的成員,那么邏輯值為true,否則為false。例3.40查詢所有學(xué)習(xí)了數(shù)據(jù)結(jié)構(gòu)課(課程號(hào)為C401001)的學(xué)生的學(xué)號(hào)和姓名。SELECTS.S#,SNAMEFROMSWHERES#IN(SELECTS#FROMSCWHEREC#=‘C401001’);例3.41利用嵌套查詢實(shí)現(xiàn)例3.38,也即查詢選修了“信息安全技術(shù)”課程的學(xué)生的學(xué)號(hào)與姓名。SELECTS.S#,SNAMEFROMSWHERES#IN(SELECTS#FROMSCWHEREC#IN(SELECTC#FROMCWHERECNAME=‘信息安全技術(shù)’));思路:選修了“信息安全技術(shù)”課的課程號(hào);選修了該課程(號(hào))的學(xué)生的學(xué)號(hào)4.謂詞演算查詢

(2)ANY和SOME謂詞

條件表達(dá)式格式為:<列數(shù)據(jù)>θANY<集合><列數(shù)據(jù)>θSOME<集合>其中,θ是算術(shù)比較運(yùn)算符<、<=、>、>=、=、!=。其含義是:比較運(yùn)算符θ左邊的數(shù)據(jù)與右邊集合中的某個(gè)或某些元素是否滿足θ運(yùn)算,滿足則為真,不滿足則為假。

在SQL語(yǔ)言中,ANY和SOME具有相同的含義,早期的版本用的是ANY,新的版本都改為SOME,有些商用數(shù)據(jù)庫(kù)版本的SQL語(yǔ)言中,同時(shí)保存了ANY和SOME兩個(gè)謂詞。

例3.42查詢所有學(xué)習(xí)了數(shù)據(jù)結(jié)構(gòu)課(課程號(hào)為C401001)的學(xué)生的學(xué)號(hào)和姓名。SELECTS.S#,SNAMEFROMSWHERES#=ANY(SELECTS#FROMSCWHEREC#=‘C401001’);其中,“=ANY”的作用相當(dāng)于IN。4.謂詞演算查詢

(3)ALL謂詞

條件表達(dá)式格式為:<列數(shù)據(jù)>θALL<集合>含義是:比較運(yùn)算符θ左邊的數(shù)據(jù)與右邊集合中的所有元素是否滿足θ運(yùn)算,滿足其邏輯值為true,不滿足其邏輯值為false。

例3.43查詢考試成績(jī)大于網(wǎng)絡(luò)工程專業(yè)(專業(yè)代碼為S0403)所有學(xué)生的課程成績(jī)的學(xué)生的基本信息。SELECTS.S#,SNAME,SSEX,SBIRTHIN,PLACEOFB,SCODE,CLASSFROMS,SCWHERES.S#=SC.S#ANDGRADE>ALL(SELECTGRADEFROMS,SCWHERES.S#=SC.S#ANDSCODE=’S0403’;

4.謂詞演算查詢

(4)EXISTS和NOTEXISTS謂詞

條件表達(dá)式格式為:

EXISTS(<集合>)

NOTEXISTS(<集合>)

前者的含義是:當(dāng)集合中至少存在一個(gè)元素(非空)時(shí),其邏輯值為true,否則為false;

后者的含義是:當(dāng)集合中不存在任何元素(為空)時(shí),其邏輯值為true,否則為false。

通常用于測(cè)試子查詢是否有返回結(jié)果。例3.44查詢所有學(xué)習(xí)了數(shù)據(jù)結(jié)構(gòu)課(課程號(hào)為C401001)的學(xué)生的學(xué)號(hào)和姓名。SELECTS.S#,SNAMEFROMSWHEREEXISTS(SELECT*FROMSCWHERESC.S#=S.S#ANDC#=‘C401001’);

直觀的意義為:查詢的是那些,在學(xué)習(xí)關(guān)系中存在所學(xué)課程為數(shù)據(jù)結(jié)構(gòu)的學(xué)生的學(xué)號(hào)和姓名。5.查詢結(jié)果的并、交、差操作

(1)并操作

即,指將兩個(gè)或多個(gè)SELECT語(yǔ)句的查詢結(jié)果組合在一起作為總的查詢結(jié)果輸出。語(yǔ)句格式為:

SELECT<列名表>FROM<表名表>[WHERE<條件>][UNION[ALL]{SELECT語(yǔ)句}…];

其中,如果不選擇可選項(xiàng)ALL,則在輸出總查詢結(jié)果時(shí)重復(fù)的行會(huì)自動(dòng)被取掉。如果選擇可選項(xiàng)ALL,則表示將全部行合并輸出,也即不取掉重復(fù)行。

例3.46合并學(xué)生關(guān)系和專業(yè)關(guān)系中的專業(yè)代碼。SELECTSCODE#FROMSUNIONSELECTSCODE#FROMSS;

5.查詢結(jié)果的并、交、差操作

(2)交操作

查詢結(jié)果的交操作是指將同時(shí)屬于兩個(gè)或多個(gè)SELECT語(yǔ)句的查詢結(jié)果作為總的查詢結(jié)果輸出。查詢結(jié)果交操作的基本數(shù)據(jù)單位是行。其語(yǔ)句格式為:SELECT<列名表>FROM<表名表>[WHERE<條件>][INTERSECT{SELECT語(yǔ)句}…];例3.47查詢有成績(jī)的學(xué)生的學(xué)號(hào)。SELECTS#FROMSINTERSECTSELECTS#FROMSC[WHEREGRADEISNOTNULL];5.查詢結(jié)果的并、交、差操作

(3)差操作

是指從第一個(gè)SELECT語(yǔ)句的查詢結(jié)果中去掉屬于第二個(gè)SELECT語(yǔ)句查詢結(jié)果的行作為總的查詢結(jié)果輸出。其語(yǔ)句格式為:SELECT<列名表>FROM<表名表>[WHERE<條件>]

[MINUS{SELECT語(yǔ)句}];

例3.48查詢沒(méi)有成績(jī)的學(xué)生的學(xué)號(hào)。SELECTS#FROMSMINUSSELECTS#FROMSC[WHEREGRADEISNOTNULL];

課堂綜合練習(xí):

1、查詢?nèi)繉W(xué)生的學(xué)號(hào)、姓名、所學(xué)課程號(hào)和成績(jī)。

2、查詢沒(méi)有選修任何課程的學(xué)生的學(xué)號(hào)和姓名。

3、找出選修了全部課程的學(xué)生的學(xué)號(hào)和姓名。

堂綜合練習(xí)答案:

1、查詢?nèi)繉W(xué)生的學(xué)號(hào)、姓名、所學(xué)課程號(hào)和成績(jī)。SELECTS.S#,SNAME,C#,GRADEFROMS,SCWHEREC#IN(SELECTC#FROMSCWHERES.S#=SC.S#);

堂綜合練習(xí)答案:

2、查詢沒(méi)有選修任何課程的學(xué)生的學(xué)號(hào)和姓名。SELECTS#,SNAMEFROMSWHERENOTEXISTS(SELECT*FROMSCWHERESC.S#=S.S#);

堂綜合練習(xí)答案:

3、找出選修了全部課程的學(xué)生的學(xué)號(hào)和姓名(沒(méi)有一們可他不選)。

SELECTS#,SNAMEFROMSWHERENOTEXISTS(SELECT*FROMCWHERENOTEXISTS(SELECT*FROMSCWHERESC.S#=S.S#ANDSC.C#=C.C#);

第三章第三次課3.3.1視圖的概念

視圖是由數(shù)據(jù)庫(kù)中滿足一定條件約束的數(shù)據(jù)組成的“虛表”,它可以由某個(gè)表中滿足一定條件的行組成,也可以由某個(gè)(或某些)表的某些列組成,還可以由若干個(gè)表經(jīng)過(guò)一定的運(yùn)算而形成。圖3.1視圖與基本表的映射關(guān)系視圖3視圖4視圖1視圖2表1表2表3表43.3.2視圖的定義

視圖的定義語(yǔ)句格式為:

CREATEVIEW<視圖名>[(<視圖列名表>)]AS<SELECT語(yǔ)句>[WITHREADONLY|WITHCHECKOPTION];其中,當(dāng)選擇[WITHREADONLY]可選項(xiàng)時(shí),表示該視圖被定義成一個(gè)只讀,不能進(jìn)行插入、刪除和修改操作。當(dāng)選擇[WITHCHECKOPTION]可選項(xiàng)時(shí),用戶必須保證每當(dāng)向該視圖中插入或更新數(shù)據(jù)時(shí),所插入或更新的數(shù)據(jù)能夠從該視圖查詢出來(lái)。

例3.49教學(xué)安排視圖:TA(C#,CNAME,CLASSH,TNAME,TRSECTION)的創(chuàng)建語(yǔ)句為:

CREATEVIEWTAASSELECTC#,CNAME,CLASSH,TNAME,TRSECTIONFROMC,TEACH,TWHEREC.C#=TEACH.C#ANDTEACH.T#=T.T#;其中,只有視圖名TA,沒(méi)有<視圖列名表>選項(xiàng)說(shuō)明視圖TA的列名表與SELECT語(yǔ)句中的列名表相同。例3.49(續(xù))平均成績(jī)視圖A_GRADE(S#,SNAME,AVG_GRADE)的創(chuàng)建語(yǔ)句為:CREATEVIEWA_GRADE(S#,SNAME,AVG_GRADE)ASSELECTS.S#,SNAME,AVG(GRADE)FROMS,SCWHERES.S#=SC.S#ANDGRADEISNOTNULL;GROUPBYS.S#ORDERBYS.S#;

3.3.3在視圖上進(jìn)行查詢操作

例3.50利用視圖A_GRADE查詢學(xué)生所學(xué)課程的平均成績(jī)。SELECT*FROMA_GRADE;

如果用查詢語(yǔ)句實(shí)現(xiàn)查詢學(xué)生所學(xué)課程的平均成績(jī),其查詢語(yǔ)句應(yīng)為:SELECTS.S#,SNAME,AVG(GRADE)FROMS,SCWHERES.S#=SC.S#ANDGRADEISNOTNULL;GROUPBYS.S#ORDERBYS.S#;3.3.4在視圖上進(jìn)行數(shù)據(jù)更新

在視圖上進(jìn)行數(shù)據(jù)更新操作(INSERT、DELETE、UPDATE)時(shí)應(yīng)注意以下幾點(diǎn):(1)如果某視圖是建立在多個(gè)表的基礎(chǔ)上,那么不允許對(duì)該視圖進(jìn)行更新操作。(2)如果在某視圖的定義中使用了GROUPBY子句和聚合函數(shù),那么不允許對(duì)該視圖進(jìn)行更新操作。(3)如果視圖是建立在單個(gè)表的基礎(chǔ)上,且視圖的屬性列個(gè)數(shù)與表的屬性列個(gè)數(shù)相同,或少于表的屬性列個(gè)數(shù)時(shí),且所少的列是表中可為空值(NULL)的列,則可在該視圖上進(jìn)行更新操作。3.3.6用戶視圖對(duì)數(shù)據(jù)庫(kù)設(shè)計(jì)和系統(tǒng)性能帶來(lái)的影響

(1)用戶視圖給數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的設(shè)計(jì)提供了極大的優(yōu)越性

用戶視圖的建立,會(huì)使在應(yīng)用程序中用到并反復(fù)出現(xiàn)的含有復(fù)雜關(guān)系聯(lián)接和投影的查詢語(yǔ)句被簡(jiǎn)單的視圖查詢語(yǔ)句所代替。這樣不僅簡(jiǎn)化了用戶接口,使應(yīng)用程序中的SQL語(yǔ)句變得簡(jiǎn)單明了,清晰可讀;而且可以使應(yīng)用程序員把編寫(xiě)應(yīng)用程序的主要精力集中在對(duì)數(shù)據(jù)的處理、分析和用戶界面的實(shí)現(xiàn)上,方便應(yīng)用程序的設(shè)計(jì)。3.3.6用戶視圖對(duì)數(shù)據(jù)庫(kù)設(shè)計(jì)和系統(tǒng)性能帶來(lái)的影響

(2)實(shí)現(xiàn)了數(shù)據(jù)庫(kù)的邏輯數(shù)據(jù)獨(dú)立性

由于不同的用戶具有不同用戶視圖,這樣就使一個(gè)用戶視圖的變化不會(huì)影響另一些用戶視圖。當(dāng)數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)(概念模型)或存儲(chǔ)結(jié)構(gòu)(存儲(chǔ)模型)發(fā)生變化時(shí),并且這些變化與某一或某些用戶的視圖無(wú)關(guān)時(shí),就不必改變?cè)撚脩舻膽?yīng)用程序;當(dāng)這些變化與某一或某些用戶的視圖有關(guān)時(shí),可通過(guò)改變基本表到用戶視圖之間的映射關(guān)系,也即通過(guò)重新定義用戶視圖而使用戶視圖保持不變或稍有變化,從而不必修改應(yīng)用程序或少量修改應(yīng)用程序。這樣就實(shí)現(xiàn)了數(shù)據(jù)庫(kù)的邏輯數(shù)據(jù)獨(dú)立性。3.3.6用戶視圖對(duì)數(shù)據(jù)庫(kù)設(shè)計(jì)和系統(tǒng)性能帶來(lái)的影響

(3)可起到了對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)進(jìn)行安全保護(hù)的作用

由于不同用戶具有不同的用戶視圖,這樣就使得在各個(gè)用戶視圖中只出現(xiàn)他自己關(guān)心的那部分?jǐn)?shù)據(jù),其它數(shù)據(jù)對(duì)他來(lái)說(shuō)是不能使用的。而且系統(tǒng)給用戶使用的是視圖而不是在數(shù)據(jù)庫(kù)中存儲(chǔ)有數(shù)據(jù)的表。這樣就起到了對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)進(jìn)行安全保護(hù)的作用。3.4.1數(shù)據(jù)插入操作(數(shù)據(jù)的導(dǎo)入)把從某個(gè)或某些表中查詢出的數(shù)據(jù)插入到另一個(gè)表中去。語(yǔ)句格式為:INSERTINTO<表名>[(<列名表>)])<子查詢>;

其中,<子查詢>是一個(gè)合法的SELECT查詢語(yǔ)句。例3.51設(shè)在教學(xué)管理數(shù)據(jù)庫(kù)系統(tǒng)中,要建立某些臨時(shí)表來(lái)輔助有關(guān)管理過(guò)程。若其中有一個(gè)臨時(shí)表用于暫存選修了“信息安全技術(shù)”課程的學(xué)生的學(xué)號(hào)、姓名、專業(yè)名稱和班級(jí),表的其格式為:S_C(S#,SNAME,SSNAME,CLASS)例3.51(續(xù))則將從有關(guān)表中查詢出的有關(guān)數(shù)據(jù)組成的記錄插入該表的插入語(yǔ)句為:INSERTINTOS_C(S#,SNAME,SSNAME,CLASS)SELECTS.S#,SNAME,SSNAME,CLASSFROMS,SSWHERESS.SCODE#=S.SCODEANDS#IN(SELECTS#FROMSCWHEREC#IN(SELECTC#FROMCWHERECNAME=‘信息安全技術(shù)’));例3.52設(shè)在教學(xué)管理數(shù)據(jù)庫(kù)系統(tǒng)中,有一個(gè)臨時(shí)表用于暫存平均成績(jī)大于等于80分的女同學(xué)的學(xué)號(hào)和平均成績(jī)。臨時(shí)表的格式為:S_AVG(S#,AVG_GRADE)則將從有關(guān)表中查詢出的有關(guān)數(shù)據(jù)組成的記錄插入該表的插入語(yǔ)句為:INSERTINTOS_AVG(S#,AVG_GRAGE)SELECTS#,AVG(GRADE)FROMSCWHERES#IN(SELECTS#FROMSWHERESSEX=‘女’)GROUPBYS#HAVINGAVG(GRADE)>=80;3.4.2數(shù)據(jù)更新操作用子查詢表示條件的數(shù)據(jù)更新操作。語(yǔ)句格式為:

UPDATE<表名>SET<列名1>=<表達(dá)式1>[,<列名2>=<表達(dá)式2>,…,<列名n>=<表達(dá)式n>]WHERE<條件>;

其中,WHERE條件中包含有SELECT查詢子句。例3.53為了加強(qiáng)對(duì)高水平尖子人才的重點(diǎn)培養(yǎng),學(xué)校擬將計(jì)算機(jī)應(yīng)用技術(shù)專業(yè)(專業(yè)代碼為:S0401)中,各門課程均在85分以上的學(xué)生單獨(dú)編為200400班,所以需要修改學(xué)生基本情況數(shù)據(jù)庫(kù)中的“班級(jí)”屬性。其實(shí)現(xiàn)語(yǔ)句為:UPDATESSETCLASS=‘200400’WHERESCODE=‘S0401’ANDS#IN(SELECTS#FROMSCWHEREGRADE>85);例3.54由于試題難度原因,需要將“計(jì)算機(jī)網(wǎng)絡(luò)”課的成績(jī)提高5%。其實(shí)現(xiàn)語(yǔ)句為:UPDATESCSETGRADE=GRADE*1.05WHEREC#IN(SELECTC#FROMCWHERECNAME=‘計(jì)算機(jī)網(wǎng)絡(luò)’);

3.5.1嵌入式SQL的概念

交互式SQL:是非過(guò)程語(yǔ)言,大多數(shù)語(yǔ)句的執(zhí)行都是獨(dú)立的,與上下文無(wú)關(guān)的;無(wú)法滿足絕大多數(shù)應(yīng)用所需的過(guò)程性要求。

嵌入式SQL:引入過(guò)程性結(jié)構(gòu)和把SQL語(yǔ)言嵌入到C、PASCAL等高級(jí)語(yǔ)言的機(jī)制。

宿主語(yǔ)言:在SQL嵌入形式中用到高級(jí)語(yǔ)言。

應(yīng)用程序:含有嵌入SQL語(yǔ)句的高級(jí)語(yǔ)言應(yīng)用程序稱為宿主應(yīng)用程序,簡(jiǎn)稱為宿主程序或應(yīng)用程序。3.5.2嵌入式SQL遇到的問(wèn)題

(1)當(dāng)SQL語(yǔ)言語(yǔ)句嵌入到C語(yǔ)言后,宿主程序中就包含了不屬于高級(jí)語(yǔ)言的一部分成份。換句話說(shuō),宿主程序不再是普通的高級(jí)語(yǔ)言源程序了,顯然也不能用通常的編譯、連接方式對(duì)其進(jìn)行處理。如何實(shí)現(xiàn)宿主程序的編譯是要解決的問(wèn)題之一。

3.5.2嵌入式SQL遇到的問(wèn)題

(2)SQL語(yǔ)言是非過(guò)程性語(yǔ)言,大多數(shù)SQL語(yǔ)句的執(zhí)行是獨(dú)立的,與上下文無(wú)關(guān)的。而C語(yǔ)言是過(guò)程性語(yǔ)言,程序的執(zhí)行機(jī)制是順序、分支和循環(huán),當(dāng)前語(yǔ)句的執(zhí)行與前面語(yǔ)句的執(zhí)行結(jié)果有關(guān),各語(yǔ)句的執(zhí)行是上下文有關(guān)的。那么,當(dāng)把SQL語(yǔ)句嵌入到C語(yǔ)言后,如何來(lái)確定SQL語(yǔ)句的執(zhí)行順序是要解決的問(wèn)題之一。

3.5.2嵌入式SQL遇到的問(wèn)題

(3)SQL語(yǔ)言語(yǔ)句中的屬性名是表示關(guān)系的屬性及其當(dāng)前值的集合型“參變量”。而C語(yǔ)言語(yǔ)句中的變量既有單值變量,又有數(shù)組變量。如何建立兩種語(yǔ)言變量之間聯(lián)系是要解決的問(wèn)題之一。(4)SQL語(yǔ)句是面向集合的,一次查詢的結(jié)果往往有許多行。而C語(yǔ)言的數(shù)據(jù)處理方式原則上是一次處理一個(gè)記錄的順序方式。如何使它們?cè)趯?duì)數(shù)據(jù)的保持和處理上相一致是要解決的問(wèn)題之一。3.5.3嵌入式SQL的實(shí)現(xiàn)

兩種實(shí)現(xiàn)途徑:

(1)建立全新的編譯程序,使之可直接編譯SQL語(yǔ)句;

(2)采用預(yù)處理方式,把宿主程序中的SQL語(yǔ)句轉(zhuǎn)換成可為高級(jí)語(yǔ)言調(diào)用的函數(shù)形式:

后一種途徑的實(shí)現(xiàn)需要:

提供預(yù)編譯器;

提供實(shí)現(xiàn)所有SQL語(yǔ)句的函數(shù)庫(kù)。3.5.3嵌入式SQL的實(shí)現(xiàn)(續(xù))

基于預(yù)處理方式的數(shù)據(jù)庫(kù)應(yīng)用程序從編寫(xiě)到執(zhí)行的過(guò)程為:

(1)編寫(xiě)包含有嵌入式SQL語(yǔ)句的宿主語(yǔ)言應(yīng)用程序;(2)利用預(yù)編譯器對(duì)應(yīng)用程序進(jìn)行預(yù)編譯,產(chǎn)生含有高級(jí)語(yǔ)言函數(shù)調(diào)用的“普通”高級(jí)語(yǔ)言源程序;(3)利用高級(jí)語(yǔ)言編譯器編譯由(2)生成的高級(jí)語(yǔ)言源程序,生成相應(yīng)的目標(biāo)文件;(4)對(duì)生成的目標(biāo)文件和所需的函數(shù)庫(kù)進(jìn)行連接,生成可執(zhí)行文件;(5)運(yùn)行可執(zhí)行文件形式的應(yīng)用程序。3.5.4SQL語(yǔ)句的嵌入形式

3.5.5宿主程序的組成與結(jié)構(gòu)

預(yù)編譯單元:在嵌入式SQL中,將宿主應(yīng)用程序中的一個(gè)源程序文件稱為一個(gè)預(yù)編譯單元。宿主程序的組成:具有與C語(yǔ)言一樣的組成結(jié)構(gòu),一個(gè)宿主應(yīng)用程序可以分成若干個(gè)源程序文件,每個(gè)源程序文件可以是一個(gè)獨(dú)立的預(yù)編譯單元,可以將這些經(jīng)過(guò)獨(dú)立預(yù)編譯的程序再分別獨(dú)立編譯,并生成各自的目標(biāo)文件,最后將這些目標(biāo)文件連接成一個(gè)完整的執(zhí)行文件。

3.5.5宿主程序的組成與結(jié)構(gòu)

預(yù)編譯單元的組成結(jié)構(gòu):

(1)說(shuō)明部分(DECLARE部分)(2)通信區(qū)定義部分(3)系統(tǒng)連接部分

(4)程序體程序首部程序體1.說(shuō)明部分(DECLARE部分)

(1)主語(yǔ)言變量、宿主變量、宿主變量的使用規(guī)則:主語(yǔ)言變量:宿主變量:在SQL語(yǔ)句中使用的主語(yǔ)言的變量稱為宿主變量。

例3.55根據(jù)由宿主變量S1給出的學(xué)生學(xué)號(hào),查詢、學(xué)生的姓名、性別和出生年月。

EXECSQLSELECTSNAME,SSEX,SBIRTHINFROMS

INTO:SNAME1,:SSEX1,:SBIRTHWHERES#=:S1;由本例說(shuō)明:宿主變量是主語(yǔ)言和SQL語(yǔ)句都可以對(duì)其賦值和引用其值的變量。

宿主變量的使用規(guī)則:

①宿主變量必須在DECLARE部分定義。②在SQL語(yǔ)句中使用宿主變量時(shí),必須在僅接宿主變量的前面寫(xiě)一個(gè)冒號(hào)“:”;在純C語(yǔ)言語(yǔ)句中使用宿主變量時(shí),與非宿主變量一樣不加任何標(biāo)記。③宿主變量不能是SQL語(yǔ)言中的保留字。④一個(gè)宿主變量在一條SQL語(yǔ)句中只能使用一次。⑤宿主變量可以帶指示變量。1.說(shuō)明部分(DECLARE部分)(續(xù))(2)指示變量

是一個(gè)用來(lái)指示所指宿主變量的值或條件的整型變量。宿主變量利用指示變量賦空值或檢測(cè)是否是空值。

指示變量的使用規(guī)則為:

①指示變量必須在DECLARE部分定義。②在SQL語(yǔ)句中使用指示變量時(shí),必須在僅接指示變量的前面寫(xiě)一個(gè)冒號(hào)“:”;在純C語(yǔ)言語(yǔ)句(也即,主語(yǔ)言)中使用指示變量時(shí),不用加任何標(biāo)記。③指示變量不能是SQL語(yǔ)言中的保留字。④指示變量必須定義成2字節(jié)的整型變量,如short,int類型。⑤在SQL語(yǔ)句中,指示變量必須緊跟在所指宿主變量之后,中間不能有逗號(hào)或空格。例3.56宿主變量帶有指示變量的例子。根據(jù)由宿主變量S1給出的學(xué)號(hào)查詢學(xué)生姓名、性別和出生年月。

EXECSQLSELECTSNAME,SSEX,SBIRTHINFROMSINTO:SNAME1:SNAME2,:SSEX1:SSEX2,

:SBIRTH:SBIRTH2WHERES#=:S1;1.說(shuō)明部分(DECLARE部分)(續(xù))(3)DECLARE的格式

用DECLARE定義宿主變量和指示變量的描述格式為:EXECSQLBEGINDECLARESECTION;<定義宿主變量和指示變量語(yǔ)句> EXECSQLENDDECLARESECTION;1.說(shuō)明部分(DECLARE部分)(續(xù))(4)作為宿主變量的指針和C語(yǔ)言一樣,宿主變量的指針是由星號(hào)“*”和變量名來(lái)說(shuō)明的。比如:EXECSQLBEGINDECLARESECTION;intGRADE1,GRADE2,*intptr;EXECSQLENDDECLARESECTION;但在SQL語(yǔ)句中,指針變量前不寫(xiě)星號(hào)(星號(hào)是隱含的),而要在變量名前加一個(gè)冒號(hào)“:”。比如:SELECTINT_PTRINTO:intptrFROM…1.說(shuō)明部分(DECLARE部分)(續(xù))(5)VARCHAR偽類型VARCHAR偽類型用于說(shuō)明稱為偽類型變量的變長(zhǎng)字符串。偽類型變量在DECLARE部分說(shuō)明后,就可以在宿主程序中被引用了。比如:EXECSQLBEGINDECLARESECTION;VARCHARuid[20];EXECSQLENDDECLARESECTION;相當(dāng)于定義了一個(gè)結(jié)構(gòu)體變量:struct{unsignedintlen;unsignedchararr[20];}uid;在C語(yǔ)言中對(duì)該結(jié)構(gòu)體變量的引用方式為:uid.len是無(wú)符號(hào)整數(shù)類型,用于表示(存放)偽類型變量定義的字符串的長(zhǎng)度。uid.arr用于表示(存放)偽類型變量定義的字符串。例3.57給出例3.56的語(yǔ)句中的主變量說(shuō)明。EXECSQLBEGINDECLARESECTION;VARCHARSNAME1[10],SSEX1[2],S1[9];dateSBIRTH;intSNAME2,SSEX2,SBIRTH2;EXECSQLENDDECLARESECTION;

(以上是例3.57的正確形式,注意改錯(cuò)!)

2.SQL通信區(qū)及其定義

(1)問(wèn)題的提出

在基于預(yù)處理的宿主語(yǔ)言中,宿主程序中的一條SQL語(yǔ)句的執(zhí)行實(shí)質(zhì)上是執(zhí)行一次函數(shù)調(diào)用,通過(guò)相應(yīng)的函數(shù)調(diào)用實(shí)現(xiàn)該SQL語(yǔ)句的功能。函數(shù)在執(zhí)行過(guò)程中可能出現(xiàn)各種情況,所以就引入了SQL通信區(qū)SQLCA,利用SQL通信區(qū)來(lái)返回函數(shù)調(diào)用的執(zhí)行狀態(tài)信息,在返回后根據(jù)返回信息,決定下一步的執(zhí)行流程或?qū)﹀e(cuò)誤的處理。

2.SQL通信區(qū)及其定義

(2)SQL通信區(qū)的定義

在宿主程序的相應(yīng)部分用加上語(yǔ)句:EXECSQLINCLUDESQLCA;

2.SQL通信區(qū)及其定義

(3)SQLCA返回的信息類別

①任務(wù)完成,一切正常;②任務(wù)完成,但有例外,也即有警告信息;③有某種錯(cuò)誤,任務(wù)沒(méi)有完成。

2.SQL通信區(qū)及其定義

(4)對(duì)SQLCA返回信息的判別方式

WHENEVER語(yǔ)句:

WHENEVER語(yǔ)句格式:

EXECSQLWHENEVER[SQLERROR|SQLWARING|NOTFOUND][STOP|CONTINUE|GOTO<語(yǔ)句標(biāo)號(hào)>];3.系統(tǒng)連接(數(shù)據(jù)庫(kù)登錄)CONNECT語(yǔ)句:CONNECT語(yǔ)句格式:

EXECSQLCONNECT:<用戶名>IDENTIFIEDBY:<口令>;或

EXECSQLCONNECT:<用戶名>/<口令>;4.程序體

在程序首部(DECLARE部分、SQL通信區(qū)、系統(tǒng)連接部分)之后,就是程序體。程序體是主語(yǔ)言語(yǔ)句和由“EXECSQL”為開(kāi)始標(biāo)識(shí)的SQL語(yǔ)句(DDL語(yǔ)句、DML語(yǔ)句、DCL語(yǔ)句)組成。例3.58宿主應(yīng)用程序系統(tǒng)連接(注冊(cè)登錄)示例。

#include<stdio.h>#include<string,h>

EXECSQLBEGINDECLARESECTION;/*說(shuō)明SQL變量*/VARCHARuid[10];/*uid中存放用戶名*/VARCHARpwd[8];/*pwd中存放口令*/

EXECSQLENDDECLARESECTION;

EXECSQLINCLUDESQLCA;/*說(shuō)明SQL通信區(qū)*/

Main(){strcpy(uid.arr,”scott”);/*初始化用戶名:scott*/uid.len=strlen(uid.arr)/*初始化uid的長(zhǎng)度值*/strcpy(pwd.arr,”tigger”);/*初始化口令:tigger*/pwd.len=strlen(pwd.arr);/*初始化pwd的長(zhǎng)度值*/

EXECSQLCONNECT:uidIDENTIFIEDBY:pwd;

/*注冊(cè)登錄數(shù)據(jù)庫(kù)*/Printf(“SuccessfullyconnectedtoSQL\n”);

EXECSQLCOMMITWORKRELEASE;/*提交并釋放數(shù)據(jù)庫(kù)*/exit(0);}3.5.6數(shù)據(jù)更新及其嵌入式SQL應(yīng)用程序設(shè)計(jì)

(1)數(shù)據(jù)的插入例3.59:向數(shù)據(jù)庫(kù)中已存在的課程關(guān)系表中插入一個(gè)記錄的應(yīng)用程序。

#include<stdio.h>#include<string.h>EXECSQLBEGINDECLARESECTION;/*說(shuō)明SQL變量*/VARCHARuid[10];/*uid中存放用戶名*/VARCHARpwd[8];/*pwd中存放口令*/VARCHARcnum[7];/*定義課程號(hào)CNUM為偽類型*/VARCHARcname[30];/*定義課程名CNAME為偽類型*/intclassh;/*定義學(xué)時(shí)數(shù)CLASSH為整型數(shù)*/EXECSQLENDDECLARESECTION;EXECSQLINCLUDESQLCA;/*說(shuō)明SQL通信區(qū)*/Main()Main(){strcpy(uid.arr,”scott”);/*初始化用戶名:scott*/uid.len=strlen(uid.arr);/*初始化uid的長(zhǎng)度值*/strcpy(pwd.arr,”tigger”);/*初始化口令:tigger*/pwd.len=strlen(pwd.arr);/*初始化pwd的長(zhǎng)度值*/

EXECSQLCONNECT:uidIDENTIFIEDBY:pwd;/*注冊(cè)登錄數(shù)據(jù)庫(kù)*/printf(“用戶‘%s’已成功地連接到數(shù)據(jù)庫(kù)!\n”,uid.arr);While(1){prinft(“\n\n輸入課程號(hào):”);scanf(”%s”,&cnum);cnum.len=strlen(cnum.arr);/*設(shè)置課程號(hào)CNUM的長(zhǎng)度*/prinft(“\n\n輸入課程名稱:”);scanf(”%s”,&cname);cname.len=strlen(cname.arr);/*設(shè)置課程名CNAME的長(zhǎng)度*/prinft(“\n\n輸入課程的學(xué)時(shí)數(shù):”);scanf(”%d”,&classh);

EXECSQLINSERTINTOC(C#,CNAME,CLASSH)VALUES(:cnum,:cname,:classh);EXECSQ

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論