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

下載本文檔

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

文檔簡介

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

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

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

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

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

3.1.1表的定義、修改與撤消

1.表的定義

表的定義語句格式為:

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

其中:

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

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

●典型的<列的完整性約束>(a)NULL:指出該列可以為空值。(b)NOTNULL:指出該列不能為空值。每一個表中至少應(yīng)有一個列的可選項為NOTNULL。(c)PRIMARYKEY:指出該列名為表的主鍵。(d)DEFAULT:給所在的列設(shè)置一個缺省值。(e)CHECK:指出該列的值只能取CHECK約束條件范圍的值。例3.2創(chuàng)建圖1.30所示的教學(xué)管理數(shù)據(jù)庫系統(tǒng)中的學(xué)生關(guān)系表S,可用如下的表定義語句定義: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個或2個以上屬性組成時,表的主鍵必須由表的完整性約束給出。

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

<表的完整性約束>

(b)表的外鍵約束

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

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

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

<表的完整性約束>

(c)表檢驗CHECK約束

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

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

(1)改變表名

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

2.表的修改

(2)增加列

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

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

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

(3)刪除列

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

(4)修改列的定義

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

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

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

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

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

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

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

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

或:INSERTINTOSC

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

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

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

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

顯式提交:

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

命令格式:

3.2.1簡單查詢1.SELECT查詢語句

SQL查詢語句的基本格式為:SELECT<列名表>FROM<表名表>[WHERE<條件>]3.2.1簡單查詢2.無條件查詢

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

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

(1)COUNT(*)計算元組的個數(shù);

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

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

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

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

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

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

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

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

例3.22查詢選修了計算機網(wǎng)絡(luò)課(課程號為C403001)或信息安全技術(shù)課(課程號為C403002)的學(xué)生的學(xué)號。SELECT#SFROMSCWHEREC#=‘C403001’ORC#=‘C403002’;(關(guān)系表見下頁)學(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ù)庫系統(tǒng)的概念模式

表3.2邏輯運算符

運算符含義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ù)值型列的值限定在某個數(shù)值區(qū)間的比較查詢條件(<、<=、>、>=)可以用比較運算符“BETWEEN…AND”來表示,格式為:<數(shù)值型列名>BETWEEN<數(shù)值區(qū)間下限值>AND<數(shù)值區(qū)間上限值>例3.23的查詢可以改寫為:

SELECT*FROMS1WHEREAGEBETWEEN18AND25;5.分組查詢

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

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

(1)GROUPBY子句

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

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

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

(2)HAVING子句

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

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

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

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

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

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

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

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

日期是SQL語言中的標(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)前日期和時間取本月最后一天計算日期d之后第一周指定星期幾(由w_day指定)的日期取在日期d的基礎(chǔ)上后推n個月的日期計算日期d1和d2之間相差的月數(shù)將日期d的缺省格式“DD-MON-YYYY”表示成指定的新格式new_d表3.3常用的日期函數(shù)

例3.30查詢出生日期在1982年1月1日到1982年12月31日之間的所有學(xué)生的學(xué)號、姓名和出生日期,并按日期的遞增順序排列。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在上例中,出生日期的缺省顯示方式不符合我國的日期表示習(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)

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

