第3章-關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第1頁(yè)
第3章-關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第2頁(yè)
第3章-關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第3頁(yè)
第3章-關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第4頁(yè)
第3章-關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第5頁(yè)
已閱讀5頁(yè),還剩152頁(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)介

第三章關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL

3.1SQL概述3.2數(shù)據(jù)查詢3.3數(shù)據(jù)定義3.4數(shù)據(jù)更新3.5存取控制3.6空值的處理3.7小結(jié)3.1SQL概述一、SQL的產(chǎn)生和發(fā)展

SQL的最早版本是由IBM開發(fā)的。

SQL語(yǔ)言的前身是1972年提出的SQUARE(SpecifyingQueriesAsRelationalExpression)語(yǔ)言,在1974年修改為SEQUEL(StructuredEnglishQueryLanguage),簡(jiǎn)稱SQL。

1986年10月美國(guó)國(guó)家標(biāo)準(zhǔn)局(AmericanNationalStandardInstitute,簡(jiǎn)稱ANSI)的數(shù)據(jù)庫(kù)委員會(huì)X3H2批準(zhǔn)了SQL作為關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言的美國(guó)標(biāo)準(zhǔn)。同年公布了SQL標(biāo)準(zhǔn)文本(簡(jiǎn)稱SQL-86)。3.1SQL概述一、SQL的產(chǎn)生和發(fā)展

1987年國(guó)際標(biāo)準(zhǔn)化組織(InternationalOrganizationforStandardization,簡(jiǎn)稱ISO)也通過(guò)了SQL-86標(biāo)準(zhǔn)。

ANSI于1989年公布了SQL-89標(biāo)準(zhǔn)。 1992年公布了SQL-92標(biāo)準(zhǔn)(SQL2)。 1999年公布了SQL-1999標(biāo)準(zhǔn)(SQL3)。

2003年公布了SQL-2003標(biāo)準(zhǔn)(SQL4)。3.1SQL概述二、SQL的組成1、操作對(duì)象 表和視圖是SQL的操作對(duì)象。 表就是關(guān)系模型中的關(guān)系。表有表名、表結(jié)構(gòu)(關(guān)系模式)和數(shù)據(jù)三部分組成。表的名字和結(jié)構(gòu)存儲(chǔ)在DBMS的數(shù)據(jù)字典中,表中的數(shù)據(jù)保存在數(shù)據(jù)庫(kù)中。 視圖是一個(gè)特殊的表,基本上可以把它當(dāng)作表使用。3.1SQL概述二、SQL的組成2、操作分類

SQL語(yǔ)言包括了對(duì)數(shù)據(jù)庫(kù)的所有操作,在功能上可以分為以下四個(gè)部分: (1)數(shù)據(jù)定義語(yǔ)言(DataDefinitionLanguage,DDL) (2)數(shù)據(jù)操縱語(yǔ)言(DataManipulationLauguage,DML) (3)數(shù)據(jù)控制(DataControlLanguage,DCL) (4)嵌入式SQL和動(dòng)態(tài)SQL(EmbededSQLandDynamicSQL)3.1SQL概述三、SQL的特點(diǎn)1、綜合統(tǒng)一2、高度非過(guò)程化3、面向集合的操作方式4、以同一種語(yǔ)法結(jié)構(gòu)提供兩種使用方式5、語(yǔ)言簡(jiǎn)捷,易學(xué)易用3.1SQL概述SQL語(yǔ)言的動(dòng)詞SQL功能動(dòng)詞數(shù)據(jù)查詢SELECT數(shù)據(jù)定義CREATE,DROP,ALTER數(shù)據(jù)操縱INSERT,UPDATE,DELETE數(shù)據(jù)控制GRANT,REVOkE

3.2數(shù)據(jù)查詢 數(shù)據(jù)查詢是數(shù)據(jù)庫(kù)的核心操作。SELECT語(yǔ)句的格式為:

SELECT[ALL|DISTINCT]<目標(biāo)列表達(dá)式>[別名][,<目標(biāo)列表達(dá)式>[別名]]… FROM<表名或視圖名>[別名][,<表名或視圖名>[別名]]… [WHERE<條件表達(dá)式>] [GROUPBY<列名1> [HAVING<條件表達(dá)式>]] [ORDERBY<列名2>[ASC|DESC][,<列名3> [ASC|DESC]……];3.2數(shù)據(jù)查詢3.2.1單表查詢一、SELECT語(yǔ)句

SELECT子句是關(guān)系代數(shù)中的投影運(yùn)算,用來(lái)選擇表中的全部列或部分列。

1、查詢指定列

在很多情況下,用戶只對(duì)表中的一部分列感興趣,這時(shí)可以通過(guò)在SELECT子句的<目標(biāo)列表達(dá)式>中指定要查詢的列。3.2數(shù)據(jù)查詢3.2.1

單表查詢SnoSname2000012王林2000113張大民2000256顧芳2000278姜凡2000014葛波[例1]查詢?nèi)w學(xué)生的學(xué)號(hào)與姓名。

SELECTSno,Sname FROMStudent;3.2數(shù)據(jù)查詢3.2.1單表查詢2.查詢?nèi)苛? 查詢的是要顯示表的所有內(nèi)容,關(guān)鍵是如何在SELECT子句中指定表中所有的列。一種方法是用枚舉的方法給出所有的列名,前提是要知道表的關(guān)系模式,另一種方法是用符號(hào)*代表所有的列。3.2數(shù)據(jù)查詢3.2.1單表查詢

[例2]

查詢所有課程的詳細(xì)記錄。 方法一:

SELECTCno,Cname,Cpno,Ccredit FROMCourse;

方法二:

SELECT* FROMCourse;3.2數(shù)據(jù)查詢3.2.1單表查詢

3.查詢經(jīng)過(guò)計(jì)算的值[例3]

查全體學(xué)生的姓名及其出生年份。

SELECTSname,2001-Sage FROMStudent;Sname2001-Sage王林1982張大民1983顧芳1982姜凡1982葛波19833.2數(shù)據(jù)查詢3.2.1單表查詢 將列名2001–Sage重命名為BirthYear,SQL語(yǔ)句為:

SELECTSname,2001-SageASBirthYear FROMStudent;SnameBirthYear王林1982張大民1983顧芳1982姜凡1982葛波19833.2數(shù)據(jù)查詢3.2.1單表查詢4、過(guò)濾掉重復(fù)元組[例4]

列出表Student中所有的系。

SELECTSdept FROMStudent;Sdept計(jì)算機(jī)管理管理管理計(jì)算機(jī)3.2數(shù)據(jù)查詢3.2.1單表查詢 用以下的語(yǔ)句去掉重復(fù)的元組:

