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

——SQL15.1SQL概述5.2數(shù)據(jù)定義5.3數(shù)據(jù)查詢5.4數(shù)據(jù)更新5.5視圖管理5.6數(shù)據(jù)控制5.7嵌入式SQL5.8SQLServer簡(jiǎn)介25.1SQL概述1970年美國(guó)IBM研究中心的E.F.Codd提出關(guān)系模型。1972年IBM公司研制實(shí)驗(yàn)型關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)SYSTEMR1974年Boyce和Chamberlin把SQUARE修改為SEQUEL(StructuredEnglishQueryLanguage)語(yǔ)言。1979年關(guān)系式軟件公司(RelationalSoftware,Inc即如今的Oracle公司)發(fā)展了第一種以SQL實(shí)現(xiàn)的商業(yè)產(chǎn)品。1986年10月美國(guó)國(guó)家標(biāo)準(zhǔn)局(ANSI)通過(guò)的數(shù)據(jù)庫(kù)語(yǔ)言美國(guó)標(biāo)準(zhǔn),接著,國(guó)際標(biāo)準(zhǔn)化組織(ISO)頒布了SQL正式國(guó)際標(biāo)準(zhǔn)。1989年4月ISO提出了具有完整性特征的SQL89標(biāo)準(zhǔn)。1992年11月ISO公布了SQL92標(biāo)準(zhǔn)3數(shù)據(jù)定義語(yǔ)言(DDL)數(shù)據(jù)操縱語(yǔ)言(DML)數(shù)據(jù)控制語(yǔ)言(DCL)嵌入式SQL語(yǔ)言(E-SQL)

SQL的核心主要包括4個(gè)部分:SQL的一般特性1.綜合統(tǒng)一2.高度非過(guò)程化3.面向集合的操作方式4.以同一種語(yǔ)法結(jié)構(gòu)提供兩種使用方式5.語(yǔ)言簡(jiǎn)潔,易學(xué)易用6.支持關(guān)系數(shù)據(jù)庫(kù)的3級(jí)模式結(jié)構(gòu)56一、綜合統(tǒng)一集DDL、DML、DCL的功能于一體語(yǔ)言風(fēng)格統(tǒng)一可獨(dú)立完成數(shù)據(jù)庫(kù)生命周期中的全部活動(dòng)定義關(guān)系模式,插入數(shù)據(jù)建立數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行查詢和更新數(shù)據(jù)庫(kù)重構(gòu)和維護(hù)數(shù)據(jù)庫(kù)安全性、完整性控制實(shí)體和實(shí)體之間的聯(lián)系均用關(guān)系表示數(shù)據(jù)結(jié)構(gòu)的單一性使每種操作只需一種操作符7二、高度非過(guò)程化只需提出“做什么”,無(wú)須指明“怎么做”,不需要了解存取路徑存取路徑的選擇以及SQL語(yǔ)句的操作過(guò)程由系統(tǒng)自動(dòng)完成減輕用戶負(fù)擔(dān),提高數(shù)據(jù)獨(dú)立性8三、面向集合的操作方式采用集合操作方式操作對(duì)象。查詢結(jié)果是元組的集合一次插入、刪除、更新操作的對(duì)象也可是元組的集合9四、以同一種語(yǔ)法結(jié)構(gòu)提供多種使用方式獨(dú)立的語(yǔ)言獨(dú)立用于聯(lián)機(jī)交互用戶可直接鍵入SQL命令進(jìn)行操作嵌入式語(yǔ)言嵌入到高級(jí)語(yǔ)言程序中兩種方式的語(yǔ)法結(jié)構(gòu)基本一致提供了極大的靈活性和方便性10五、語(yǔ)言簡(jiǎn)捷,易學(xué)易用六、支持關(guān)系數(shù)據(jù)庫(kù)的3級(jí)模式結(jié)構(gòu)模式SQL用戶基本表1視圖視圖2基本表2基本表3基本表4存儲(chǔ)文件1存儲(chǔ)文件1存儲(chǔ)文件1存儲(chǔ)文件1外模式內(nèi)模式SQL語(yǔ)言支持的關(guān)系數(shù)據(jù)庫(kù)的三級(jí)模式結(jié)構(gòu)1112SQL語(yǔ)言的基本概念1、用戶可以用SQL語(yǔ)言對(duì)視圖(View)和基本表(BaseTable)進(jìn)行查詢等操作,在用戶觀點(diǎn)里,視圖和表一樣,都是關(guān)系。2、視圖是從一個(gè)或多個(gè)基本表中導(dǎo)出的表,在數(shù)據(jù)庫(kù)中本身不存儲(chǔ)對(duì)應(yīng)的數(shù)據(jù),只存放其定義,可以將其理解為一個(gè)虛表??稍谝晥D上再定義視圖。3、基本表是本身獨(dú)立存在的表,每個(gè)(或多個(gè))基本表對(duì)應(yīng)一個(gè)存儲(chǔ)文件,一個(gè)表可以帶若干索引,存儲(chǔ)文件及索引組成了關(guān)系數(shù)據(jù)庫(kù)的內(nèi)模式。SQL用戶BaseTableB1ViewV1ViewV2BaseTableB2BaseTableB3BaseTableB4StoredFileS1StoredFileS1StoredFileS1StoredFileS1外模式模式內(nèi)模式13學(xué)生-課程數(shù)據(jù)庫(kù)學(xué)生-課程模式S-T中定義三個(gè)基本表:學(xué)生表:Student(Sno,Sname,Ssex,Sage,Sdept)課程表:Course(Cno,Cname,Cpno,Ccredit)

學(xué)生選課表:SC(Sno,Cno,Grade)14學(xué)生表StudentSnoSnameSsexSageSdet字符型長(zhǎng)度為9不能為空值字符型長(zhǎng)度為2字符型長(zhǎng)度為20字符型長(zhǎng)度為20整數(shù)15課程表CourseCnoCnameCpnoCcredit字符型長(zhǎng)度為4不能為空值字符型長(zhǎng)度為4字符型長(zhǎng)度為40整數(shù)16學(xué)生選課表SCSnoCnoGrade字符型長(zhǎng)度為9字符型長(zhǎng)度為4整數(shù)SQL語(yǔ)言功能SQL功能命令動(dòng)詞數(shù)據(jù)定義CREATE、DROP、ALTER數(shù)據(jù)控制GRANT、REVOKE數(shù)據(jù)查詢SELECT數(shù)據(jù)操縱INSERT、UPDATE、DELETE175.2數(shù)據(jù)定義操作對(duì)象操作方式創(chuàng)建刪除修改表CREATETABLEDROPTABLEALTERTABLE視圖CREATEVIEWDROPVIEW

索引CREATEINDEXDROPINDEX

SQL的數(shù)據(jù)定義功能提供了包括定義表、定義視圖和定義索引三個(gè)功能