3.2.2SQL語言中的常用函數(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的絕對值求大于等于數(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為空值的課程號。SELECTC#FROMSCWHEREGRADEISNULL;3.2.3SQL高級查詢技術(shù)1.多表聯(lián)接查詢(二元查詢/多元查詢)SELECTS.S#,SNAMEFROMS,SCWHERES.S#=SC.S#ANDC#=‘C401001’;例3.37查詢所有學(xué)習(xí)了數(shù)據(jù)結(jié)構(gòu)課(課程號為C401001)的學(xué)生的學(xué)號和姓名。例3.38查詢選修了“信息安全技術(shù)”課程的學(xué)生的學(xué)號與姓名。SELECTS.S#,SNAMEFROMS,SC,CWHERES.S#=SC.S#ANDSC.C#=C.C#ANDCNAME=‘信息安全技術(shù)’;3.2.3SQL高級查詢技術(shù)2.外聯(lián)接查詢

學(xué)號姓名性別出生年月籍貫專業(yè)代碼班級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長沙S0403200403專業(yè)代碼專業(yè)名稱S0401計算機科學(xué)S0402指揮自動化S0403網(wǎng)絡(luò)工程S0404信息研究學(xué)生關(guān)系S:專業(yè)關(guān)系SS注意:雖然存在信息研究專業(yè),但學(xué)生關(guān)系的當(dāng)前值中沒有信息研究專業(yè)的學(xué)生。

對于查詢:

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

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

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

由于信息研究專業(yè)沒有學(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子句中的等值條件表達式,則:(1)左外聯(lián)接的表示形式為R.A(+)=S.B,其含義是假設(shè)在等值條件右邊的關(guān)系S中有一個“全空”的元組,且該元組可與等值條件左邊的關(guān)系R中任何不滿足等值聯(lián)接條件的元組匹配構(gòu)成一個新的元組;(2)右外聯(lián)接的表示形式為R.A=S.B(+),其含義是假設(shè)在等值條件左邊的關(guān)系R中有一個“全空”的元組,且該元組可與等值條件右邊的關(guān)系S中任何不滿足等值聯(lián)接條件的元組匹配構(gòu)成一個新的元組。這時,上述的查詢語句:

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

就可以改寫成:

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

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

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

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

4.謂詞演算查詢

(1)IN和NOTIN謂詞

條件表達式格式為:<集合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)課(課程號為C401001)的學(xué)生的學(xué)號和姓名。SELECTS.S#,SNAMEFROMSWHERES#IN(SELECTS#FROMSCWHEREC#=‘C401001’);例3.41利用嵌套查詢實現(xiàn)例3.38,也即查詢選修了“信息安全技術(shù)”課程的學(xué)生的學(xué)號與姓名。SELECTS.S#,SNAMEFROMSWHERES#IN(SELECTS#FROMSCWHEREC#IN(SELECTC#FROMCWHERECNAME=‘信息安全技術(shù)’));思路:選修了“信息安全技術(shù)”課的課程號;選修了該課程(號)的學(xué)生的學(xué)號4.謂詞演算查詢

(2)ANY和SOME謂詞

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

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

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

(3)ALL謂詞

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

例3.43查詢考試成績大于網(wǎng)絡(luò)工程專業(yè)(專業(yè)代碼為S0403)所有學(xué)生的課程成績的學(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謂詞

條件表達式格式為:

EXISTS(<集合>)

NOTEXISTS(<集合>)

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

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

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

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

(1)并操作

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

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

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

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

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

(2)交操作

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

(3)差操作

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

[MINUS{SELECT語句}];

例3.48查詢沒有成績的學(xué)生的學(xué)號。SELECTS#FROMSMINUSSELECTS#FROMSC[WHEREGRADEISNOTNULL];

課堂綜合練習(xí):

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

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

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

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

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

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

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

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

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

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

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

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

視圖的定義語句格式為:

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

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

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

3.3.3在視圖上進行查詢操作

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

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

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

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

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

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

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

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

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

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

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

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

3.5.1嵌入式SQL的概念

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

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

宿主語言:在SQL嵌入形式中用到高級語言。

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

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

3.5.2嵌入式SQL遇到的問題

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

3.5.2嵌入式SQL遇到的問題

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

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

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

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

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

提供預(yù)編譯器;

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

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

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

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

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

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

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

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

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

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

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

EXECSQLSELECTSNAME,SSEX,SBIRTHINFROMS

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

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

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

是一個用來指示所指宿主變量的值或條件的整型變量。宿主變量利用指示變量賦空值或檢測是否是空值。

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

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

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

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

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

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

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

(1)問題的提出

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

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

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

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

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

(3)SQLCA返回的信息類別

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

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

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

WHENEVER語句:

WHENEVER語句格式:

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

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

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

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

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

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

EXECSQLENDDECLARESECTION;

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

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

EXECSQLCONNECT:uidIDENTIFIEDBY:pwd;

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

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

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

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

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

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

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論