SELECTDistinctSdept FROMStudent;Sdept計(jì)算機(jī)管理3.2數(shù)據(jù)查詢3.2.1單表查詢二、WHERE子句查

=,>,<,>=,<=,

<>確定范圍BETWEENAND,NOTBETWEENAND

確定集合IN,NOTIN字符匹配LIKE,NOTLIKE

值ISNULL,ISNOTNULL

邏輯運(yùn)算符

AND,OR,NOT

常用的運(yùn)算符3.2數(shù)據(jù)查詢3.2.1單表查詢1、比較大小 比較運(yùn)算符包括:=(等于),>(大于),<(小于),>=(大于等于),<=(小于等于),!=或<>(不等于)。 用比較運(yùn)算符構(gòu)成的選擇條件的形式是: 列名運(yùn)算符常數(shù) 列名運(yùn)算符列名 常數(shù)運(yùn)算符列名3.2數(shù)據(jù)查詢3.2.1單表查詢[例5]

查詢計(jì)算機(jī)系學(xué)生的詳細(xì)信息。

SELECT* FROMStudent WHERESdept='計(jì)算機(jī)';3.2數(shù)據(jù)查詢3.2.1單表查詢

[例6]查詢所有年齡在19歲以下的學(xué)生的姓名和年齡。

SELECTSname,Sage FROMStudent WHERESage<19;3.2數(shù)據(jù)查詢3.2.1單表查詢2、確定范圍 謂詞BETWEEN…AND用于查找列值在指定范圍內(nèi)的元組,其中BETWEEN后是范圍的下限(即低值),AND后是范圍的上限(即高值),格式為:列名BETWEEN…AND3.2數(shù)據(jù)查詢3.2.1單表查詢

[例7]查詢年齡在18~20歲(包括18歲和20歲)之間的學(xué)生的姓名、系別和年齡。

SELECTSname,Sdept,Sage FROMStudent WHERESageBETWEEN18AND20;3.2數(shù)據(jù)查詢3.2.1單表查詢

3、確定集合 謂詞IN用來(lái)查找某個(gè)列值屬于指定集合的元組,格式為: 列名IN集合 如果一個(gè)元組在指定列上的值出現(xiàn)在集合中,則該元組滿足選擇條件,出現(xiàn)在選擇操作的結(jié)果中。在SQL中,將集合中的元素放在左括號(hào)“(”和右括號(hào)“)”中,元素之間用逗號(hào)“,”分隔。3.2數(shù)據(jù)查詢3.2.1單表查詢

[例8]查詢計(jì)算機(jī)系和管理系的學(xué)生的姓名和年齡。 計(jì)算機(jī)系和管理系構(gòu)成的集合表示為:('計(jì)算機(jī)','管理') SELECTSname,Sage FROMStudent WHERESdeptIN('計(jì)算機(jī)','管理');3.2數(shù)據(jù)查詢3.2.1單表查詢

4、字符串匹配 謂詞LIKE可以用來(lái)進(jìn)行字符串的匹配。其一般語(yǔ)法格式如下: 列名LIKE'<匹配串>'[ESCAPE'<換碼字符>']

其含義是查找列值與<匹配串>相匹配的元組。

3.2數(shù)據(jù)查詢3.2.1單表查詢 一般情況下,<匹配串>有通配符%和_。其中:

%(百分號(hào))代表任意長(zhǎng)度(長(zhǎng)度可以為0)的字符串。例如a%b表示以a開頭,以b結(jié)尾的任意長(zhǎng)度的字符串。字符串a(chǎn)cb,addgb,ab

等都滿足該匹配串。

_(下橫線)代表任意單個(gè)字符。例如a_b表示以a開頭,以b結(jié)尾的長(zhǎng)度為3的任意字符串。如acb,afb等都滿足該匹配串。3.2數(shù)據(jù)查詢3.2.1單表查詢

[例9]查詢所有姓王的學(xué)生的姓名、學(xué)號(hào)和性別。

SELECTSname,Sno,Ssex FROMStudent WHERESnameLIKE'王%';3.2數(shù)據(jù)查詢3.2.1單表查詢

[例10]查詢課程號(hào)以113開頭的課程編號(hào)和課程名稱。

SELECTCno,Cname FROMCourse WHERECnoLIKE'113_';3.2數(shù)據(jù)查詢3.2.1單表查詢

[例11]查詢DB_Design課程的課程號(hào)和學(xué)分。

SELECTCno,Ccredit FROMCourse WHERECnameLIKE'DB\_Design' ESCAPE'\';

ESCAPE'\'短語(yǔ)表示\為換碼字符,這樣匹配串中緊跟在\后面的字符“_”不再具有通配符的含義,轉(zhuǎn)義為普通的“_”字符。3.2數(shù)據(jù)查詢3.2.1單表查詢5、空值的判斷 謂詞ISNULL用于判斷某列的值是否為空值,格式如下: 列名ISNULL

如果某個(gè)元組在指定列上的值為空值,則這個(gè)元組滿足ISNULL條件,它出現(xiàn)在選擇操作的結(jié)果中。3.2數(shù)據(jù)查詢3.2.1單表查詢

[例12]查詢?nèi)鄙俪煽?jī)的學(xué)生的學(xué)號(hào)和相應(yīng)的課程號(hào)。

SELECTSno,Cno FROMSC WHEREGradeISNULL;

注意:這里的ISNULL不能用等號(hào)=NULL代替。3.2數(shù)據(jù)查詢3.2.1單表查詢6、邏輯運(yùn)算 邏輯運(yùn)算符AND和OR可用來(lái)聯(lián)結(jié)多個(gè)查詢條件。AND的優(yōu)先級(jí)高于OR,可以用括號(hào)改變優(yōu)先級(jí)。3.2數(shù)據(jù)查詢3.2.1單表查詢

[例13]查詢年齡在19歲以下的計(jì)算機(jī)系的學(xué)生的姓名。SELECTSnameFROMStudentWHERESdept='計(jì)算機(jī)'AND Sage<19;3.2數(shù)據(jù)查詢3.2.1單表查詢

[例14]查詢計(jì)算機(jī)系和管理系的學(xué)生的姓名。

SELECTSname FROMStudent WHERESdept='計(jì)算機(jī)'OR

Sdept='管理';3.2數(shù)據(jù)查詢3.2.1單表查詢

[例15]查詢不是計(jì)算機(jī)系和管理系的所有學(xué)生的姓名。

