版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第四章結(jié)構(gòu)化查詢語言SQL教學(xué)內(nèi)容:教學(xué)重點(diǎn):
SQL的數(shù)據(jù)查詢;
嵌入式SQL的使用。
SQL數(shù)據(jù)庫的體系結(jié)構(gòu),SQL的組成;
SQL的數(shù)據(jù)定義:SQL模式、基本表和索引的創(chuàng)建和撤銷;
SQL的數(shù)據(jù)查詢:SELECT語句的句法和使用;
SQL的數(shù)據(jù)更新:插入、刪除和修改語句;
視圖的創(chuàng)建和撤消,對視圖更新操作的限制;
嵌入式SQL:預(yù)處理方式,使用規(guī)定,使用技術(shù),動態(tài)SQL語句。
§1SQL概貌及特點(diǎn)一、SQL數(shù)據(jù)庫的體系結(jié)構(gòu)
SQL數(shù)據(jù)庫的體系結(jié)構(gòu)基本上也是三級模式結(jié)構(gòu)。
在SQL中:外模式對應(yīng)于視圖,
模式對應(yīng)于基本表,元組稱為“行”,屬性稱為“列”,
內(nèi)模式對應(yīng)于存儲文件。用戶1用戶2用戶3用戶4視圖1視圖2
外模式基本表1基本表2基本表3基本表4模式存儲文件1存儲文件2存儲文件3存儲文件4內(nèi)模式
二、SQL的組成
SQL主要分成四個部分:數(shù)據(jù)定義;數(shù)據(jù)操縱;數(shù)據(jù)控制;嵌入式SQL的使用。
三、SQL的主要特點(diǎn)
1.一體化;
2.兩種使用方式,統(tǒng)一的語法結(jié)構(gòu);
3.高度非過程化;
4.語言簡潔,易學(xué)易用。§2SQL的數(shù)據(jù)定義一、SQL模式的創(chuàng)建和撤消1.SQL模式的創(chuàng)建
CREATESCHEMA<模式名>AUTHORIZATION<用戶名>2.SQL模式的撤消
DROPSCHEMA<模式名>[CASCADE|RESTRICT]CREATEDATABASE<數(shù)據(jù)庫名>DROPDATABASE<數(shù)據(jù)庫名>
例:創(chuàng)建工程數(shù)據(jù)庫PROJECT
CREATEDATABASEPROJECT
例:撤消工程數(shù)據(jù)庫PROJECTDROPDATABASEPROJECT
例:創(chuàng)建學(xué)生數(shù)據(jù)庫STUDENT
CREATEDATABASESTUDENT
例:撤消學(xué)生數(shù)據(jù)庫STUDENT
DROPDATABASESTUDENT
二、基本表的創(chuàng)建、修改和撤消
1.基本表的創(chuàng)建
CREATETABLESQL
模式名.基本表名(列名類型,
……
完整性約束,
……)
完整性規(guī)則主要有三種:
主鍵子句(PRIMARYKEY);
檢查子句(CHECK);
外鍵子句(FOREIGNKEY)。SQL提供的基本數(shù)據(jù)類型:數(shù)值型:INTEGER長整數(shù)(也可寫成INT)
SMALLINT短整數(shù)
REAL取決于機(jī)器精度的浮點(diǎn)數(shù)
DOUBLEPRECISION取決于機(jī)器精度的雙精度浮點(diǎn)數(shù):FLOAT(n)浮點(diǎn)數(shù),精度至少為n位數(shù)字;
NUMERIC(p,d)定點(diǎn)數(shù),由p位數(shù)字(不包括符號、小數(shù)點(diǎn))組成,小數(shù)點(diǎn)后面有d位數(shù)字;
也可寫成:DECIMAL(P,d)或DEC(P,d))SQL提供的基本數(shù)據(jù)類型
字符串型:CHAR(n)長度為n的定長字符串
VARCHAR(n)具有最大長度為n的變長字符串位串型:
BIT(n)長度為n的二進(jìn)制位串
BITVARYING(n)最大長度為n的變長二進(jìn)制位時間型:DATE日期,包含年、月、日,YYYY—MM-DDTIME時間,包含時、分、秒,HH:MM:SS【例4.1】在有關(guān)工程項(xiàng)目的數(shù)據(jù)庫中,有四個關(guān)系,其結(jié)構(gòu)如下:供應(yīng)商關(guān)系:S(SNO,SNAME,SADDR)零件關(guān)系:P(PNO,PNAME,COLOR,WEIGHT)工程項(xiàng)目關(guān)系:J(JNO,JNAME,JCITY,BALANCE)供應(yīng)情況關(guān)系:SPJ(SNO,PNO,JNO,PRICE,QTY)例:工程項(xiàng)目數(shù)據(jù)庫PROJECT中有四個關(guān)系,其結(jié)構(gòu)如下:供應(yīng)商關(guān)系:
S(SNO,SNAME,SADDR)零件關(guān)系:
P(PNO,PNAME,COLOR,WEIGHT)工程項(xiàng)目關(guān)系:J(JNO,JNAME,JCITY,BALANCE)供應(yīng)情況關(guān)系:SPJ(SNO,PNO,JNO,PRICE,QTY)可用下列語句創(chuàng)建表S:CREATETABLES(SNOCHAR(4)NOTNULL,SNAMECHAR(20)NOTNULL,SADDRCHAR(20),
PRIMARYKEY(SNO));可用下列語句創(chuàng)建表P:
CREATETABLEP(PNOCHAR(4)NOTNULL,PNAMECHAR(20)NOTNULL,COLORCHAR(8),WEIGHTSMALLINT,PRIMARYKEY(PNO));可用下列語句創(chuàng)建表S:
CREATETABLEJ(JNOCHAR(4)NOTNULL,JNAMECHAR(20),JCITYCHAR(20),BALANCENUMERIC(7,2),PRIMARYKEY(JNO));可用下列語句創(chuàng)建表SPJ:CREATETABLESPJ(SNOCHAR(4)NOTNULL,PNOCHAR(4)NOTNULL,JNOCHAR(4)NOTNULL,PRICENUMERIC(7,2),QTYSMALLINT,PRIMARYKEY(SNO,PNO,JNO),FOREIGNKEY(SNO)REFERENCESS(SNO),FOREIGNKEY(PNO)REFERENCESP(PNO),FOREIGNKEY(JNO)REFERENCESJ(JNO),CONSTRAINTC_QTYCHECK(QTYBETWEEN0AND10000)【例4.1】在有關(guān)工程項(xiàng)目的數(shù)據(jù)庫中,有四個關(guān)系,其結(jié)構(gòu)如下:供應(yīng)商關(guān)系:S(SNO,SNAME,SADDR)零件關(guān)系:P(PNO,PNAME,COLOR,WEIGHT)工程項(xiàng)目關(guān)系:J(JNO,JNAME,JCITY,BALANCE)供應(yīng)情況關(guān)系:SPJ(SNO,PNO,JNO,PRICE,QTY)例:學(xué)生數(shù)據(jù)庫STUDENT中有三個關(guān)系,其結(jié)構(gòu)如下:學(xué)生關(guān)系:
S(SNO,SNAME,AGE,SEX,SDEPT)
課程關(guān)系:
C(CNO,CNAME,CDEPT,TNAME)
學(xué)習(xí)關(guān)系:SC(SNO,CNO,GRADE)可用下列語句創(chuàng)建表S:CREATETABLES(SNOCHAR(4)NOTNULL,SNAMECHAR(20)NOTNULL,AGECHAR(2),SEXCHAR(2),SDEPTCHAR(10),
PRIMARYKEY(SNO));可用下列語句創(chuàng)建表C:CREATETABLEC(CNOCHAR(4)NOTNULL,CNAMECHAR(20)NOTNULL,CDEPTCHAR(10),TNAMECHAR(8),PRIMARYKEY(CNO));主鍵子句主鍵子句可用下列語句創(chuàng)建表SC:CREATETABLESC(SNOCHAR(4)NOTNULL,CNOCHAR(4)NOTNULL,GRADENUMERIC(7,2),
PRIMARYKEY(SNO,CNO),
FOREIGNKEY(SNO)REFERENCESS(SNO),FOREIGNKEY(CNO)REFERENCESP(CNO),CONSTRAINTSC_GRADECHECK(GRADEBETWEEN0AND100));主鍵子句外鍵子句檢查子句2.基本表結(jié)構(gòu)的修改
增加新的屬性:
刪除原有的屬性:
ALTERTABLE基本表名ADD新屬性名新屬性類型例:在基本表S中增加一個電話號碼(TELE)屬性語句如下:
ALTERTABLESADDTELECHAR(12);ALTERTABLE基本表名DROP屬性名[CASCADE|RESTRICT]例:在表S中刪除電話號碼(TELE)屬性,并且將引用該屬性的所有視圖和約束也一起刪除,可用下列語句:
ALTERTABLESDROPTELECASCADE;
刪除指定的完整性約束條件,其句法如下:ALTERTABLE基本表名DROP約束名;例:在基本表SC中刪除對屬性GRADE的約束,可用下列語句:ALTERTABLESCDROPSC_GRADE;另外,可以用下列語句增加(即恢復(fù))對屬性GRADE的約束:ALTERTABLESPJADDCONSTRAINTSC_GRADECHECK(GRADEBETWEEN0AND100)3.刪除基本表刪除基本表可以用“DROPTABLE”語句刪除基本表。其句法如下:
DROPTABLE基本表[CASCADE|RESTRICT]此處的CASCADE和RESTRICT的語義同前面句法中的語義一樣。
在一個基本表刪除后,其所有數(shù)據(jù)也就丟失了,使用時要謹(jǐn)慎?!?SQL的數(shù)據(jù)查詢
SQL的數(shù)據(jù)查詢(SELECT語句)是SQL的核心內(nèi)容。一、SELECT語句的來歷在關(guān)系代數(shù)中最常用的式子是下列表達(dá)式:
πA1,…,An(σF(R1×…×Rm))
這里R1、…、Rm為關(guān)系,F(xiàn)是公式,A1、…、An為屬性。為此SQL設(shè)計成SELECT–FROM-WHERE句型:
SELECTA1,…,An FROMR1,…,Rm WHEREF
二、SELECT語句格式:
SELECT[DISTINCT]目標(biāo)表的列名(或)列表達(dá)式序列
FROM
基本表名(或)視圖名序列|表引用
[WHERE行條件表達(dá)式]
[GROUPBY
列名1序列[HAVING
組條件表達(dá)式]]
[ORDERBY
列名2[ASC|DESC]序列];整個語句的執(zhí)行過程如下:
2.選取滿足WHERE子句中給出的條件表達(dá)式的元組。3.按GROUP子句中指定列的值分組,同時提取滿足HAVING子句中組條件表達(dá)式的那些組。4.按SELECT子句中給出的列名或列表達(dá)式求值輸出。5.ORDER子句對輸出的目標(biāo)表進(jìn)行排序,按附加說明ASC升序排列,
或按DESC降序排列。1.讀取FROM子句中基本表、視圖的數(shù)據(jù),執(zhí)行笛卡爾積操作。SELECT語句中:
WHERE子句稱為“行條件子句”,
GROUP子句稱為“分組子句”,
HAVING子句稱為“組條件子句”,
ORDER子句稱為“排序子句”。
在WHERE子句的行條件表達(dá)式中可使用下列運(yùn)算符:
算術(shù)比較運(yùn)算符:<,<=,>,>=,=,<>或?。剑?/p>
邏輯運(yùn)算符:AND,OR,NOT;
集合成員資格運(yùn)算符:IN,NOTIN;
謂詞:EXISTS,ALL,SOME,UNIQUE;
聚合函數(shù):AVG,MIN,MAX,SUM,COUNT;
集合運(yùn)算符:UNION,INTERSECT,EXCEPT。
3.舉例(板書舉例)
舉例:假設(shè)學(xué)生數(shù)據(jù)庫中的關(guān)系模式如下:
S(SNO,SNAME,AGE,SEX,SDEPT)
C(CNO,CNAME,CDEPT,TNAME)
SC(SNO,CNO,GRADE)試用SQL表達(dá)下列每個查詢語句。.
檢索選修課程號為C2的學(xué)生的學(xué)號和成績。SELECTSNO,GRADE
FROMSCWHERE
CNO='C2';2.檢索計算機(jī)軟件、姓“李”的全體男同學(xué)的學(xué)號、姓名和出生年份。SELECT
SNO,SNAME,2020-AGEAS
BIRTH_YEAR
FROMSWHERE
SNAMELIKE
'李%'
AND
SDEPT='計算機(jī)軟件'AND
SEX='男';LIKE謂詞的一般形式是:列名LIKE字符串常數(shù)其中:列名的類型必須是字符串或可變字符串。字符串常數(shù)中通配符的含義如下:%(百分號):表示可以與任意長度的字符串匹配。_(下劃線):表示可以與任意單個字符匹配。所有其他的字符只代表自己。別名3.檢索選修課程號為C4的學(xué)生的學(xué)號和姓名。第一種方法:連接查詢
SELECTS.SNO,SNAMEFROMS,SCWHERES.SNO=SC.SNOANDCNO='C4';第二種方法:嵌套查詢①
SELECTS.SNO,SNAMEFROMSWHERE
SNOIN
(SELECTSNOFROMSCWHERECNO='C4’);第二種方法:嵌套查詢②相關(guān)子查詢)
SELECTS.SNO,SNAMEFROMSWHERE
'C4'IN(SELECTCNOFROMSCWHERES.SNO=SC.SNO);第三種方法:使用存在量詞的嵌套SELECTS.SNO,SNAMEFROMSWHEREEXISTS(SELECT*FROMSCWHERES.SNO=SC.SNOANDSC.CNO='C4’);-外層查詢-內(nèi)層查詢(即:子查詢)子查詢依賴于外層查詢子查詢依賴于外層查詢SELECTS.SNO,SNAMEFROMSWHERESNOIN(SELECTSNOFROMSCWHERECNOIN(SELECTCNOFROMCWHERECNAME='數(shù)據(jù)庫原理'));4.檢索選修課程名為“數(shù)據(jù)庫原理”的學(xué)生的學(xué)號和姓名。--首先在C表中找出數(shù)據(jù)庫原理課程的課程號--然后在SC表中找出選了該課程的學(xué)生的學(xué)號--最后在S表中找出這些學(xué)生的姓名SELECTX.SNOFROMSCX,SCYWHEREX.SNO=Y.SNOANDX.CNO='C2'ANDY.CNO='C4';5.檢索選修課程號為C2和C4的學(xué)生的學(xué)號。或:SELECTX.SNOFROM(SELECTSNOFROMSCWHERECNO='C2')X,(SELECTSNOFROMSCWHERECNO='C4')YWHEREX.SNO=Y.SNO;派生表自身聯(lián)接6.檢索沒有選修C2課程的學(xué)生的姓名和年齡。SELECTSNAME,AGEFROMSWHERENOTEXISTS(SELECT*FROMSCWHERESC.SNO=S.SNOANDSC.CNO='C2');----找這樣的學(xué)生----不存在---他(即找的這個學(xué)生)---選了‘C2’課程假設(shè):cno:表示課程;
p(cno):表示“選修了課程cno”;
p(cno):表示“沒有選修課程cno”形式化表示:
(
cno)p(cno)≡
(
cno)(
p(cno))變換后的語義:
找這樣的學(xué)生SNO,不存在一門課程,他沒有選修。7.檢索選修了全部課程的學(xué)生的姓名。--查詢變換依據(jù):
7.檢索選修了全部課程的學(xué)生的姓名。--
變換為:找這樣的學(xué)生SNO,不存在一門課程,他沒有選修。SELECTSNAMEFROMSWHERENOTEXISTS(SELECT*FROMCWHERENOTEXISTS(SELECT*FROMSCWHERESC.SNO=S.SNOANDSC.CNO=C.CNO));----找這樣的學(xué)生----不存在一門課程他沒有--選修8.檢索至少選修了學(xué)生S2所選修的全部課程的學(xué)生的學(xué)號。變換表達(dá)形式:找這樣的學(xué)生SNO,對所有的課程CNO,只要學(xué)生S2選修了,那么學(xué)生SNO也選修了這些課程CNO。形式化表示:(
cno)p(cno)
q(cno)其中:cno:表示課程;
p(cno):表示“學(xué)生S2選修了課程cno”;
q(cno):表示“學(xué)生SNO選修了課程cno”
≡
(
cno)(
(p(cno)
q(cno)))≡
(
cno)(
(
p(cno)∨q(cno)))≡
(
cno)(p(cno)∧
q(cno))變換后的語義:找這樣的學(xué)生SNO,不存在一門課程cno,學(xué)生S2選修了,而學(xué)生sno沒選。SELECTDISTINCTSNOFROMSCXWHERENOTEXISTS(SELECT*FROMSCYWHEREY.SNO='S2'AND
NOTEXISTS(SELECT*FROMSCZWHEREZ.SNO=X.SNOANDZ.CNO=Y.CNO));8.檢索至少選修了學(xué)生S2所選修的全部課程的學(xué)生的學(xué)號。----找這樣的學(xué)生----不存在一門課程---學(xué)生S2選了而這個學(xué)生沒選SELECTDISTINCTSNOFROMSCXWHERENOTEXISTS(SELECT*FROMSCYWHEREY.SNO='S2'AND
NOTEXISTS(SELECT*FROMSCZWHEREZ.SNO=X.SNOANDZ.CNO=Y.CNO));8.檢索至少選修了學(xué)生S2所選修的全部課程的學(xué)生的學(xué)號。----找這樣的學(xué)生----不存在一門課程---學(xué)生S2選了而這個學(xué)生沒選如要在結(jié)果集中不包含學(xué)生S2的SQL語句如下:SELECTDISTINCTSNO
FROM
(SELECT*FROMSCWHERESNO<>'S2')XWHERENOTEXISTS(SELECT*FROMSCYWHEREY.SNO='S2'ANDNOTEXISTS(SELECT*FROMSCZWHEREZ.SNO=X.SNOANDZ.CNO=Y.CNO));四、聚合函數(shù)
SQL提供了下列聚合函數(shù):
COUNT(*)計算元組的個數(shù)
COUNT(列名)對一列中的值計算個數(shù)
SUM(列名)求某一列值的總和(此列的值必須是數(shù)值)
AVG(列名)求某一列值的平均值(此列的值必須是數(shù)值)
MAX(列名)求某一列值的最大值
MIN(列名)求某一列值的最小值舉例:1.檢索年齡最大的學(xué)生的姓名和性別。SELECTSNAME,SEXFROMSWHEREAGE=(SELECTMAX(AGE)FROMS);2.檢索選修兩門以上課程的學(xué)生的學(xué)號。SELECTSNO,COUNT(*)COUNTFROMSCGROUPBYSNOHAVINGCOUNT(*)>2;
SELECTS.SNO學(xué)號,SNAME姓名,COUNT(CNO)課程門數(shù)
FROMSC,SWHERES.SNO=SC.SNO GROUPBYS.SNO,SNAME HAVINGCOUNT(*)>2 ORDERBY3DESC,1;3.統(tǒng)計每個學(xué)生選修課程的門數(shù)(超過2門的學(xué)生才統(tǒng)計)。
要求顯示學(xué)生的學(xué)號、姓名和選修課程門數(shù),查詢結(jié)果按門數(shù)降序排列,若門數(shù)相同,按學(xué)號升序排列:
SELECT語句的語義通常有三種情況(SQL標(biāo)準(zhǔn)):
以學(xué)生表S(SNO,SNAME,AGE,SEX,SDEPT)為例說明。第一種情況:SELECT語句中未使用分組子句,也未使用聚合操作,那么SELECT子句的語義是對查詢的結(jié)果執(zhí)行投影操作。如: SELECTSNO,SNAMEFROMSWHERESEX='男';第二種情況:SELECT語句中未使用分組子句,但在SELECT子句中使用了聚合操作,此時SELECT子句的語義是對查詢結(jié)果執(zhí)行聚合操作。如:
SELECTCOUNT(*)count_男,AVG(CAST(S.AGEASINT))avg_ageFROMSWHERESEX='男’;
該語句是求男同學(xué)的人數(shù)和平均年齡(假設(shè)AVG為字符型)第三種情況:SELECT語句使用了分組子句和聚合操作,此時SELECT子句的語義是對查詢結(jié)果的每一分組去做聚合操作。如:SELECTAGE,COUNT(*)countFROMSWHERESEX='男'GROUPBYAGE;
該語句是求男同學(xué)每一年齡的人數(shù)。
五.聯(lián)接操作
聯(lián)接條件可在WHERE中指定,也可以在FROM子句中指定。
在FROM子句中指定聯(lián)接條件時,SQL2開始將聯(lián)接操作符分成:
聯(lián)接類型、聯(lián)接條件。聯(lián)接類型:決定了如何處理聯(lián)接條件中不匹配的元組。聯(lián)接條件:決定了兩個關(guān)系中哪些元組應(yīng)該匹配。聯(lián)接類型中的OUTER字樣可不寫。聯(lián)接類型聯(lián)接類型說明INNERJOIN內(nèi)聯(lián)接:LEFTOUTERJOIN左外聯(lián)接:RIGHTOUTERJOIN右外聯(lián)接:FULLOUTERJOIN完全外聯(lián)接:CROSSJOIN交叉聯(lián)接:
結(jié)果為兩個聯(lián)接表中匹配行的聯(lián)接。
結(jié)果包括“左”表(出現(xiàn)在JOIN子句的最左邊)中的所有行。不包括右表中的不匹配行。
結(jié)果包括“右”表(出現(xiàn)在JOIN子句的最右邊)中的所有行。不包括左表中的不匹配行。結(jié)果包括所有聯(lián)接表中的所有行,不論它們是否匹配
結(jié)果包括兩個聯(lián)接表中所有可能的行組合。交叉聯(lián)接返回的是兩個表的笛卡兒積ABCabcbbfcadBCDbcdbceadbefg關(guān)系R關(guān)系SABCDabcdabcecadbbbfnullnullefgRSABCDabcdabcecadbbbfnullRSABCDabcdabcecadbnullefgRS聯(lián)接條件聯(lián)接條件說明ON聯(lián)接條件具體列出兩個關(guān)系在哪些相應(yīng)屬性上做聯(lián)接條件比較。聯(lián)接條件應(yīng)寫在聯(lián)接類型的右邊。例1:統(tǒng)計每個學(xué)生選修課程的門數(shù)(超過2門的學(xué)生才統(tǒng)計)。要求顯示學(xué)生的學(xué)號、姓名和選修門數(shù),查詢結(jié)果按門數(shù)降序排列,若門數(shù)相同,按學(xué)號升序排列:
SELECTS.SNO,SNAME,COUNT(CNO)ASCOUNTERFROMS,SCWHERES.SNO=SC.SNOGROUPBYS.SNO,SNAMEHAVINGCOUNT(*)>2ORDERBY3DESC,1;
SELECTS.SNO,SNAME,COUNT(CNO)ASCOUNTERFROMS,SCWHERES.SNO=SC.SNOGROUPBYS.SNO,SNAMEHAVINGCOUNT(*)>2ORDERBY3DESC,1;SELECTS.SNO,S.SNAME,COUNT(SC.CNO)ASCOUNTERFROMSINNERJOINSCONSC.SNO=S.SNOGROUPBYS.SNO,S.SNAMEHAVING(COUNT(*)>2)ORDERBYCOUNT(SC.CNO)DESC,S.SNO內(nèi)連接
SELECT*FROMSFULLOUTERJOIN(SELECT*FROMSCWHERESC.CNO='C3')SC1ONS.SNO=SC1.SNO
SELECT*FROMSINNERJOINSCONS.SNO=SC.SNOWHERE(SC.CNO=‘C3')例2:檢索選修了課程號為C3的學(xué)生的情況。為顯示更多的信息:
SELECT*FROMSFULLOUTERJOIN(SELECT*FROMSCWHERESC.CNO='C3')SC1ONS.SNO=SC1.SNO
SELECT*FROMSINNERJOINSCONS.SNO=SC.SNOWHERE(SC.CNO=‘C3')例2:檢索選修了課程號為C3的學(xué)生的情況。為顯示更多的信息:§4SQL的數(shù)據(jù)更新
SQL的數(shù)據(jù)更新包括:數(shù)據(jù)插入、修改數(shù)據(jù)和數(shù)據(jù)刪除等操作。
一、數(shù)據(jù)插入
1.插入單個元組:
INSERTINTO
基本表名(列名表)
VALUES
(元組值)
例:
INSERTINTOSC(SNO,CNO)
VALUES(‘S3’,‘C3’)
2.插入子查詢的結(jié)果:
INSERTINTO
基本表名(列名表)
SELECT
查詢語句;例:
CREATETABLES_AVG_GRADE(SNOCHAR(4),AVGGRADENUMERIC(7,2));
INSERTINTOS_AVG_GRADE
SELECTSNO,AVG(GRADE)
FROMSC
GROUPBYSNO;
二、數(shù)據(jù)刪除刪除關(guān)系中滿足條件的元組語句的句法如下:
DELETEFROM<表名>
WHERE<條件表達(dá)式>舉例:例:把課程名為”數(shù)據(jù)結(jié)構(gòu)”的選課從表SC中刪除.
DELETEFROMSCWHERE
CNOIN(SELECTCNOFROMCWHERECNAME='數(shù)據(jù)結(jié)構(gòu)');
三、數(shù)據(jù)修改
UPDATE
基本表名
SET列名=值表達(dá)式[,列名=值表達(dá)式…][WHERE條件表達(dá)式]例:把課程名為”數(shù)據(jù)庫原理”的成績提高10%.
UPDATESCSETGRADE=1.1*GRADE
WHERE
CNOIN(SELECTCNOFROMCWHERECNAME='數(shù)據(jù)庫原理');
§5
視圖操作
在SQL中,外模式一級數(shù)據(jù)結(jié)構(gòu)的基本單位是視圖(View)。視圖是從若干基本表和(或)其他視圖構(gòu)造出來的表。在創(chuàng)建一個視圖時,系統(tǒng)把視圖的定義存放在數(shù)據(jù)字典中,而不存儲視圖對應(yīng)的數(shù)據(jù),在用戶使用視圖時才去求對應(yīng)的數(shù)據(jù)。
視圖被稱為“虛表”。一、
視圖的創(chuàng)建
CREATEVIEW<視圖名>(列名表)
AS<SELECT查詢語句>例1:在基本表SC上,建立一個學(xué)生學(xué)習(xí)情況視圖,內(nèi)容包括:學(xué)號、選修課程門數(shù)、平均成績。CREATEVIEWS_GRADE(SNO,C_NUM,AVG_GRADE) AS(SELECTSNO,COUNT(CNO),AVG(GRADE) FROMSC GROUPBYSNO);例2:在基本表SC上,建立一個學(xué)生學(xué)習(xí)成績等級視圖:CREATEVIEW
SC_等級(SNO,SNAME,CNO,CNAME,成績等級)AS(SELECTS.SNO,SNAME,C.CNO,CNAME,
成績等級=CASE
WHENGRADEISNULLTHEN'未登分'WHENGRADE<60THEN'不及格'
WHENGRADE>=60ANDGRADE<70THEN'及格'
WHENGRADE>=70ANDGRADE<80THEN'中'
WHENGRADE>=80ANDGRADE<90THEN'良'ELSE'優(yōu)'ENDFROMSINNERJOINSCONS.SNO=SC.SNOINNERJOINCONSC.CNO=C.CNO)例2:在基本表SC上,建立一個學(xué)生學(xué)習(xí)成績等級視圖:CREATEVIEW
SC_等級(SNO,SNAME,CNO,CNAME,成績等級)AS(SELECTS.SNO,SNAME,C.CNO,CNAME,
成績等級=CASE
WHENGRADEISNULLTHEN'未登分'WHENGRADE<60THEN'不及格'
WHENGRADE>=60ANDGRADE<70THEN'及格'
WHENGRADE>=70ANDGRADE<80THEN'中'
WHENGRADE>=80ANDGRADE<90THEN'良'ELSE'優(yōu)'ENDFROMSINNERJOINSCONS.SNO=SC.SNOINNERJOINCONSC.CNO=C.CNO)二、視圖的撤消
DROPVIEW
視圖名例:撤消S_GRADE視圖,可用下列語句實(shí)現(xiàn):
DROPVIEWS_GRADE;三、視圖的查詢
系統(tǒng)在實(shí)現(xiàn)對視圖的查詢時,根據(jù)數(shù)據(jù)字典的定義將對視圖的查詢轉(zhuǎn)換為對基本表的查詢。例:對學(xué)生學(xué)習(xí)情況視圖執(zhí)行如下操作:① SELECT*FROMS_GRADE;
相應(yīng)的查詢轉(zhuǎn)換操作如下:
SELECTSNO,COUNT(CNO)ASC_NUM,AVG(GRADE)ASAVG_GRADEFROMSCGROUPBYSNO;② SELECTSNO,C_NUM FROMS_GRADE
WHEREAVG_GRADE>80;
相應(yīng)的查詢轉(zhuǎn)換操作如下:SELECTSNO,COUNT(CNO)ASC_NUMFROMSCGROUPBYSNO
HAVINGAVG(GRADE)>80;③ SELECTSNO,AVG_GRADE FROMS_GRADE
WHEREC_NUM>(SELECTC_NUMFROMS_GRADE
WHERESNO=‘S4’);
相應(yīng)的查詢轉(zhuǎn)換操作如下:SELECTSNO,AVG(GRADE)ASAVG_GRADEFROMSCGROUPBYSNO
HAVINGCOUNT(CNO)>(SELECTCOUNT(CNO)FROMSCGROUPBYSNO
HAVINGSNO=‘S4’);
四、視圖的更新操作對于視圖的更新操作(INSERT、DELET、UPDATA)有以下三條規(guī)則:②如果在導(dǎo)出視圖的過程中,使用了分組和聚合操作,不允許對這個視圖執(zhí)行更新操作。③如果一個視圖是從多個基本表使用聯(lián)接操作導(dǎo)出的,通常不允許對這個視圖執(zhí)行更新操作。①如果視圖是從單個基本表使用選擇、投影操作導(dǎo)出的,并且包含了基本表的主鍵或某個候選鍵,那么這樣的視圖稱為
“行列子集視圖”,并且可以被執(zhí)行更新操作。
四、視圖的更新操作對于視圖的更新操作(INSERT、DELET、UPDATA)有以下三條規(guī)則:①如果一個視圖是從多個基本表使用聯(lián)接操作導(dǎo)出的,那么不允許對這個視圖執(zhí)行更新操作。②如果在導(dǎo)出視圖的過程中,使用了分組和聚合操作,也不允許對這個視圖執(zhí)行更新操作。③如果視圖是從單個基本表使用選擇、投影操作導(dǎo)出的,并且包含了基本表的主鍵或某個候選鍵,那么這樣的視圖稱為“行列子集視圖”,并且可以被執(zhí)行更新操作。在SQL2中,允許更新的視圖在定義時,必須加上“WITHCHECKOPTION”短語。例:如果定義“計算機(jī)應(yīng)用”學(xué)生視圖:
CREATEVIEWSTUDENT_COMPUTER(SNO,SNAME,SEX,AGE)ASSELECTSNO,SNAME,SEX,AGEFROMSWHERESDEPT=‘計算機(jī)應(yīng)用’
該視圖是從單個關(guān)系僅使用了選擇和投影導(dǎo)出的,而且包括鍵SNO,因此是可以修改的。如執(zhí)行插入操作:
INSERTINTOSTUDENT_COMPUTERVALUES(‘S99’,‘王敏’,‘男’,22);系統(tǒng)自動會把它轉(zhuǎn)換變成下列語句:
INSERTINTOSVALUES(’S99’,‘王敏’,‘男’,22,‘計算機(jī)應(yīng)用’
);
對于學(xué)生學(xué)習(xí)情況視圖:
CREATEVIEWS_GRADE(SNO,C_NUM,AVG_GRADE) ASSELECTSNO,COUNT(CNO),AVG(GRADE)
FROMSC
GROUPBYSNO執(zhí)行:UPDATES_GRADE SETSNO='S3' WHERESNO='S4';
不允許。C_NUM是對SC中的學(xué)生選修門數(shù)進(jìn)行統(tǒng)計,在未更改SC表時,要在視圖S_GRADE中更改門數(shù),是不可能的。執(zhí)行:DELETEFROMS_GRADEWHEREC_NUM>4;
也不允許的。在視圖S_GRADE中刪除選修門數(shù)在4門以上的學(xué)生元組,勢必造成SC中這些學(xué)生學(xué)習(xí)元組的刪除,這不一定是用戶的原意,因此使用分組和聚合操作的視圖,不允許用戶執(zhí)行更新操作。
嵌入式SQL
SQL語言有兩種使用方式:一種是在終端交互方式下使用,稱為交互式SQL;另一種是嵌入在高級語言的程序中使用,稱為嵌入式
SQL,而這些高級語言可以是C、PASCAL、COBOL或
PL/I等稱為宿主語言。§6嵌入式SQL的使用技術(shù)使用差別:SQL是基于關(guān)系數(shù)據(jù)模型的語言;
高級語言是基于基本數(shù)據(jù)類型(整型、字符串型、記錄、數(shù)組等)的語言。譬如,SQL語句不能直接使用指針、數(shù)組等數(shù)據(jù)結(jié)構(gòu);
高級語言一般不能直接進(jìn)行集合的操作。為了能在宿主語言的程序中嵌入SQL語句,必須作某些規(guī)定。嵌入式SQL的實(shí)現(xiàn),有兩種處理方式:1、擴(kuò)充宿主語言的編譯程序,使之能處理SQL語句;2、采用預(yù)處理方式。目前多數(shù)系統(tǒng)采用后一種方式。
預(yù)處理方式是:
先由預(yù)處理程序?qū)υ闯绦蜻M(jìn)行掃描,識別出SQL語句,并處理成宿主語言的函數(shù)調(diào)用形式;然后再用宿主語言的編譯程序把源程序編譯成目標(biāo)程序。通常DBMS制造商提供一個SQL函數(shù)定義庫,供編譯時使用。源程序的預(yù)處理和編譯的具體過程如下圖所示:目標(biāo)程序宿主語言十嵌入式SQL
預(yù)處理程序
宿主語言十函數(shù)調(diào)用
宿主語言編譯程序一、嵌入式SQL使用時必須解決的問題①為區(qū)分SQL語句與宿主語言語句,在所有的SQL語句前必須加上前綴標(biāo)識“EXECSQL”,并以“ENDEXEC”作為語句結(jié)束標(biāo)志。格式:EXECSQL
<SQL語句>END_EXEC結(jié)束標(biāo)志在不同的宿主語言中是不同的,在C和PASCAL語言程序中規(guī)定結(jié)束標(biāo)志不用END_EXEC,而使用分號“;”。②數(shù)據(jù)庫工作單元和主程序工作單元之間的通訊允許嵌入的SQL語句引用宿主語言的程序變量(稱為共享變量)。并規(guī)定:
在引用這些變量時必須在這些變量前加冒號“:”作為前綴標(biāo)識,以示與數(shù)據(jù)庫中變量有區(qū)別;
這些變量由宿主語言的程序定義;
由SQL的BEGINDECLARESECTION與ENDDECLARESECTION語句之間說明。而主語言不能引用數(shù)據(jù)庫中的字段變量。SQL2規(guī)定,SQLSTATE是一個特殊的共享變量,
起著解釋SQL語句執(zhí)行狀況的作用,是一個由5個字符組成的字符數(shù)組。SQLSTATE=0:表示SQL語句執(zhí)行成功;SQLSTATE<>0:表示執(zhí)行SQL語句時發(fā)生的各種特殊情況。譬如“02000”用來表示未找到元組。在執(zhí)行一個SQL語句后,程序可以根據(jù)SQLSTATE的值轉(zhuǎn)向不同的分支,以控制程序的流向。③引入游標(biāo)機(jī)制:
將集合操作轉(zhuǎn)換為單元組處理。
SQL的執(zhí)行是面向集合的,一條SQL語句原則上可以產(chǎn)生或處理多條記錄。宿主語言是面向記錄的,一組主變量一次只能存放一條記錄。為此引入游標(biāo)來協(xié)調(diào)SQL語言與主語言的不同數(shù)據(jù)處理方式。二、與游標(biāo)有關(guān)的語句:①定義游標(biāo)語句(DECLARE)游標(biāo)是與某一查詢結(jié)果相聯(lián)系的符號名。
EXECSQLDECLARE
<游標(biāo)名>
CURSORFOR
<SELECT語句>[FORUPDATE[OF<字段名1><,…,字段名n>]];
END_EXEC
這是一個說明語句,定義中的SELECT語句并不立即執(zhí)行。EXECSQLDECLARE
scx
CURSORFOR
SELECTSNO,CNO,GRADEFROMSCWHERESNO=(SELECTSNOFROMSWHERESNAME=:givensname)
FORUPDATEOFGRADE;②打開游標(biāo)語句(OPEN)
打開游標(biāo)語句使游標(biāo)處于活動狀態(tài)。與游標(biāo)相應(yīng)的查詢語句被執(zhí)行。游標(biāo)指向查詢結(jié)果的第一個記錄之前。句法如下:
EXECSQLOPEN<游標(biāo)名>END_EXEC
③游標(biāo)推進(jìn)語句(FETCH)
此時游標(biāo)推進(jìn)一個記錄,并把游標(biāo)指向的記錄(稱為當(dāng)前行)中的值取出,送到INTO子句后相應(yīng)的主變量中。句法如下:
EXECSQLFETCHFROM
<游標(biāo)名>
INTO<變量表>
END_EXECFETCH語句常用于宿主語言程序的循環(huán)結(jié)構(gòu)中,并借助宿主語言的處理語句逐一處理查詢結(jié)果中的一個個元組。在游標(biāo)處于活動狀態(tài)時,可以修改和刪除游標(biāo)指向的元組。④
關(guān)閉游標(biāo)語句(CLOSE)關(guān)閉游標(biāo),使它不再和查詢結(jié)果相聯(lián)系。關(guān)閉了的游標(biāo),可以再次打開,與新的查詢結(jié)果相聯(lián)系。句法如下:
EXECSQLCLOSE<游標(biāo)名>END_EXEC三、嵌入式SQL的使用技術(shù)⑴在嵌入式SQL中,SQL的數(shù)據(jù)定義DDL與控制語句DCL都不需要使用游標(biāo)。它們是嵌入式SQL中最簡單的一類語句,不需要返回結(jié)果數(shù)據(jù),也不需要使用主變量。在主語言中嵌入SQL說明性語句(DECLARE)及控制語句(GRANT),只要給語句加上前綴EXECSQL和語句結(jié)束符END_EXEC即可。在C語言中,用分號;代替END_EXEC例:在C語言中說明共享變量:EXECSQLBEGINDECLARESECTIONintgrade,rise;chargivencno[5],cname[13],tname[9];
chargivensno[5],sname[9],sdept[11];
charSQLSTATE[6];EXECSQLENDDECLARESECTION;
⑵不涉及游標(biāo)的嵌入式SQLDML語句
a.對于INSERT、DELETE和UPDATE語句,只要加上前綴標(biāo)識“EXECSQL”和結(jié)束標(biāo)志“END_EXEC”,就能嵌入在宿主語言程序中使用。例:①在關(guān)系C中插入一門新的課程,各屬性值已在相應(yīng)的共享變量中:
EXECSQLINSERTERINTOC(CNO,CNAME,TNAME)
VALUED(:givencno,:cname,:tname);②從關(guān)系SC中刪除一個學(xué)生的所有選課,該學(xué)生的姓名由共享變量sname提供。
EXECSQLDELETEFROMSCWHERESNO=(SELECTSNOFROMSWHERESNAME=:sname);③把“數(shù)據(jù)庫”課程的全部成績增加某個值(該值由共享變量raise提供)。
EXECSQLUPDATESCSETGRADE=GRADE+:riseWHERECNOIN(SELECTCNOFROMCWHERECNAME=‘?dāng)?shù)據(jù)庫’);b.對于SELECT語句,如果已知查詢結(jié)果肯定是單元組時,可直接嵌入在主程序中使用,此時在SELECI語句中增加一個INTO子句,指出找到的值應(yīng)送到相應(yīng)的共享變量中去。例:在關(guān)系S中根據(jù)共享變量givensno的值檢索學(xué)生的姓名和所在系。
例:在關(guān)系S中根據(jù)共享變量givensno的值檢索該學(xué)生的姓名和所在系:
EXECSQLSELECTSNAME,SDEPTINTO:sname,:sdeptFROMSWHERESNO=:givensno;此處sname,sdept,givensno都是共享變量,已在主程序中定義,并用SQL的DECLARE語句加以說明,在引用是加上“:”作為前綴標(biāo)識,以示與數(shù)據(jù)庫中變量區(qū)別。
⑶涉及游標(biāo)的嵌入式SQLDML語句
a、當(dāng)SELECT語句查詢結(jié)果是多個元組時,此時要用游標(biāo)機(jī)制把多個元組一次一個地傳送給宿主語言程序處理。例:在關(guān)系SC表中檢索某學(xué)生(學(xué)生名由共享變量givensname給出)選課信息(SNO,CNO,GRADE),
該查詢的C語言程序段:
EXECSQLBEGINDECLARESECTION;Intgrade,rise;Charsno[5],cno[5],givensname[9],SQLSTATE[6];EXECSQLENDDECLARESECTION;EXECSQLDECLAREscxCURSORFORSELECTSNO,CNO,GRADEFROMSCWHERESNO=(SELECTSNOFROMSWHERESNAME=:givensname)
FORUPDATEOFGRADE;EXECSQLOPENscx;
While(1){EXECSQLFETCHFROMscxINTO:sno,:cno,:grade;If(SQLCA.SQLSTATE=='02000’)
/﹡已取完查詢結(jié)果中的所有元
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中生物實(shí)驗(yàn)中DNA提取技術(shù)實(shí)驗(yàn)記錄規(guī)范課題報告教學(xué)研究課題報告
- 2026年中小學(xué)學(xué)生中暑應(yīng)急演練方案
- 員工入職離職交接管理制度
- 2026年護(hù)士執(zhí)業(yè)資格考試全題型試題庫(答案及解析)
- 冷鏈物流配送路徑優(yōu)化系統(tǒng)2025年技術(shù)創(chuàng)新與行業(yè)綠色物流研究報告
- 2026上半年貴州事業(yè)單位聯(lián)考省文學(xué)藝術(shù)界聯(lián)合會所屬事業(yè)單位招聘4人備考題庫(含答案詳解)
- 2026廣東肇慶市封開縣公安局第一次招聘警務(wù)輔助人員6人備考題庫及參考答案詳解
- 2026華潤微電子有限公司總裁招聘1人備考題庫及一套完整答案詳解
- 2026四川成都市成華區(qū)人社局招聘編外人員1人備考題庫及完整答案詳解一套
- 2026吉林長春汽車經(jīng)濟(jì)技術(shù)開發(fā)區(qū)招聘編制外輔助崗位人員69人備考題庫帶答案詳解
- 河南省安陽市滑縣2024-2025學(xué)年高二數(shù)學(xué)上學(xué)期期末考試試題文
- 施工電梯基礎(chǔ)施工方案-北京大學(xué)第一醫(yī)院城南院區(qū)工程 V1
- 客房服務(wù)員:高級客房服務(wù)員考試資料
- GB/T 6974.5-2023起重機(jī)術(shù)語第5部分:橋式和門式起重機(jī)
- 心臟血管檢查課件
- 運(yùn)用PDCA循環(huán)管理提高手衛(wèi)生依從性課件
- 二手房定金合同(2023版)正規(guī)范本(通用版)1
- 《高職應(yīng)用數(shù)學(xué)》(教案)
- 點(diǎn)因素法崗位評估體系詳解
- 漢堡規(guī)則中英文
- DB63T 1933-2021無人機(jī)航空磁測技術(shù)規(guī)范
評論
0/150
提交評論