185.2.1SQL的基本數(shù)據(jù)類型關(guān)系數(shù)據(jù)庫(kù)支持非常豐富的數(shù)據(jù)類型,不同的數(shù)據(jù)庫(kù)管理系統(tǒng)支持的數(shù)據(jù)類型基本是一樣的,主要有數(shù)值型、字符串型、位串型和時(shí)間型等SQLServer的主要數(shù)據(jù)類型見(jiàn)表5-3195.2.2基本表的創(chuàng)建、修改和撤銷1.表的概念表(table)是用來(lái)存儲(chǔ)數(shù)據(jù)的二維數(shù)組,它有行(rows)和列(columns)。列也稱為表屬性或字段,表中的每一列擁有惟一的名字,每一列包含具體的數(shù)據(jù)類型202.建立數(shù)據(jù)表1)定義數(shù)據(jù)結(jié)構(gòu)

2)命名約定3)CREATETABLE語(yǔ)句創(chuàng)建表的基本語(yǔ)法如下:CREATETABLE<表名>(<列名><數(shù)據(jù)類型>[列完整性的約束條件][,<列名><數(shù)據(jù)類型>[列完整性的約束條件]]……[,<表級(jí)完整性的約束條件>]);<表名>:所要定義的基本表的名字<列名>:組成該表的各個(gè)屬性(列)<列級(jí)完整性約束條件>:涉及相應(yīng)屬性列的完整性約束條件<表級(jí)完整性約束條件>:涉及一個(gè)或多個(gè)屬性列的完整性約束條件21約束條件類型NOTNULLCHECKPRIMARYKEYFOREIGNKEYUNIQUE22【例5-1】建立一個(gè)“職工”表。所用語(yǔ)句如下:CREATETABLEemployee(Emp_idCHAR(5)NOTNULLUNIQUE,Emp_nameCHAR(20)NOTNULL,Emp_sexCHAR(2),Emp_ageINT,Emp_deptCHAR(15),PRIMARYKEY(Emp_id),CHECK(Emp_ageBETWEEN18AND60),);2324[例]建立一個(gè)“學(xué)生”表Student,它由學(xué)號(hào)Sno、姓名Sname、性別Ssex、年齡Sage、所在系Sdept五個(gè)屬性組成。其中學(xué)號(hào)不能為空,值是唯一的,并且姓名取值也唯一。

CREATETABLEStudent(SnoCHAR(7)PRIMARYKEY,

SnameCHAR(20)UNIQUE,

SsexCHAR(2),

SageSMALLINT,

SdeptCHAR(20));25[例6]建立一個(gè)“課程”表Course。

CREATETABLECourse(CnoCHAR(4)PRIMARYKEY,

CnameCHAR(40),

CpnoCHAR(4),

CcreditSMALLINT,

FOREIGNKEY(Cpno)REFERENCESCourse(Cno));26[例7]建立一個(gè)“學(xué)生選課”表SC。CREATETABLESC(SnoCHAR(7),CnoCHAR(4),GradeSMALLINT,PRIMARYKEY(Sno,Cno),FOREIGNKEY(Sno)REFERENCESStudent(Sno), FOREIGNKEY(Cno)REFERENCESCourse(Cno))3.修改數(shù)據(jù)表一般格式如下:ALTERTABLE<表名>ADD<列名><數(shù)據(jù)類型>[<列級(jí)完整性約束>]|DROPCONSTRAINT<完整性約束名>|DROPCOLUMN<列名>|ALTERCOLUMN<列名><數(shù)據(jù)類型>[<列級(jí)完整性約束>]27【例5-2】向Student表增加“入學(xué)時(shí)間”列,其數(shù)據(jù)類型為日期型。

ALTERTABLEStudentADDScomeDATE;注意:不論基本表中原來(lái)是否已有數(shù)據(jù),新增加的列一律為空值。284.撤銷數(shù)據(jù)表一般格式如下:DROPTABLE<表名>基本表定義一旦被刪除,表中的數(shù)據(jù)、表上的索引都自動(dòng)刪除。表上的視圖往往仍然保留,但無(wú)法引用。刪除基本表時(shí),系統(tǒng)會(huì)從數(shù)據(jù)字典中刪去有關(guān)該基本表及其索引的描述。

295.2.3索引的創(chuàng)建和撤銷建立索引是加快查詢速度的有效手段

用戶對(duì)數(shù)據(jù)庫(kù)最頻繁的操作是進(jìn)行數(shù)據(jù)查詢。一般情況下,數(shù)據(jù)庫(kù)在進(jìn)行查詢操作時(shí)需要對(duì)整個(gè)表進(jìn)行數(shù)據(jù)搜索。當(dāng)表中的數(shù)據(jù)很多時(shí),搜索數(shù)據(jù)就需要很長(zhǎng)的時(shí)間,這就造成了服務(wù)器的資源浪費(fèi)。為了提高檢索數(shù)據(jù)的能力,數(shù)據(jù)庫(kù)引入了索引機(jī)制。有關(guān)“索引”的比喻從某種程度上,可以把數(shù)據(jù)庫(kù)看作一本書,把索引看作書的目錄,通過(guò)目錄查找書中的信息,顯然較沒(méi)有目錄的書方便、快捷。5.2.3索引的創(chuàng)建和撤銷1.創(chuàng)建索引

CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<表名>(<列名>[<次序>][,<列名>[<次序>]]...);用<表名>指定要建索引的基本表名字索引可以建立在該表的一列或多列上,各列名之間用逗號(hào)分隔用<次序>指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASCUNIQUE表明此索引的每一個(gè)索引值只對(duì)應(yīng)唯一的數(shù)據(jù)記錄CLUSTER表示要建立的索引是聚簇索引3132例題[例12]為學(xué)生-課程數(shù)據(jù)庫(kù)中的Student,Course,SC三個(gè)表建立索引。其中Student表按學(xué)號(hào)升序建唯一索引,Course表按課程號(hào)升序建唯一索引,SC表按學(xué)號(hào)升序和課程號(hào)降序建唯一索引。CREATEUNIQUEINDEXStusnoONStudent(Sno);CREATEUNIQUEINDEXCoucnoONCourse(Cno);CREATEUNIQUEINDEXSCnoONSC(SnoASC,CnoDESC);

33建立索引(續(xù))唯一值索引對(duì)于已含重復(fù)值的屬性列不能建UNIQUE索引對(duì)某個(gè)列建立UNIQUE索引后,插入新記錄時(shí)DBMS會(huì)自動(dòng)檢查新記錄在該列上是否取了重復(fù)值。這相當(dāng)于增加了一個(gè)UNIQUE約束34建立索引(續(xù))聚簇索引建立聚簇索引后,基表中數(shù)據(jù)也需要按指定的聚簇屬性值的升序或降序存放。也即聚簇索引的索引項(xiàng)順序與表中記錄的物理順序一致例:CREATECLUSTERINDEXStusnameONStudent(Sname);在Student表的Sname(姓名)列上建立一個(gè)聚簇索引,而且Student表中的記錄將按照Sname值的升序存放

35建立索引(續(xù))在一個(gè)基本表上最多只能建立一個(gè)聚簇索引聚簇索引的用途:對(duì)于某些類型的查詢,可以提高查詢效率聚簇索引的適用范圍很少對(duì)基表進(jìn)行增刪操作很少對(duì)其中的變長(zhǎng)列進(jìn)行修改操作36二、刪除索引DROPINDEX<索引名>;刪除索引時(shí),系統(tǒng)會(huì)從數(shù)據(jù)字典中刪去有關(guān)該索引的描述。[例13]刪除Student表的Stusname索引。