SELECTSname FROMStudent WHERENOT(Sdept='計(jì)算機(jī)'OR Sdept='管理');3.2數(shù)據(jù)查詢3.2.1單表查詢[例16]查詢年齡不在18~20歲之間的學(xué)生的姓名、系別和年齡。

SELECTSname,Sdept,SageFROMStudentWHERENOTSageBETWEEN18 AND20;3.2數(shù)據(jù)查詢3.2.1單表查詢?nèi)?、ORDERBY語(yǔ)句 由SELECT-FROM-WHERE子句構(gòu)成的SELECT語(yǔ)句完成對(duì)表的選擇和投影操作,得到一個(gè)新表,還可以對(duì)得到的新表做進(jìn)一步的操作。

ORDERBY子句對(duì)查詢結(jié)果進(jìn)行排序。可以按照一個(gè)或多個(gè)屬性列的升序(ASC)或降序(DESC)排列,默認(rèn)情況下按升序排序。3.2數(shù)據(jù)查詢3.2.1單表查詢

[例17]查詢選修了課程號(hào)為1156學(xué)生的學(xué)號(hào)及其成績(jī),查詢結(jié)果按成績(jī)的降序排列。

SELECTSno,Grade FROMSC WHERECno='1156' ORDERBYGradeDESC;3.2數(shù)據(jù)查詢3.2.1單表查詢

[例18]查詢?nèi)w學(xué)生的詳細(xì)信息,查詢結(jié)果先按照系名升序排列,同一系中的學(xué)生再按年齡降序排列。

SELECT* FROMStudent ORDERBYSdept,SageDESC;3.2數(shù)據(jù)查詢3.2.1單表查詢四、聚集函數(shù)

SQL提供了若干聚集函數(shù)。COUNT([DISTINCT|ALL]*) 統(tǒng)計(jì)元組個(gè)數(shù)COUNT([DISTINCT|ALL]<列名>)統(tǒng)計(jì)一列中值的個(gè)數(shù)SUM([DISTINCT|ALL]<列名>)計(jì)算一列值的總和 (此列必須是數(shù)值型)AVG([DISTINCT|ALL]<列名>)計(jì)算一列值的平均值 (此列必須是數(shù)值型)MAX([DISTINCT|ALL]<列名>)求一列值中的最大值MIN([DISTINCT|ALL]<列名>) 求一列值中的最小值3.2數(shù)據(jù)查詢3.2.1單表查詢

[例19]查詢學(xué)生總?cè)藬?shù)。 學(xué)生人數(shù)即表Student中元組的個(gè)數(shù),使用count(*)函數(shù),SQL語(yǔ)句為:

SELECTCOUNT(*) FROMStudent;3.2數(shù)據(jù)查詢3.2.1單表查詢

[例20]查詢選修了課程號(hào)1156或者1136的學(xué)生總?cè)藬?shù)。

SELECTCOUNT(DISTINCTSno) FROMSC WHERECno='1156'ORCno='1136';3.2數(shù)據(jù)查詢3.2.1單表查詢[例21]求出所有學(xué)生的平均年齡。

SELECTAVG(Sage) FROMStudent;[例22]查詢選修1156號(hào)課程的學(xué)生最高分?jǐn)?shù)。

SELECTMAX(Grade) FROMSC WHERECno='1156';3.2數(shù)據(jù)查詢3.2.1單表查詢五、GROUPBY子句

SQL提供了對(duì)查詢結(jié)果進(jìn)行分組的功能。分組后聚集函數(shù)將作用于每一個(gè)組,即每一組都有一個(gè)函數(shù)值。

SQL用GROUPBY子句實(shí)現(xiàn)分組功能,格式為: GROUPBY<列名表>

列名表描述了分組特征,同一組的元組在這些列上的值一定相同。列名表又叫做分組列。

3.2數(shù)據(jù)查詢3.2.1單表查詢[例23]統(tǒng)計(jì)每門課程的選課人數(shù)。 表SC中記錄了選修課程信息。要統(tǒng)計(jì)每門課程的選修人數(shù),需要先按照列Cno進(jìn)行分組,然后,計(jì)算每組中的元組個(gè)數(shù)。SQL語(yǔ)句為:

SELECTCno,COUNT(*) FROMSC GROUPBYCno;CnoCOUNT(*)102421136211373115643.2數(shù)據(jù)查詢3.2.1單表查詢

[例24]統(tǒng)計(jì)各個(gè)學(xué)院男生和女生的人數(shù)。 按照題意,首先要按照Sdept對(duì)學(xué)生進(jìn)行分組,然后,再對(duì)每個(gè)分組按照Ssex分組。SQL語(yǔ)句為:

SELECTSdept,Ssex,COUNT(*) FROMStudent GROUPBYSdept,Ssex;3.2數(shù)據(jù)查詢3.2.1單表查詢六、HAVING子句 對(duì)分組進(jìn)行選擇操作由HAVING子句完成。AVING子句作用于執(zhí)行SELECT-FROM-WHERE-GROUPBY后得到的分組,從中選擇滿足條件的分組。

HAVING子句的格式同WHERE子句,但其條件表達(dá)式是由分組列、聚集函數(shù)和常數(shù)構(gòu)成的有意義的式子。HAVING<條件表達(dá)式>3.2數(shù)據(jù)查詢3.2.1單表查詢

[例25]求選課人數(shù)超過(guò)2人的課程編號(hào)和具體的選課人數(shù)。

SELECTCno,COUNT(*) FROMSC GROUPBYCno HAVINGCOUNT(*)>2;3.2數(shù)據(jù)查詢3.2.1單表查詢

[例26]求選課人數(shù)超過(guò)2人并且課程編號(hào)中包含字符7的課程編號(hào)和具體的選課人數(shù)。

SELECTCno,COUNT(*) FROMSC GROUPBYCno HAVINGCnoLIKE'%7%'AND COUNT(*)>2;3.2數(shù)據(jù)查詢3.2.1單表查詢七、注釋 和其它語(yǔ)言一樣,SQL語(yǔ)言中也有注釋,SQL語(yǔ)言的注釋是一個(gè)以兩個(gè)減號(hào)開始,以回車換行為結(jié)束的字符串。下面的SQL語(yǔ)句中有兩處注釋。

--查詢計(jì)算機(jī)系學(xué)生的詳細(xì)信息

SELECT* FROMStudent WHERESdept='計(jì)算機(jī)'--選擇條件3.2數(shù)據(jù)查詢3.2.2多表查詢 多表查詢涉及到多個(gè)表,在FROM子句中出現(xiàn)多個(gè)表。從概念上講,F(xiàn)ROM子句先對(duì)這些表做笛卡爾積操作,得到一個(gè)臨時(shí)表,以后的選擇、投影等操作都是針對(duì)這個(gè)臨時(shí)表,從而將多表查詢轉(zhuǎn)換為單表查詢。3.2數(shù)據(jù)查詢3.2.2多表查詢一、笛卡爾積 笛卡爾積是關(guān)系代數(shù)的集合運(yùn)算之一。將兩個(gè)表的元組兩兩首尾相連就得到笛卡爾積的一個(gè)元組。假設(shè)兩個(gè)表分別有m和n個(gè)元組,則笛卡爾積有m×n個(gè)元組。具有以下特點(diǎn): 笛卡爾積的輸入是兩個(gè)表(表1、表2),輸出是一個(gè)新表。 新表的列是表1或表2中的某一列,二者的名字也一樣。新表的列數(shù)是兩個(gè)表列數(shù)之和。 表1的一個(gè)元組和表2的一個(gè)元組首尾相連形成了新表的一個(gè)元組3.2數(shù)據(jù)查詢3.2.2多表查詢[例1]

求表Student和表SC的笛卡爾積。

SELECT* FROMStudent,SC;3.2數(shù)據(jù)查詢3.2.2多表查詢二、條件連接 從關(guān)系代數(shù)的連接運(yùn)算的定義可以看出,笛卡爾積實(shí)際上是一種無(wú)條件連接操作,條件連接是對(duì)笛卡爾積再進(jìn)行選擇操作。

[例2]查詢學(xué)生王林所選修的課程的編號(hào)和成績(jī)。 SELECTCno,Grade FROMStudent,SC WHEREStudent.Sno=SC.Snoand Sname='王林';3.2數(shù)據(jù)查詢3.2.2多表查詢

[例3]查詢學(xué)生王林所選修的課程的編號(hào)和成績(jī),并按成績(jī)排序。

SELECTCno,Grade FROMStudent,SC WHEREStudent.Sno=SC.Snoand Sname='王林' ORDERBYGrade;3.2數(shù)據(jù)查詢3.2.2多表查詢

[例4]

查詢某門課程考試成績(jī)?yōu)閮?yōu)良的學(xué)生的學(xué)號(hào),姓名以及所在院系。

SELECTStudent.Sno,Sname,Sdept FROMStudent,SC WHEREStudent.Sno=SC.SnoAND Grade>=80;3.2數(shù)據(jù)查詢3.2.2多表查詢

[例5]查詢英語(yǔ)課程的最高成績(jī)和最低成績(jī)。

SELECTmax(grade),min(grade) FROMCourse,SC WHERECourse.Cno=SC.Cnoand Cname='英語(yǔ)';3.2數(shù)據(jù)查詢3.2.2多表查詢

[例6]查詢每個(gè)學(xué)生的學(xué)號(hào)、姓名、選修的課程名及成績(jī)。

SELECTStudent.Sno,Sname, Cname,Grade FROMStudent,SC,Course WHEREStudent.Sno=SC.SnoAND SC.Cno=Course.Cno;3.2數(shù)據(jù)查詢3.2.2多表查詢

[例7]查詢每一門課的間接先修課(即先修課的先修課)。

SELECTA.Cno,B.Cpno FROMCourseA,CourseB WHEREA.Cpno=B.Cno;

第1個(gè)Course的被重命名為A,第2個(gè)Course的新名是B,SQL就認(rèn)為一個(gè)表的名字是A,另外一個(gè)的名字是B,這樣同一個(gè)表就被看作兩個(gè)不同的表。3.2數(shù)據(jù)查詢3.2.2多表查詢 三、外連接 在條件連接操作中,只有滿足連接條件的元組才能作為最終結(jié)果而被輸出。假設(shè)表A和B作條件連接,有時(shí)候,A中會(huì)有某個(gè)元組t,由于在B中沒(méi)有任何一個(gè)元組滿足與t的連接條件,t的身影不會(huì)出現(xiàn)在A和B的連接結(jié)果中。為了解決參與連接的表的某些元組沒(méi)有出現(xiàn)在連接結(jié)果的問(wèn)題,需要使用左外連接、右外連接和全外連接運(yùn)算。3.2數(shù)據(jù)查詢3.2.2多表查詢 假設(shè)表A和表B做左外連接,其過(guò)程是先按照連接條件對(duì)表做條件連接,得到一個(gè)結(jié)果。如果表A的某個(gè)元組t沒(méi)有出現(xiàn)在結(jié)果中,則將t和B中的一個(gè)萬(wàn)能元組作連接,這個(gè)萬(wàn)能元組在所有的列上取空值,即(NULL,……,NULL),形成一個(gè)新元組(t,NULL,……,NULL)加入到最終結(jié)果。請(qǐng)注意,萬(wàn)能元組實(shí)際上不存在,是為了敘述方便而想象出來(lái)的。3.2數(shù)據(jù)查詢3.2.2多表查詢

[例8]

統(tǒng)計(jì)每一門課程的選修人數(shù)。

SELECTCname,COUNT(*) FROMCourse,SC WHERECourse.Cno*=SC.Cno GROUPBYCname;3.2數(shù)據(jù)查詢3.2.3集合操作

SELECT語(yǔ)句的結(jié)果是元組的集合,所以兩個(gè)SELECT語(yǔ)句的結(jié)果可進(jìn)行集合操作,但要求兩個(gè)表的列的個(gè)數(shù)一致,并且同一個(gè)位置上的列具有相同的數(shù)據(jù)類型。集合操作包括并UNION、交INTERSECT和差EXCEPT。3.2數(shù)據(jù)查詢3.2.3集合操作

[例1]查詢計(jì)算機(jī)系的學(xué)生的學(xué)號(hào)和選修了“管理學(xué)”的學(xué)生的學(xué)號(hào)。

(SELECTSno FROMStudent WHERESdept='計(jì)算機(jī)') UNION (SELECTSno FROMScA,CourseB WHEREA.Cno=B.CnoANDB.Cname='管理學(xué)');3.2數(shù)據(jù)查詢3.2.3集合操作[例2]查詢計(jì)算機(jī)系的學(xué)生與年齡不大于19歲的學(xué)生的交集。(SELECT*FROMStudentWHERESdept='計(jì)算機(jī)')INTERSECT(SELECT*FROMStudentWHERESage<19);3.2數(shù)據(jù)查詢3.2.3集合操作[例3]查詢計(jì)算機(jī)系的學(xué)生與年齡不大于19歲的學(xué)生的差集。

(SELECT* FROMStudent WHERESdept='計(jì)算機(jī)') EXCEPT (SELECT* FROMStudent WHERESage<19);3.2數(shù)據(jù)查詢3.2.4子查詢