DROPINDEXStusname;5.3數(shù)據(jù)查詢SQL查詢語(yǔ)句的一般格式為:SELECT[ALL|DISTINCT]<目標(biāo)列表達(dá)式>[,<目標(biāo)列表達(dá)式>]...FROM<表名或視圖名>[,<表名或視圖名>]...[WHERE<條件表達(dá)式>][GROUPBY<列名1>[HAVING<條件表達(dá)式>]][ORDERBY<列名2>[ASC|DESC]];3738語(yǔ)句格式SELECT子句:指定要顯示的屬性列FROM子句:指定查詢對(duì)象(基本表或視圖)WHERE子句:指定查詢條件

GROUPBY子句:對(duì)查詢結(jié)果按指定列的值分組,該屬性列值相等的元組為一個(gè)組。通常會(huì)在每組中作用集函數(shù)。HAVING短語(yǔ):篩選出只有滿足指定條件的組ORDERBY子句:對(duì)查詢結(jié)果表按指定列值的升序或降序排序WHERE子句中條件表達(dá)式中可以使用的運(yùn)算符

查詢方式運(yùn)算符比較=,>=,<,<=,!=,<>,!>,!<確定范圍BETWEENAND、NOTBETWEENAND確定集合IN、NOTIN字符匹配LIKE、NOTLIKE控制ISNULL、ISNOTNULL否定NOT多重條件AND、OR394041查詢指定列[例]查詢?nèi)w學(xué)生的學(xué)號(hào)與姓名。SELECTSno,SnameFROMStudent;

[例]查詢?nèi)w學(xué)生的姓名、學(xué)號(hào)、所在系。SELECTSname,Sno,SdeptFROMStudent;42查詢?nèi)苛衃例]查詢?nèi)w學(xué)生的詳細(xì)記錄。SELECTSno,Sname,Ssex,Sage,SdeptFROMStudent;或SELECT*FROMStudent;433.查詢經(jīng)過(guò)計(jì)算的值SELECT子句的<目標(biāo)列表達(dá)式>為表達(dá)式算術(shù)表達(dá)式字符串常量函數(shù)列別名等443.查詢經(jīng)過(guò)計(jì)算的值[例]查全體學(xué)生的姓名及其出生年份。SELECTSname,year(getdate())-SageFROMStudent;

輸出結(jié)果:

Sname----------------------

李勇1990

劉晨1991

王名1992

張立1990453.查詢經(jīng)過(guò)計(jì)算的值[例]查詢?nèi)w學(xué)生的姓名、出生年份和所有系,要求用小寫字母表示所在系名。SELECTSname,‘YearofBirth:‘,2013-Sage,

LOWER(Sdept)FROMStudent;

輸出結(jié)果:

SnameYearofBirth:----------------------------------------------

李勇YearofBirth:1990cs

劉晨YearofBirth:1991is

王名YearofBirth:1992ma

張立YearofBirth:1990is46[例]使用列別名改變查詢結(jié)果的列標(biāo)題SELECTSnameNAME,'YearofBirth:’

BIRTH,

2011-SageBIRTHDAY,LOWER(Sdept)DEPARTMENTFROM

Student;輸出結(jié)果:

NAMEBIRTHBIRTHDAYDEPARTMENT----------------------------------------------

李勇YearofBirth:1990cs

劉晨YearofBirth:1991is

王名YearofBirth:1992ma

張立YearofBirth:1990is5.3.2單表查詢(續(xù))2.選擇表中的若干元組1)取消重復(fù)元組【例5-14】查詢選修了課程的學(xué)生學(xué)號(hào)。SELECTDISTINCTSnoFROMSC;【例5-15】查詢選修課程的各種成績(jī)SELECTDISTINCTCno,GradeFROMSC;

4748例題(續(xù))注意DISTINCT短語(yǔ)的作用范圍是所有目標(biāo)列例:查詢選修課程的各種成績(jī)錯(cuò)誤的寫法SELECTDISTINCTCno,DISTINCTGradeFROMSC;正確的寫法

SELECTDISTINCTCno,GradeFROMSC;

2)查詢滿足條件的元組查詢滿足指定條件的元組可以通過(guò)WHERE子句實(shí)現(xiàn)。(1)比較大小。在WHERE子句的<條件表達(dá)式>中使用比較運(yùn)算符從而對(duì)大小進(jìn)行比較?!纠?-16】查詢所有年齡在20歲以下的學(xué)生姓名及其年齡。SELECTSname,SageFROMStudentWHERESage<20;或SELECTSname,SageFROMStudentWHERENOTSage>=20;5.3.2單表查詢(續(xù))49【例5-17】查詢計(jì)算機(jī)系全體學(xué)生的名單。SELECTSnameFROMStudentWHERESdept=‘CS’【例5-18】查詢考試成績(jī)有不及格的學(xué)生的學(xué)號(hào)。SELECTDISTINCTSnoFROMSCWHEREGrade<6050(2)確定范圍。在WHERE子句的<條件表達(dá)式>中使用BETWEEN…AND…NOTBETWEEN…AND…來(lái)確定范圍?!纠?-19】查詢年齡在18至20歲之間的學(xué)生的姓名、系別和年齡。SELECTSname,Sdept,SageFROMStudentWHERESageBETWEEN18AND20;5.3.2單表查詢(續(xù))51(3)確定集合。我們可以使用謂詞IN用來(lái)查找屬性值屬于指定集合的元組?!纠?-21】查詢數(shù)學(xué)系(MA)和計(jì)算機(jī)科學(xué)系(CS)學(xué)生的姓名和性別。SELECTSname,Ssex,SdeptFROMStudentWHERESdeptIN('MA','CS');5.3.2單表查詢(續(xù))52確定集合(續(xù))[例5-21]查詢既不是信息系、數(shù)學(xué)系,也不是計(jì)算機(jī)科學(xué)系的學(xué)生的姓名和性別。SELECTSname,SsexFROMStudent WHERESdeptNOTIN('IS','MA','CS');53(4)字符(串)匹配。謂詞LIKE用來(lái)進(jìn)行全部或部分字符串匹配。在進(jìn)行部分字符串匹配時(shí)要用通配符“%”和“_”。其中,“%”匹配零個(gè)或多個(gè)字符,“_”匹配單個(gè)字符。此外,當(dāng)LIKE之后的匹配串為固定匹配串(即不含通配符)時(shí),可以用“=”運(yùn)算符代替LIKE謂詞,用“<>”或“!=”代替NOTLIKE謂詞。

【例5-24】查詢所有姓江學(xué)生的姓名、學(xué)號(hào)和性別。

SELECTSname,Sno,SsexFROMStudentWHERESnameLIKE'江%';5.3.2單表查詢(續(xù))5455例題1)匹配模板為固定字符串[例5-23]查詢學(xué)號(hào)為200215121的學(xué)生的詳細(xì)情況。