SELECT語(yǔ)句除了作為一個(gè)查詢,返回查詢結(jié)果外,還能成為其它操作的操作對(duì)象,如前面介紹過(guò)的UNION操作。作為操作對(duì)象的SELECT語(yǔ)句叫做子查詢,包含子查詢的查詢叫做嵌套查詢,嵌套查詢既提高了SELECT語(yǔ)句的可讀性,又增強(qiáng)了查詢表達(dá)能力,嵌套查詢分為相關(guān)嵌套查詢和不相關(guān)嵌套查詢。3.2數(shù)據(jù)查詢3.2.4子查詢一、WEHER子句中的子查詢1、比較運(yùn)算符 子查詢的結(jié)果是一個(gè)表,一般情況下,其關(guān)系模式有多個(gè)列,關(guān)系實(shí)例有若干行。如果結(jié)果是一個(gè)單列單行表,則可以作為一個(gè)常數(shù)與比較運(yùn)算符一起構(gòu)成比較表達(dá)式。3.2數(shù)據(jù)查詢3.2.4子查詢

[例1]查找和學(xué)號(hào)為2000012的學(xué)生在同一個(gè)系的學(xué)生的詳細(xì)信息。

SELECT*--父查詢

FROMStudent WHERESdept=(SELECTSdept--子查詢

FROMStudent WHERESno='2000012');3.2數(shù)據(jù)查詢3.2.4子查詢

[例2]查詢選修1156課程,并且成績(jī)大于該課程平均成績(jī)的學(xué)號(hào)和成績(jī)。

SELECTSno,Grade--父查詢

FROMSC WHEREGrade> (SELECTAVG(Grade)--子查詢

FROMSC WHERECno='1156') ANDCno='1156';3.2數(shù)據(jù)查詢3.2.4子查詢

[例3]查詢其它系中比管理系某一學(xué)生年齡小的學(xué)生姓名和年齡

SELECTSname,Sage FROMStudent WHERESage< SOME(SELECTSage FROMStudent WHERESdept='管理') ANDSdept<>'管理';

3.2數(shù)據(jù)查詢3.2.4子查詢 本查詢也可以用聚集函數(shù)來(lái)實(shí)現(xiàn)。首先用子查詢找出管理系中最大年齡(19),然后在父查詢中查詢所有非管理系且年齡小于19歲的學(xué)生姓名及年齡。SQL語(yǔ)句如下:

SELECTSname,Sage FROMStudent WHERESage<(SELECTMAX(Sage) FROMStudent WHERESdept='管理') ANDSdept<>'管理';3.2數(shù)據(jù)查詢3.2.4子查詢[例4]查詢其它系中比管理系所有學(xué)生年齡都小的學(xué)生姓名及年齡。

SELECTSname,Sage FROMStudent WHERESage<ALL(SELECTSage FROMStudent WHERESdept='管理') ANDSdept<>'管理';3.2數(shù)據(jù)查詢3.2.4子查詢 本查詢同樣也可以用聚集函數(shù)實(shí)現(xiàn)。SQL語(yǔ)句如下:

SELECTSname,Sage FROMStudent WHERESage<(SELECTMIN(Sage) FROMStudent WHERESdept='管理') ANDSdept<>'管理';

3.2數(shù)據(jù)查詢3.2.4子查詢

=

<>或!=

<

<=

>

>=

SOME

IN

--

<MAX<=MAX>MIN>=MIN

ALL

--

NOTIN

<MIN<=MIN>MAX>=MAXSOME,ALL謂詞與聚集函數(shù)及IN謂詞的等價(jià)轉(zhuǎn)換關(guān)系3.2數(shù)據(jù)查詢3.2.4子查詢 [例5]查詢和學(xué)生2000278年齡相同且性別相同的學(xué)生的詳細(xì)信息。 SELECT*--父查詢 FROMStudent WHERE(Ssex,Sage)= (SELECTSsex,Sage--子查詢 FROMStudent WHERESno='2000278');3.2數(shù)據(jù)查詢3.2.4子查詢2、IN運(yùn)算符 [例6]查詢選修課程編號(hào)為1024的課程的學(xué)生姓名和所在系。

SELECTSname,Sdept

FROMStudent WHERESnoIN(SELECTSno

FROMSC WHERECno='1024');3.2數(shù)據(jù)查詢3.2.4子查詢[例7]查詢選修“管理學(xué)”的學(xué)生學(xué)號(hào)和姓名。

SELECTSno,Sname

FROMStudentWHERESnoIN( SELECTSno

FROMSC

WHERECnoIN(

SELECTCno

FROMCourse

WHERECname='管理學(xué)'));3.2數(shù)據(jù)查詢3.2.4子查詢 查詢也可以用連接查詢實(shí)現(xiàn): SELECTStudent.Sno,Sname FROMStudent,SC,Course WHEREStudent.Sno=SC.SnoAND SC.Cno=Course.CnoAND Course.Cname='管理學(xué)';3.2數(shù)據(jù)查詢3.2.4子查詢3、EXISTS運(yùn)算符 EXISTS運(yùn)算符是一元運(yùn)算符,后面跟一個(gè)集合,如果集合不是空集,則返回真,否則返回假。利用EXISTS運(yùn)算符能實(shí)現(xiàn)集合的包含運(yùn)算。 [例8]查詢所有選修了1024號(hào)課程的學(xué)生姓名。 SELECTSname FROMStudent WHERESnoIN(SELECTSno

FROMSC WHERECno='1024');3.2數(shù)據(jù)查詢3.2.4子查詢 [例9]查詢平均成績(jī)不小于85分的學(xué)生姓名和所在系。 SELECTSname,Sdept FROMStudentx WHERE(SELECTAVG(GRADE) FROMSC WHERESno=x.Sno)>=85;3.2數(shù)據(jù)查詢3.2.4子查詢

[例10]查詢至少選修了學(xué)生2000014選修的全部課程的學(xué)生姓名及所在系。 SELECTSname,Sdept FROMStudentx WHERENOTEXISTS((SELECTCno--集合R FROMSC WHERESno='2000014') EXCEPT--集合的差運(yùn)算 (SELECTCno--集合S FROMSC WHERESno=x.Sno)) ANDx.Sno!='2000014';

3.2數(shù)據(jù)查詢3.2.4子查詢[例11]查詢和學(xué)生2000014選修相同課程的學(xué)生姓名。 SELECTSname,Sdept FROMStudentx WHERENOTEXISTS(SELECTCno--集合R FROMSCy WHERESno='2000014'ANDNOTEXISTS (SELECTCno--集合S FROMSC WHERESno=x.SnoANDCno=y.Cno)) AND NOTEXISTS(SELECTCno--集合S FROMSCz WHERESno=x.SnoANDNOTEXISTS (SELECTCno--集合R FROMSC WHERESno='2000014'ANDCno=z.Cno)) ANDx.Sno!='2000014';3.2數(shù)據(jù)查詢3.2.4子查詢

[例12]查詢選修了某些學(xué)生2000014所選修課程的學(xué)生的姓名。SELECTSnameFROMStudentxWHEREEXISTS( SELECTR.Cno--集合R∩S FROMSCR,SCS WHERER.Sno='2000014'AND

S.Sno=x.SnoANDR.Cno=S.Cno)ANDSno!='2000014';

3.2數(shù)據(jù)查詢3.2.4子查詢二、FROM子句中的子查詢 前面介紹過(guò),F(xiàn)ROM子句指定查詢要使用的表,一般情況下,這些表是關(guān)系數(shù)據(jù)庫(kù)中物理存在的表,如事例數(shù)據(jù)庫(kù)中的Student、Course和SC表。子查詢的結(jié)果是一個(gè)表,但只是一個(gè)中間結(jié)果,并沒(méi)有存放在關(guān)系數(shù)據(jù)庫(kù)中。為了在FROM子句中使用子查詢,要給子查詢生成的臨時(shí)表命名,有時(shí)還要對(duì)臨時(shí)表的列命名。3.2數(shù)據(jù)查詢3.2.4子查詢 [例13]查詢每門課程的名稱和平均成績(jī)

SELECTCno,AVG(Grade) FROMSC GROUPBYCno;3.2數(shù)據(jù)查詢3.2.4子查詢 [例14]查詢學(xué)生王林所選修課程的課程編號(hào)和成績(jī) SELECTCno,Grade FROMStudentJOINSCON Student.Sno=SC.Sno

WHERESname='王林';3.2數(shù)據(jù)查詢3.2.4子查詢 [例15]查詢學(xué)生王林所選修課程的課程名稱和成績(jī)SELECTCname,GradeFROM(StudentJOINSCONStudent.Sno=SC.Sno)JOINCourseONSC.Cno=Course.CnoWHERESname='王林';3.2數(shù)據(jù)查詢3.2.4子查詢

[例16]查詢學(xué)生2000012和2000014選修課程的交集(只要求輸出課程編號(hào))。SELECTA.CnoFROM(SELECTCno FROMSC WHERESno='2000012')A JOIN (SELECTCno FROMSC WHERESno='2000014')B ONA.Cno=B.Cno;3.2數(shù)據(jù)查詢3.2.4子查詢 [例17]查詢學(xué)生2000012和2000014選修課程的差集(只要求輸出課程編號(hào))。SELECTR.CnoFROM(SELECT*--集合R FROMSC WHERESno='2000012')R LEFTOUTERJOIN (SELECT*--集合S FROMSC WHERESno='2000014')S ONR.Cno=S.CnoWHERES.CnoISNULL:3.3數(shù)據(jù)定義 表、視圖、索引是數(shù)據(jù)庫(kù)中的主體。SQL提供數(shù)據(jù)定義語(yǔ)句對(duì)這些主體進(jìn)行管理 SQL的數(shù)據(jù)定義語(yǔ)句操

對(duì)

象操

式創(chuàng)

建刪

除修

改表CREATETABLEDROPTABLEALTERTABLE視

圖CREATEVIEWDROPVIEW索

引CREATEINDEXDROPINDEX3.3數(shù)據(jù)定義3.3.1表的定義 SQL語(yǔ)言使用CREATETABLE語(yǔ)句定義表,其一般格式如下: CREATETABLE<表名>( <列名><數(shù)據(jù)類型>[列級(jí)完整性約束條件] [,<列名><數(shù)據(jù)類型>[列級(jí)完整性約束條件]]…)

[,<表級(jí)完整性約束條件>];3.3數(shù)據(jù)定義3.3.1表的定義1、數(shù)據(jù)類型數(shù)據(jù)類型含

義CHAR(n)長(zhǎng)度為n的定長(zhǎng)字符串VARCHAR(n)最大長(zhǎng)度為n的變長(zhǎng)字符串INT長(zhǎng)整數(shù)(也可以寫作INTEGER)SMALLINT短整數(shù)NUMERIC(p,d)定點(diǎn)數(shù),由p位數(shù)字(不包括符號(hào)、小數(shù)點(diǎn))組成,小數(shù)后面有d位數(shù)字?jǐn)?shù)據(jù)類型3.3數(shù)據(jù)定義3.3.1表的定義數(shù)據(jù)類型(續(xù)表)數(shù)據(jù)類型含

義REAL取決于機(jī)器精度的浮點(diǎn)數(shù)DOUBLEPRECISION取決于機(jī)器精度的雙精度浮點(diǎn)數(shù)FLOAT(n)浮點(diǎn)數(shù),精度至少為n位數(shù)字DATE日期,包含年、月、日,格式為YYYY-MM-DDTIME時(shí)間,包含時(shí)、分、秒,格式為HH:MM:SS3.3數(shù)據(jù)定義3.3.1表的定義2、實(shí)體完整性

[例1]建立Student表,Sno作為主碼。 CREATETABLEStudent (SnoCHAR(7)PRIMARYKEY,

SnameCHAR(8),

SsexCHAR(2),SageSMALLINT,

SdeptCHAR(20));3.3數(shù)據(jù)定義3.3.1表的定義 [例2]建立SC表,Sno和Cno是主碼。 CREATETABLESC (SnoCHAR(7),

CnoCHAR(4), GradeSMALLINT, PRIMARYKEY(Sno,Cno));3.3數(shù)據(jù)定義3.3.1表的定義3、參照完整性 [例3]建立SC表,Sno和Cno是主碼,且Sno和Cno也是外碼,分別引用Student表的Sno列和Course表的Cno列。 CREATETABLESC (SnoCHAR(7),

CnoCHAR(4), GradeSMALLINT, PRIMARYKEY(Sno,Cno), FOREIGNKEY(Sno)REFERENCESStudent(Sno), FOREIGNKEY(Cno)REFERENCESCourse(Cno));3.3數(shù)據(jù)定義3.3.1表的定義 [例4]建立Course表,Cno是主碼,Cpno是外碼,引用Course表的Cno列。 CREATETABLECourse (CnoCHAR(4)PRIMARYKEY,

CnameCHAR(40),

CpnoCHAR(4),

CcreditSMALLINT, FOREIGNKEY(Cpno)REFERENCES Course(Cno));3.3數(shù)據(jù)定義3.3.1表的定義 4、屬性值約束 非空值限制 指定允許的取值范圍 當(dāng)往表中插入元組或修改屬性的值時(shí),數(shù)據(jù)庫(kù)管理系統(tǒng)就檢查屬性上的限制是否被滿足,如果不滿足則操作被拒絕執(zhí)行。3.3數(shù)據(jù)定義3.3.1表的定義[例5]當(dāng)學(xué)生的性別是男時(shí),其名字不能以Ms.打頭。