SELECT*FROMStudentWHERESnoLIKE‘200215121';等價(jià)于:

SELECT*FROMStudentWHERESno='200215121';56例題(續(xù))2)匹配模板為含通配符的字符串[例5-24]查詢所有姓劉學(xué)生的姓名、學(xué)號(hào)和性別。

SELECTSname,Sno,SsexFROMStudentWHERESnameLIKE‘劉%’;57例題(續(xù))匹配模板為含通配符的字符串(續(xù))[例5-25]查詢姓"歐陽(yáng)"且全名為三個(gè)漢字的學(xué)生的姓名。

SELECTSnameFROMStudentWHERESnameLIKE'歐陽(yáng)__';58例題(續(xù))匹配模板為含通配符的字符串(續(xù))[例17]查詢名字中第2個(gè)字為"陽(yáng)"字的學(xué)生的姓名和學(xué)號(hào)。

SELECTSname,SnoFROMStudentWHERESnameLIKE'__陽(yáng)%';59例題(續(xù))匹配模板為含通配符的字符串(續(xù))[例]查詢所有不姓劉的學(xué)生姓名。

SELECTSname,Sno,SsexFROMStudentWHERESnameNOTLIKE'劉%';60例題(續(xù))3)使用換碼字符將通配符轉(zhuǎn)義為普通字符

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

SELECTCno,CcreditFROMCourseWHERECnameLIKE'DB\_Design'

ESCAPE'\'61例題(續(xù))使用換碼字符將通配符轉(zhuǎn)義為普通字符(續(xù))[例20]查詢以"DB_"開(kāi)頭,且倒數(shù)第3個(gè)字符為i的課程的詳細(xì)情況。

SELECT*FROMCourseWHERECnameLIKE'DB\_%i__'ESCAPE'\';(5)涉及空值的查詢。當(dāng)查詢涉及到空值時(shí),就要使用謂詞ISNULL或ISNOTNULL,注意“ISNULL”不能用“=NULL”來(lái)代替。【例5-30】查詢選修了課程但沒(méi)有成績(jī)的學(xué)生學(xué)號(hào)和課程號(hào)。SELECTSno,CnoFROMSCWHEREGradeISNULL;5.3.2單表查詢(續(xù))62(6)多重條件查詢。當(dāng)查詢的條件不止一個(gè)時(shí),可以使用邏輯運(yùn)算符AND和OR來(lái)聯(lián)結(jié)多個(gè)查詢條件。AND的優(yōu)先級(jí)高于OR,但用戶可以使用括弧改變優(yōu)先級(jí)?!纠?-32】查詢計(jì)算機(jī)系年齡在20歲以下的學(xué)生姓名。SELECTSnameFROMStudentWHERESdept='CS'ANDSage<20;5.3.2單表查詢(續(xù))633.對(duì)查詢結(jié)果排序如果沒(méi)有指定查詢結(jié)果的顯示順序,DBMS將按其最方便的順序(通常是元組在數(shù)據(jù)表中的先后順序)輸出查詢結(jié)果。當(dāng)然,用戶也可以用ORDERBY子句指定按照一個(gè)或多個(gè)屬性列的升序(ASC)或降序(DESC)重新排列查詢結(jié)果,其中升序ASC為缺省值?!纠?-33】查詢計(jì)算機(jī)系(CS)所有學(xué)生的名單并按學(xué)號(hào)升序顯示。SELECTSname,SnoFROMStudentWHERESdept='CS'ORDERBYSnoASC;5.3.2單表查詢(續(xù))64【例5-34】查詢?nèi)w學(xué)生情況,查詢結(jié)果按所在系升序排列,對(duì)同一系中的學(xué)生按年齡降序排列。SELECT*FROMStudentORDERBYSdept,SageDESC;654.使用聚集函數(shù)COUNT(*):計(jì)算元組的個(gè)數(shù)。COUNT(列名):對(duì)一列中的值計(jì)算個(gè)數(shù)。SUM(列名):求某一列值的總和(此列的值必須是數(shù)值型)。AVG(列名):求某一列值的平均值(此列的值必須是數(shù)值型)。MAX(列名):求某一列值的最大值。MIN(列名):求某一列值的最小值。5.3.2單表查詢(續(xù))66【例5-35】查詢選修了課程的學(xué)生人數(shù)。SELECTCOUNT(DISTINCTSno)FROMSC;【例5-37】查詢學(xué)生S1所修讀課程的平均成績(jī)。SELECTAVG(Grade)FROMSCWHERESno=‘S1’;67【例5-38】查詢選修1號(hào)課程的學(xué)生最高分?jǐn)?shù)。SELECTMAX(Grade)FROMSCWHERECno=‘1’;685.對(duì)查詢結(jié)果分組GROUPBY子句可以將查詢結(jié)果表的各行按一列或多列值分組,值相等的為一組。同時(shí),我們還可以使用HAVING短語(yǔ)設(shè)置邏輯條件【例5-39】查詢每個(gè)學(xué)生的平均成績(jī)。SELECTSno,AVG(Grade)FROMSCGROUPBYSno;注意:使用GROUPBY子句后,SELECT子句的列名列表中只能出現(xiàn)分組屬性和集函數(shù)。5.3.2單表查詢(續(xù))69【例5-40】查詢選修了3門以上課程的學(xué)生學(xué)號(hào)。SELECTSnoFROMSCGROUPBYSnoHAVINGCOUNT(*)>3;70WHERE子句與HAVING短語(yǔ)的區(qū)別WHERE子句作用于基本表或視圖,從中選擇滿足條件的元組。HAVING短語(yǔ)作用于組,從中選擇滿足條件的組【例5-41】查詢所有課程(不包括課程C1)都及格的所有學(xué)生的平均成績(jī),結(jié)果按平均值降序排列。SELECTSno,AVG(Grade)FROMSCWHERECno<>'C1'GROUPBYSnoHAVINGMIN(Grade)>=60ORDERBYAVG(Grade)DESC;715.3.3連接查詢?nèi)粢粋€(gè)查詢同時(shí)涉及兩個(gè)以上的表,則稱之為連接查詢。其一般格式為: [<表名1>.]<列名1><比較運(yùn)算符>[<表名2>.]<列名2]

其中:比較運(yùn)算符主要有:=、>、<、>=、<=、!=。此外連接謂詞還可以使用下面形式:[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名3>.]<列名3>7273連接查詢(續(xù))連接字段連接謂詞中的列名稱為連接字段連接條件中的各連接字段類型必須是可比的,但不必是相同的74連接操作的執(zhí)行過(guò)程嵌套循環(huán)法(NESTED-LOOP)首先在表1中找到第一個(gè)元組,然后從頭開(kāi)始掃描表2,逐一查找滿足連接條件的元組,找到后就將表1中的第一個(gè)元組與該元組拼接起來(lái),形成結(jié)果表中一個(gè)元組。表2全部查找完后,再找表1中第二個(gè)元組,然后再?gòu)念^開(kāi)始掃描表2,逐一查找滿足連接條件的元組,找到后就將表1中的第二個(gè)元組與該元組拼接起來(lái),形成結(jié)果表中一個(gè)元組。重復(fù)上述操作,直到表1中的全部元組都處理完畢1.等值與非等值連接在連接查詢中,當(dāng)連接運(yùn)算符為“=”時(shí),稱為等值連接。否則稱為非等值連接。【例5-42】查詢每個(gè)學(xué)生及其選修課程的情況。SELECTStudent.*,SC.*FROMStudent,SCWHEREStudent.Sno=SC.Sno;或SELECTStudent.*,SC.*FROMStudentINNERJOINSCONStudent.Sno=SC.Sno;75等值與非等值連接查詢(續(xù))結(jié)果假設(shè)Student表、SC表分別有下列數(shù)據(jù):