CREATETABLEStudent (SnoCHAR(7)PRIMARYKEY,

SnameCHAR(8)NOTNULL,

SsexCHAR(2), SageSMALLINT,

SdeptCHAR(20), CHECK(Ssex='女'ORSnameNOTLIKE'Ms.%'));3.3數(shù)據(jù)定義3.3.1表的定義二、修改表 一般格式為:

ALTERTABLE<表名>[ADD<新列名><數(shù)據(jù)類型>[完整性約束]][DROP<完整性約束名>][MODIFY<列名><數(shù)據(jù)類型>];3.3數(shù)據(jù)定義3.3.1表的定義 [例6]向Student表增加“入學(xué)時(shí)間”列,其數(shù)據(jù)類型為日期型。 ALTERTABLEStudentADDScomeDATE; 不論表中原來(lái)是否已有數(shù)據(jù),新增加的列一律為空值。 [例7]刪除學(xué)生姓名不能取空值的約束。 ALTERTABLEStudentDROPNOTNULL(Sname);3.3數(shù)據(jù)定義3.3.1表的定義 三、刪除表 當(dāng)某個(gè)表不再需要時(shí),可以使用DROPTABLE語(yǔ)句刪除它。其一般格式為: DROPTABLE<表名> [例8]刪除Student表。 DROPTABLEStudent;3.3數(shù)據(jù)定義3.3.2索引的定義 一、索引的概念 索引定義 唯一索引(UNIQUE) 非唯一索引(NOTUNIQUE) 聚簇索引(Clusteredindex) 非聚簇索引(Nonclusteredindex)

3.3數(shù)據(jù)定義3.3.2索引的定義 二、建立索引 在SQL語(yǔ)言中,建立索引使用CREATEINDEX語(yǔ)句,其一般格式為: CREATE[UNIQUE][CLUSTERED|NONCLUSTERED]INDEX<索引名> ON<表名>(<列名>[<次序>][,<列名>[<次序>]]…);3.3數(shù)據(jù)定義3.3.2索引的定義 [例1]為學(xué)生-課程數(shù)據(jù)庫(kù)中的Student,Couse,SC三個(gè)表建立索引。其中Student表按學(xué)號(hào)升序建唯一索引,Course表按課程號(hào)降序建唯一索引,SC表按學(xué)號(hào)升序和課程號(hào)降序建唯一索引。 CREATEUNIQUEINDEXStusnoONStudent(Sno); CREATEUNIQUEINDEXCoucnoONCourse(CnoDESC); CREATEUNIQUEINDEXSCnoONSC(SnoASC,CnoDESC);3.3數(shù)據(jù)定義3.3.2索引的定義三、刪除索引在SQL語(yǔ)言中,刪除索引使用DROPINDEX語(yǔ)句,其一般格式為:DROPINDEX<表名.索引名>[例2]刪除Student表的Stusname索引。 DROPINDEXStudent.Stusno;3.3數(shù)據(jù)定義3.3.3視圖的定義一、視圖的作用1、視圖能夠簡(jiǎn)化用戶的操作2、視圖可以減少冗余數(shù)據(jù)3、視圖對(duì)重構(gòu)數(shù)據(jù)庫(kù)提供了一定程度的邏輯獨(dú)立性4、視圖能夠?qū)C(jī)密數(shù)據(jù)提供安全保護(hù)3.3數(shù)據(jù)定義3.3.3視圖的定義二、建立視圖 SQL語(yǔ)言用CREATEVIEW命令建立視圖,其一般格式為: CREATEVIEW<視圖名>[(<列名>[,<列名>]…)] AS<子查詢> [WITHCHECKOPTION];3.3數(shù)據(jù)定義3.3.3視圖的定義 [例1]建立計(jì)算機(jī)系學(xué)生的視圖。 CREATEVIEWStudent_CS AS SELECT* FROMStudent WHERESdept='計(jì)算機(jī)';3.3數(shù)據(jù)定義3.3.3視圖的定義 [例2]建立英語(yǔ)課(1156)成績(jī)單的視圖。 CREATEVIEWEnglish_Grade(Sno, Sname,Grade) AS SELECTStudent.Sno,Sname,Grade FROMStudentJOINSCON Student.Sno=SC.SnoAND