Student表SC表SnoSnameSsexSageSdept95001李勇男

20

CS95002劉晨女

19

IS95003王敏女

18

MA95004張立男

19

ISSnoCnoGrade9500119295001285950013889500229095002380等值與非等值連接查詢(續(xù))結(jié)果表

Student.SnoSnameSsexSageSdeptSC.SnoCnoGrade

95001李勇男20 CS 9500119295001李勇男20 CS 9500128595001李勇男20 CS 9500138895002劉晨女19 IS 9500229095002劉晨女19 IS 95002380

SnoSnameSsexSageSdept95001李勇男

20

CS95002劉晨女

19

IS95003王敏女

18

MA95004張立男

19

ISSnoCnoGrade9500119295001285950013889500229095002380等值與非等值連接查詢(續(xù))自然連接等值連接的一種特殊情況,把目標(biāo)列中重復(fù)的屬性列去掉。

<表名1>.<列名1>=<表名2>.<列名2>SELECT語(yǔ)句不能直接實(shí)現(xiàn)自然連接對(duì)[例5-42]用自然連接完成。

SELECTStudent.Sno,Sname,Ssex,Sage, Sdept,Cno,GradeFROMStudent,SCWHEREStudent.Sno=SC.Sno;2.自身連接一個(gè)表與其自己進(jìn)行連接,稱為表的自身連接。為了實(shí)現(xiàn)自連接需要將一個(gè)關(guān)系看作兩個(gè)邏輯關(guān)系,為此需要給關(guān)系指定別名。由于所有屬性名都是同名屬性,因此必須使用別名前綴。【例5-44】查詢至少修讀學(xué)號(hào)為95001的學(xué)生所修讀的一門課的學(xué)生學(xué)號(hào)。SELECTSC1.SnoFROMSCSC1,SCSC2WHERESC1.Cno=SC2.CnoANDSC2.Sno='95001';7980SnoCnoGradeSnoCnoGrade950011929500119295001285950012859500128595002290950013889500138895001388950023809500229095001285950022909500229095002380950013889500238095002380SnoCnoGrade9500119295001285950013889500229095002380SnoCnoGrade9500119295001285950013889500229095002380SC1SC281SnoCnoGradeSnoCnoGrade95001192950011929500128595001285950013889500138895002290950012859500238095001388Sno95001950019500195002950023.外連接

在通常的連接操作中,只有滿足連接條件的元組才能作為結(jié)果輸出。有時(shí)我們想以Student表為主體列出每個(gè)學(xué)生的基本情況及其選課情況,若某個(gè)學(xué)生沒(méi)有選課,則只輸出其基本情況信息,其選課信息為空值即可,這時(shí)就需要使用外連接?!纠?-45】查詢每個(gè)學(xué)生及其選修課程的情況(即使沒(méi)有選課也列出該學(xué)生的基本情況)。SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROMStudent.Sno=SC.Sno(*);在SQLServer系統(tǒng)里應(yīng)該寫為:SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROMStudentLEFTJOINSCONStudent.Sno=SC.Sno;

82外連接(續(xù))結(jié)果:

Student.SnoSnameSsexSageSdeptCnoGrade

95001李勇男20CS19295001李勇男20CS28595001李勇男20CS38895002劉晨女19IS29095002劉晨女19IS38095003王敏女18MA95004張立男19IS84外連接(續(xù))外連接與普通連接的區(qū)別普通連接操作只輸出滿足連接條件的元組外連接操作以指定表為連接主體,將主體表中不滿足連接條件的元組一并輸出4.復(fù)合條件連接WHERE子句中有多個(gè)條件的連接操作,稱為復(fù)合條件連接?!纠?-46】查詢選修1號(hào)課程且成績(jī)?cè)?0分以上的所有學(xué)生的學(xué)號(hào)、姓名。SELECTStudent.Sno,SnameFROMStudent,SCWHEREStudent.Sno=SC.SnoANDCno='1'ANDGrade>90;85865.3.4嵌套查詢嵌套查詢概述一個(gè)SELECT-FROM-WHERE語(yǔ)句稱為一個(gè)查詢塊將一個(gè)查詢塊嵌套在另一個(gè)查詢塊的WHERE子句或HAVING短語(yǔ)的條件中的查詢稱為嵌套查詢

87嵌套查詢(續(xù))SELECTSname 外層查詢/父查詢

FROMStudentWHERESnoIN

(SELECTSno內(nèi)層查詢/子查詢

FROMSCWHERECno='2');求選修了2號(hào)課程的學(xué)生姓名88嵌套查詢(續(xù))子查詢的限制不能使用ORDERBY子句層層嵌套方式反映了SQL語(yǔ)言的結(jié)構(gòu)化有些嵌套查詢可以用連接運(yùn)算替代89引出子查詢的謂詞帶有IN謂詞的子查詢帶有比較運(yùn)算符的子查詢帶有ANY或ALL謂詞的子查詢帶有EXISTS謂詞的子查詢5.3.4嵌套查詢1.帶有IN謂詞的子查詢帶有IN謂詞的子查詢是指父查詢與子查詢之間用IN進(jìn)行連接,判斷某個(gè)屬性列值是否在子查詢的結(jié)果中?!纠?-48】查詢與“劉振”在同一個(gè)系學(xué)習(xí)的學(xué)生信息。

SELECT*FROMStudentWHERESdeptIN(SELECTSdeptFROMStudentWHERESname='劉振');902.帶有比較運(yùn)算符的子查詢帶有比較運(yùn)算符的子查詢是指父查詢與子查詢之間用比較運(yùn)算符進(jìn)行連接。當(dāng)用戶能確切知道內(nèi)層查詢返回的是單值時(shí),可以用>、<、=、>=、<=、!=或<>等比較運(yùn)算符?!纠?-48】查詢年齡比“劉振”大的學(xué)生的學(xué)號(hào)和姓名。SELECTSno,SnameFROMStudentWHERESage>(SELECTSageFROMStudentWHERESname='劉振');5.3.4嵌套查詢(續(xù))913.帶有ANY或ALL謂詞的子查詢使用ANY或ALL謂詞時(shí)則必須同時(shí)使用比較運(yùn)算符。ANY表示任意一個(gè)值,ALL表示全部值?!纠?-49】查詢非CS系的學(xué)生名單,并且這些學(xué)生必須滿足這個(gè)條件:在CS系中有學(xué)生的年齡比這些學(xué)生大。SELECTSname,SageFROMStudentWHERESdept<>'CS'ANDSage<ANY(SELECTSageFROMStudentWHERESdept='CS');5.3.4嵌套查詢(續(xù))9293帶有ANY或ALL謂詞的子查詢(續(xù))需要配合使用比較運(yùn)算符>ANY 大于子查詢結(jié)果中的某個(gè)值

>ALL 大于子查詢結(jié)果中的所有值<ANY 小于子查詢結(jié)果中的某個(gè)值<ALL 小于子查詢結(jié)果中的所有值>=ANY 大于等于子查詢結(jié)果中的某個(gè)值>=ALL 大于等于子查詢結(jié)果中的所有值<=ANY 小于等于子查詢結(jié)果中的某個(gè)值<=ALL 小于等于子查詢結(jié)果中的所有值=ANY 等于子查詢結(jié)果中的某個(gè)值=ALL 等于子查詢結(jié)果中的所有值(通常沒(méi)有實(shí)際意義)!=(或<>)ANY 不等于子查詢結(jié)果中的某個(gè)值!=(或<>)ALL 不等于子查詢結(jié)果中的任何一個(gè)值94帶有ANY或ALL謂詞的子查詢(續(xù))ANY和ALL謂詞有時(shí)可以用集函數(shù)實(shí)現(xiàn)ANY與ALL與集函數(shù)的對(duì)應(yīng)關(guān)系

=

<>或!=

<<=>>=ANY

IN

--

<MAX<=MAX>MIN>=MINALL--

NOTIN

<MIN<=MIN>MAX>=MAX

SELECTSname,SageFROMStudentWHERESdept<>‘CS’ANDSage<(SELECTMAX(Sage)FROMStudentWHERESdept=‘CS‘)9596帶有ANY或ALL謂詞的子查詢(續(xù))[例]查詢其他系中比信息系所有學(xué)生年齡都小的學(xué)生姓名及年齡。方法一:用ALL謂詞

SELECTSname,SageFROMStudentWHERESage<ALL(SELECTSageFROMStudentWHERESdept='IS')ANDSdept<>'IS’;97帶有ANY或ALL謂詞的子查詢(續(xù))

方法二:用集函數(shù)

SELECTSname,SageFROMStudentWHERESage<(SELECTMIN(Sage)FROMStudentWHERESdept='IS')ANDSdept<>'IS’;4.帶有EXISTS謂詞的子查詢EXISTS代表存在量詞“

”。帶有EXISTS謂詞的子查詢不返回任何實(shí)際數(shù)據(jù),它只產(chǎn)生邏輯真值“true”或邏輯假值“false”。5.3.4嵌套查詢(續(xù))985.3.4嵌套查詢(續(xù))【例5-51】查詢所有選修了1號(hào)課程的學(xué)生姓名。思路分析:本查詢涉及Student和SC關(guān)系。在Student中依次取每個(gè)元組的Sno值,用此值去檢查SC關(guān)系。若SC中存在這樣的元組,其Sno值等于此Student.Sno值,并且其Cno='1',則取此Student.Sname送入結(jié)果關(guān)系。99【例5-51】查詢所有選修了1號(hào)課程的學(xué)生姓名。SELECTSnameFROMStudentWHEREEXISTS(SELECT*FROMSCWHERESno=Student.SnoANDCno='1');由EXISTS引出的子查詢,其目標(biāo)列表達(dá)式通常都用*,這是因?yàn)閹XISTS的子查詢只返回真值或假值,給出列名無(wú)實(shí)際意義。100101帶有EXISTS謂詞的子查詢(續(xù))例:查詢與“劉晨”在同一個(gè)系學(xué)習(xí)的學(xué)生??梢杂脦XISTS謂詞的子查詢替換:

SELECTSno,Sname,SdeptFROMStudentS1WHEREEXISTS

(SELECT*FROMStudentS2WHERES2.Sdept=S1.SdeptANDS2.Sname=‘

劉晨’);102帶有EXISTS謂詞的子查詢(續(xù))量詞:定義:設(shè)P(x)是包含變?cè)獂的句子,并且設(shè)D是一個(gè)集合。對(duì)于D中的每一個(gè)x,P(x)是一個(gè)命題,稱P是(相對(duì)于D的)一個(gè)命題函數(shù)或謂詞。D稱為P的論域。全稱量詞

的意思是“對(duì)每個(gè)”。句子可寫成:

xP(x)存在量詞語(yǔ)句

的意思是“存在”。句子可寫成:

xP(x)103帶有EXISTS謂詞的子查詢(續(xù))用EXISTS/NOTEXISTS實(shí)現(xiàn)全稱量詞(難點(diǎn))SQL語(yǔ)言中沒(méi)有全稱量詞

(Forall)可以把帶有全稱量詞的謂詞轉(zhuǎn)換為等價(jià)的帶有存在量詞的謂詞:

(

x)P≡

(

x(

P))104帶有EXISTS謂詞的子查詢(續(xù))[例]查詢選修了全部課程的學(xué)生姓名。

SELECTSnameFROMStudentWHERENOTEXISTS