SC.Cno='1156';3.3數(shù)據(jù)定義3.3.3視圖的定義 [例3]定義一個(gè)反映學(xué)生出生年份的視圖。 CREATEVIEWBT_S(Sno,Sname, Sbirthday) AS SELECTSno,Sname,datepart(year, getdate())-Sage FROMStudent;3.3數(shù)據(jù)定義3.3.3視圖的定義 [例4]建立英語(yǔ)課的成績(jī)?cè)?0分以上的學(xué)生的視圖。 CREATEVIEWEnglish_Grade_80 AS SELECTSno,Sname,Grade FROMEnglish_Grade WHEREGrade>=80;3.3數(shù)據(jù)定義3.3.3視圖的定義 三、刪除視圖 當(dāng)不再需要一個(gè)視圖時(shí),可以刪除它,語(yǔ)句格式為:DROPVIEW<視圖名> [例5]刪除視圖Student_CS DROPVIEWStudent_CS;3.3數(shù)據(jù)定義3.3.3視圖的定義 四、查詢視圖 定義視圖以后,就可以象對(duì)表一樣對(duì)視圖進(jìn)行查詢。 [例6]查找計(jì)算機(jī)學(xué)院年齡小于19歲的學(xué)生的姓名。 SELECTSname FROMStudent_CS WHERESage<19;3.3數(shù)據(jù)定義3.3.3視圖的定義 五、更新視圖 更新視圖是指向視圖中插入(Insert)、刪除(Delete)和修改(Update)數(shù)據(jù)。像查詢視圖那樣,對(duì)視圖的更新操作也要通過(guò)視圖消解轉(zhuǎn)換為對(duì)表的更新操作。3.3數(shù)據(jù)定義3.3.3視圖的定義 [例7]將計(jì)算機(jī)系的學(xué)生王林的姓名改為王琳。 UPDATEStudent_CS SETSname='王琳' WHERESname='王林';3.3數(shù)據(jù)定義3.3.3視圖的定義 [例8]計(jì)算機(jī)系增加一個(gè)新生,學(xué)號(hào)為2000015,姓名為趙明,年齡為20歲。 INSERT INTOStudent_CS(Sno,Sname,Sage) VALUES('2000015','趙明',20);3.3數(shù)據(jù)定義3.3.3視圖的定義 [例9]刪除計(jì)算機(jī)系學(xué)號(hào)為2000015的學(xué)生。 DELETE FROMStudent_CS WHERESno='2000015';3.3數(shù)據(jù)定義3.3.3視圖的定義 [例10]建立計(jì)算機(jī)系學(xué)生的視圖,要求進(jìn)行更新操作前后的元組要保證滿足視圖的過(guò)濾條件(即Sdept列上的值是計(jì)算機(jī)系)。 CREATEVIEWStudent_CS AS SELECT* FROMStudent WHERESdept='計(jì)算機(jī)' WITHCHECKOPTION;3.4數(shù)據(jù)更新 一、插入操作插入語(yǔ)句的格式是:INSERTINTO<表名>[(<屬性列1>[,<屬性列2>…])VALUES(<常量1>[,<常量2>]…);/子查詢;也可以在INSERT語(yǔ)句中嵌套子查詢

3.4數(shù)據(jù)更新[例1]將學(xué)生王林的信息插入到Student表中。 INSERT INTOStudent(Sno,Sname,Ssex,Sdept,Sage) VALUES('2000012','王林','男','計(jì)算機(jī)',19); INTO子句指定Student表和要賦值的列,VALUES子句對(duì)元組的各列賦值。3.4數(shù)據(jù)更新 [例2]將學(xué)生張大民的信息插入到Student表中。 INSERT INTOStudent VALUES('2000113','張大民','男',18, '管理');3.4數(shù)據(jù)更新 [例3]在表Course中增加課程離散數(shù)學(xué)的信息。 INSERT INTOCourse(Cno,Cname,Cpno,Ccredit) VALUES('1136','離散數(shù)學(xué)',NULL,4); 符號(hào)NULL的含義是賦予該列的值是空值。3.4數(shù)據(jù)更新 [例4]每一個(gè)學(xué)生都要選修高等數(shù)學(xué)(1128)課,將選課信息加入表SC中。 INSERT INTOSC(Sno,Cno) SELECTSno,'1128' FROMStudent;3.4數(shù)據(jù)更新 二、修改操作 修改操作又稱為更新操作,語(yǔ)句的一般格式是: UPDATE<表名> SET<列名>=<表達(dá)式>[,<列名>=<表達(dá) 式>]… [WHERE<條件>];3.4數(shù)據(jù)更新 [例5]將學(xué)號(hào)為2000012的學(xué)生的年齡改為18歲。 UPDATEStudent SETSage=18 WHERESno='2000012'; [例6]將所有學(xué)生的年齡增加1歲。 UPDATEStudent SETSage=Sage+1;3.4數(shù)據(jù)更新 [例7]將計(jì)算機(jī)系全體學(xué)生的數(shù)據(jù)庫(kù)原理(1024)成績(jī)修改為空值。 UPDATESC SETGrade=NULL WHERECno='1024'ANDSnoIN (SELECTSno FROMStudent WHERESdept='計(jì)算機(jī)');3.4數(shù)據(jù)更新 三、刪除操作 語(yǔ)句的一般格式為: DELETE FROM<表名> [WHERE<條件>];3.4數(shù)據(jù)更新[例8]刪除學(xué)號(hào)為2000012的學(xué)生記錄。 DELETE FROMStudent WHERESno='2000012'; [例9]刪除所有的學(xué)生選課記錄。 DELETE FROMSC;3.4數(shù)據(jù)更新 [例10]刪除計(jì)算機(jī)科學(xué)系所有學(xué)生的選課記錄。 DELETE FROMSC WHERESnoIN (SELECTSno FROMStudent WHERESdept='計(jì)算機(jī)');3.5存取控制一、授權(quán) SQL語(yǔ)言用GRANT語(yǔ)句向用戶授予操作權(quán)限,GRANT語(yǔ)句的一般格式為:

GRANT<權(quán)限>[,<權(quán)限>]…[ON<表名或視圖名>]TO<用戶>[,<用戶>]…[WITHGRANTOPTION];3.5存取控制[例1]把Student表的SELECT權(quán)限授給用戶U1。

GRANTSELECTONTABLEStudentTOU1;[例2]把Student表和Course表的全部操作權(quán)限授予用戶U2和U3。

GRANTALLPRIVILEGESONTABLEStudent,CourseTOU2,U3;3.5存取控制 [例3]把表SC的SELECT權(quán)限授予所有用戶。

GRANTSELECTONTABLESCTOPUBLIC;3.5存取控制 [例4]Student表的SELECT權(quán)限和Sname列的UPDATE權(quán)限授給用戶U4。 GRANTUPDATE(Sname),SELECTONTABLEStudentTOU4; [例5]把表SC的INSERT權(quán)限授予U5用戶,并允許U5將此權(quán)限再授予其它用戶。 GRANTINSERTONTABLESCTOU5WITHGRANTOPTION;3.5存取控制 二、收回權(quán)限 授予的權(quán)限用REVOKE語(yǔ)句收回,REVOKE語(yǔ)句的一般格式為:

REVOKE<權(quán)限>[,<權(quán)限>]…[ON<表名或視圖名>]FROM<用戶>[,<用戶>];3.5存取控制 [例6]把用戶U4修改學(xué)生學(xué)號(hào)的權(quán)限收回

REVOKEUPDATE(Sname)ONTABLEStudentFROMU4; [例7]收回所有用戶對(duì)表SC的查詢權(quán)限

REVOKESELECTONTABLESCFROMPUBLIC; [例8]把用戶U5對(duì)SC表的INSERT權(quán)限收回

REVOKEINSERTONTABLESCFROMU5;3.5存取控制三、角色 在SQL-1999中使用CREATEROLE建立角色,如,建立Clerk角色: CREATEROLEClerk; 角色可以被分配給用戶,也能被分配給其它的角色: GRANTClerkTOU1;--用戶U1是角色 --Clerk的成員3.5存取控制 GRANTClerkTOManager;--Manager是 --另外一個(gè)角色,也是Clerk的成員 角色可以象用戶一樣被授予各種各樣的權(quán)限: GRANTSELECTONStudentTOClerk--角色Clerk對(duì)Student表有SELECT --權(quán)限。3.5存取控制 [例9]在數(shù)據(jù)庫(kù)中增加角色Managers,刪除角色Sales。

sp_addrole'Managers'

溫馨提示

  • 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)論