(SELECT*FROMCourseWHERENOTEXISTS(SELECT*FROMSCWHERESno=Student.SnoANDCno=Course.Cno);5.3.5集合查詢集合操作:并操作(UNION)交操作(INTERSECT)差操作(MINUS)【例5-55】查詢計(jì)算機(jī)科學(xué)系(CS)的學(xué)生及年齡小于20歲的學(xué)生。SELECT*FROMStudentWHERESdept='CS'UNIONSELECT*FROMStudentWHERESage<20;1055.4數(shù)據(jù)更新SQL中數(shù)據(jù)更新包括插入、修改和刪除。執(zhí)行插入、修改和刪除操作時(shí)可能會(huì)受到關(guān)系完整性的約束,這種約束是為了保證數(shù)據(jù)庫(kù)中的數(shù)據(jù)的正確性和一致性。1065.4.1插入數(shù)據(jù)1.插入單個(gè)元組一般格式為:INSERTINTO<表名>[(<屬性列1>[,<屬性列2>…)]VALUES(<常量1>[,<常量2>]…)【例5-58】將一個(gè)新學(xué)生記錄(學(xué)號(hào):841064;姓名:劉振;性別:男;所在系:CS;年齡:18歲)插入Student表中。INSERTINTOStudentVALUES('841064','劉振','男','CS',18);1072.插入子查詢結(jié)果一般格式為:INSERTINTO<表名>[(<屬性列1>[,<屬性列2>...)]子查詢;說(shuō)明:該語(yǔ)句的功能將子查詢結(jié)果插入指定表中,這是一種批量插入形式。INTO用法與前面所述的相同。在子查詢中,SELECT子句目標(biāo)列必須與INTO子句匹配,包括值的個(gè)數(shù)與值的類型。108【例5-60】求各個(gè)院系學(xué)生的平均年齡并存放于一張新表DeptAge(Sdept,Avgage)中,其中,Sdept存放系名,Avgage存放相應(yīng)系的學(xué)生平均年齡。(1)建表。CREATETABLEDeptage(SdeptCHAR(15),AvgageSMALLINT);(2)插入。INSERTINTODeptAge(Sdept,Avgage)

SELECTSdept,AVG(Sage)

FROMStudentGROUPBYSdept;1095.4.2修改數(shù)據(jù)其一般格式為UPDATE<表名>SET<列名>=<表達(dá)式>[,<列名>=<表達(dá)式>]...[WHERE<條件>];【例5-61】將學(xué)號(hào)為841053的學(xué)生的年齡改為22歲。UPDATEStudentSETSage=22WHERESno='841053';1105.4.3刪除數(shù)據(jù)一般格式為:DELETEFROM<表名>[WHERE<條件>];【例5-64】刪除學(xué)號(hào)為841053的學(xué)生記錄。DELETEFROMStudentWHERESno='841053';1115.5視圖管理視圖(View)是從一個(gè)或幾個(gè)基本表(或視圖)導(dǎo)出的表,它與基本表不同,是一個(gè)虛表,只在數(shù)據(jù)目錄中保留其邏輯定義,而不作為一個(gè)表實(shí)際存儲(chǔ)在數(shù)據(jù)庫(kù)中。當(dāng)基本表中的數(shù)據(jù)發(fā)生變化,從視圖中查詢出的數(shù)據(jù)也隨之改變。1125.5.1視圖的創(chuàng)建與刪除1.創(chuàng)建視圖SQL創(chuàng)建視圖語(yǔ)句的一般格式為:CREATEVIEW<視圖名>[(<列名>[,<列名>]...)]AS<子查詢>[WITHCHECKOPTION];【例5-67】建立計(jì)算機(jī)系學(xué)生的視圖。CREATEVIEWCS_StudentASSELECTSno,Sname,SageFROMStudentWHERESdept='CS'WITHCHECKOPTION;1132.刪除視圖SQL刪除視圖語(yǔ)句的一般格式為DROPVIEW<視圖名>;【例5-72】刪除前面建立的視圖CS_S1。DROPVIEWCS_S1;1145.5.2視圖操作1.視圖查詢視圖定義后,用戶就可以像對(duì)基本表進(jìn)行查詢一樣對(duì)視圖進(jìn)行查詢了?!纠?-73】在計(jì)算機(jī)系學(xué)生的視圖中找出年齡小于20歲的學(xué)生。SELECTSno,SageFROMCS_StudentWHERESage<20;對(duì)基本表的查詢(即視圖消解后的查詢)為:SELECTSno,SageFROMStudentWHERESdept='CS'ANDSage<20;1152.視圖更新更新視圖是指通過(guò)視圖來(lái)插入(INSERT)、刪除(DELETE)和修改(UPDATE)數(shù)據(jù)。對(duì)視圖的更新,最終要轉(zhuǎn)換為對(duì)基本表的更新?!纠?-75】將計(jì)算機(jī)系學(xué)生視圖CS_Student中學(xué)號(hào)為841064的學(xué)生姓名改為“劉振”。UPDATECS_StudentSETSname='劉振'WHERESno='841064';轉(zhuǎn)換為對(duì)基本表的更新:UPDATEStudentSETSname='劉振'WHERESno='841064'ANDSdept='CS';116不可更新視圖(1)若視圖是由兩個(gè)以上基本表導(dǎo)出的,則此視圖不允許更新。(2)若視圖的字段來(lái)自字段表達(dá)式或常數(shù),則不允許對(duì)此視圖執(zhí)行INSERT和UPDATE操作,但允許執(zhí)行DELETE操作。(3)若視圖的字段來(lái)自聚集函數(shù),則此視圖不允許更新。(4)若視圖定義中含有GROUPBY子句,則此視圖不允許更新。(5)若視圖定義中含有DISTINCT短語(yǔ),則此視圖不允許更新。(6)若視圖定義中有嵌套查詢,并且內(nèi)層查詢的FROM子句中涉及的表也是導(dǎo)出該視圖的基本表,則此視圖不允許更新。1175.5.3視圖的優(yōu)點(diǎn)1.視圖能夠簡(jiǎn)化用戶的操作2.視圖使用戶能以多種角度看待同一數(shù)據(jù)3.視圖對(duì)重構(gòu)數(shù)據(jù)庫(kù)提供了一定程度的邏輯獨(dú)立性4.視圖能夠?qū)C(jī)密數(shù)據(jù)提供安全保護(hù)1185.6數(shù)據(jù)控制1.用戶權(quán)限2.授權(quán)與回收1191用戶權(quán)限定義存取權(quán)限存取權(quán)限存取權(quán)限由兩個(gè)要素組成數(shù)據(jù)對(duì)象操作類型關(guān)系系統(tǒng)中的存取權(quán)限類型

數(shù)據(jù)對(duì)象 操作類型模式 模式 建立、修改、刪除、檢索 外模式建立、修改、刪除、檢索內(nèi)模式 建立、刪除、檢索

數(shù)據(jù) 表 查找、插入、修改、刪除 屬性列 查找、插入、修改、刪除關(guān)系系統(tǒng)中的存取權(quán)限(續(xù))定義方法GRANT/REVOKE關(guān)系系統(tǒng)中的存取權(quán)限(續(xù))例:一張授權(quán)表用戶名數(shù)據(jù)對(duì)象名允許的操作類型王平關(guān)系StudentSELECT

張明霞關(guān)系StudentUPDATE

張明霞關(guān)系CourseALL

張明霞SC.GradeUPDATE

張明霞SC.SnoSELECT

張明霞SC.CnoSELECT檢查存取權(quán)限對(duì)于獲得上機(jī)權(quán)后又進(jìn)一步發(fā)出存取數(shù)據(jù)庫(kù)操作的用戶DBMS查找數(shù)據(jù)字典,根據(jù)其存取權(quán)限對(duì)操作的合法性進(jìn)行檢查若用戶的操作請(qǐng)求超出了定義的權(quán)限,系統(tǒng)將拒絕執(zhí)行此操作授權(quán)粒度授權(quán)粒度是指可以定義的數(shù)據(jù)對(duì)象的范圍它是衡量授權(quán)機(jī)制是否靈活的一個(gè)重要指標(biāo)。授權(quán)定義中數(shù)據(jù)對(duì)象的粒度越細(xì),即可以定義的數(shù)據(jù)對(duì)象的范圍越小,授權(quán)子系統(tǒng)就越靈活。關(guān)系數(shù)據(jù)庫(kù)中授權(quán)的數(shù)據(jù)對(duì)象粒度數(shù)據(jù)庫(kù)表屬性列行2、SQL的授權(quán)功能GRANT語(yǔ)句的一般格式:

GRANT<權(quán)限>[,<權(quán)限>]...[ON<對(duì)象類型><對(duì)象名>]TO<用戶>[,<用戶>]...[WITHGRANTOPTION];功能:將對(duì)指定操作對(duì)象的指定操作權(quán)限授予指定的用戶。【例5-78】把查詢Student表權(quán)限授給用戶User1,User2。 GRANTSELECTONTABLEStudentTOUser1,User2;127[例]把對(duì)表SC的查詢權(quán)限授予所用用戶。

GRANTSELECT ONTABLEStudent TOPUBLIC;[例]把查詢Student表和修改學(xué)號(hào)的的權(quán)限授予用戶U4。

GRANTUPDATE(Sno),SELECT ONTABLEStudent TOU4;128[例]把對(duì)表SC的INSERT權(quán)限授予用戶U5,并允許將該權(quán)限再授予其他用戶。

GRANTINSERT ONTABLESC TOU5 WITHGRANTOTION;1293收回權(quán)限SQL中可以用REVOKE語(yǔ)句收回權(quán)限。REVOKE語(yǔ)句的一般格式為REVOKE<權(quán)限>[,<權(quán)限>]...[ON<對(duì)象類型><對(duì)象名>]FROM<用戶>[,<用戶>]...;級(jí)聯(lián)收回。系統(tǒng)只收回直接或間接從某用戶獲得的權(quán)限。130【例5-83】把用戶User3修改學(xué)生學(xué)號(hào)的權(quán)限收回。REVOKEUPDATE(Sno)ONTABLEStudentFROMUser3;131[例]收回所有用戶對(duì)表SC的查詢權(quán)限。

REVOKESELECT ONTABLESC FROMPUBLIC[例]收回用戶U5對(duì)SC表的INSERT權(quán)限。

REVOKEINSERT ONTABLESC FROMU5CASCADE132MSSQLServer2000中相關(guān)命令sp_addloginsp_addusersp_addrolesp_addrolemembergrantrevoke133數(shù)據(jù)庫(kù)角色角色是SQLServer7.0版本引進(jìn)的新概念,它代替了以前版本中組的概念。利用角色,SQLServer管理者可以將某些用戶設(shè)置為某一角色,這樣只對(duì)角色進(jìn)行權(quán)限設(shè)置便可以實(shí)現(xiàn)對(duì)所有用戶權(quán)限的設(shè)置,大大減少了管理員的工作量。SQLServer提供了用戶通常管理工作的預(yù)定義服務(wù)器角色和數(shù)據(jù)庫(kù)角色。數(shù)據(jù)庫(kù)角色是被命名的一組與數(shù)據(jù)庫(kù)操作有關(guān)的權(quán)限,角色是權(quán)限的集合。可以為一組具有相同權(quán)限的用戶創(chuàng)建一個(gè)角色。使用角色來(lái)管理數(shù)據(jù)庫(kù)權(quán)限可以簡(jiǎn)化授權(quán)過(guò)程。數(shù)據(jù)庫(kù)角色1、角色的創(chuàng)建例CreateroleR1;數(shù)據(jù)庫(kù)角色2、給角色授權(quán)例GRANTselectONtableSCTOR1;數(shù)據(jù)庫(kù)角色3、將一個(gè)角色授予其他角色或用戶例GRANTR1TOU1;數(shù)據(jù)庫(kù)角色4、角色權(quán)限收回例revokeselectOntableSCfromR1;5.7嵌入式SQLSQL語(yǔ)言提供了兩種不同的使用方式:交互式嵌入式為什么要引入嵌入式SQLSQL語(yǔ)言是非過(guò)程性語(yǔ)言事務(wù)處理應(yīng)用需要高級(jí)語(yǔ)言這兩種方式細(xì)節(jié)上有差別,在程序設(shè)計(jì)的環(huán)境下,SQL語(yǔ)句要做某些必要的擴(kuò)充139什么是宿主語(yǔ)言宿主語(yǔ)言嵌入式SQL是將SQL語(yǔ)句嵌入程序設(shè)計(jì)語(yǔ)言中,被嵌入的程序設(shè)計(jì)語(yǔ)言,如C、C++、Java,稱為宿主語(yǔ)言,簡(jiǎn)稱主語(yǔ)言。140嵌入式SQL的處理過(guò)程Hostlanguage+EmbeddedSQLDBMSPreprocessorsHostlanguage+FunctioncallsHostlanguagecompilerObjectcodeSQLLibrary1415.7.1嵌入式SQL的說(shuō)明部分為了區(qū)分SQL語(yǔ)句與主語(yǔ)言語(yǔ)句,所有SQL語(yǔ)句必須加前綴EXECSQL,以(;)結(jié)束:EXECSQL<SQL語(yǔ)句>;142嵌入式SQL語(yǔ)句與主語(yǔ)言之間的通信數(shù)據(jù)庫(kù)工作單元與源程序工作單元之間的通信:1.SQL通信區(qū)向主語(yǔ)言傳遞SQL語(yǔ)句的執(zhí)行狀態(tài)信息使主語(yǔ)言能夠據(jù)此控制程序流程格式為:

EXECSQLINCLUDESQLCA2.宿主變量主語(yǔ)言向SQL語(yǔ)句提供參數(shù)將SQL語(yǔ)句查詢數(shù)據(jù)庫(kù)的結(jié)果交主語(yǔ)言進(jìn)一步處理格式為:

EXECSQLBEGINDECLARESECTION;…….EXECSQLENDDECLARESECTION;3.游標(biāo)解決集合性操作語(yǔ)言與過(guò)程性操作語(yǔ)言的不匹配1435.7.2嵌入式SQL的可執(zhí)行語(yǔ)句把程序作為一個(gè)用戶,和數(shù)據(jù)庫(kù)建立連接EXECSQLCONNECT:uidIDENTIFIENDBY:pwd;嵌入式SQL的DDL和DML語(yǔ)句除了前面加EXECSQL外,與ISQL基本相同

【例5-87】一個(gè)插入語(yǔ)句的例子。

EXECSQLINSERTINTOSC(Sno,Cno,Grade)VALUES(:Sno,:Cno,:Grade);144查詢結(jié)果為單記錄的SELECT語(yǔ)句這類語(yǔ)句不需要使用游標(biāo),只需要用INTO子句指定存放查詢結(jié)果的主變量[例]根據(jù)學(xué)生號(hào)碼查詢學(xué)生信息。假設(shè)已經(jīng)把要查詢的學(xué)生的學(xué)號(hào)賦給了主變量givensno。EXECSQLSELECTSno,Sname,Ssex,Sage,SdeptINTO:Hsno,:Hname,:Hsex,:Hage,:HdeptFROMStudentWHERESno=:givensno;145查詢結(jié)果為多條記錄的SELECT語(yǔ)句說(shuō)明游標(biāo)語(yǔ)句

ExecsqlDeclare<游標(biāo)名>CursorFor<查詢塊>;

打開(kāi)游標(biāo)語(yǔ)句

ExecsqlOpen<游標(biāo)名>; //執(zhí)行查詢移動(dòng)指針/獲取數(shù)據(jù)ExecsqlFetch<游標(biāo)名>Into<共享變量名><指示變量名>,...判斷是否到底sqlca.sqlcode(==100)關(guān)閉游標(biāo)ExecsqlClose<游標(biāo)名>;1465.7.3動(dòng)態(tài)SQL簡(jiǎn)介靜態(tài)SQLSql語(yǔ)句在寫應(yīng)用程序時(shí)指明應(yīng)用程序中的SQL命令在編譯時(shí)已經(jīng)確定.動(dòng)態(tài)

溫馨提示

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