第3章
结构化查询语言——SQL结构化查询语言——SQL——
是结构化查询语言(structruedquerylanguage)的缩写,它实际上包括查询、定义、操纵和控制四个部分,是一种功能齐全的数据库语言。该语言早在70年代中期由Boyce和Chamberlin提出。由于SQL具有语言简洁、方便实用、功能齐全等突出优点,很快得到推广和应用,随着关系数据库的流行,SQL在计算机界和广大用户中已经得到公认。1986年10月美国国家标准局(ANsI)的数据库委员会颁布了sQL的美国标渡,作为标准关系数据库语言。1987年6月,国际标准化组织(1So)采纳5QL为关系数据库语言的国际标准。我国也在90年制定了sQL标准。实际系统中实现的sQL语言往往对标准版本有所扩充。目前,各种数据库管理系统几乎都支持sQL,或者提供5QL的接口。这就使得无论是大型机、中型机,或者小型机以至微机上的各种数据库系统都有了共同的存取语言标准接口,为更广泛的数据共享开创了乐观的前景。例如,oracle、sybase的微机版.微机关系数据库管理系统dBASEN、FoxProforwind。ws等也支持SQL。sQL作为查询标准语言的影响已波及到数据库领域之外,在人工智能、软件工程等领域的产品中也开始采用阳L作为数据和图形及其它对象的检索工具。sQL有两种使用方法,一种是以与用户交互的方式联机使用,另一种是作为子语言嵌入到其它程序设计语言中使用。前者称为交互式sQL,适合非计算机专业人员,即最终用户即席查询。后者称为宿主型sQL,适合于程序设计人员用高级语言编写应用程序并与数据库打交道时.嵌入到主语言中使用。这两种使用方法的基本语法结构一致,这里只介绍交互式sQL。由于它是在联机条件下直接使用的,有时也将每一个独立的操作叫做命令。阳L的查询语句也称作sELEcT命令,其基本形式是SELEcT—FRoM—wHERE查询块。多个查询块可以逐层嵌套执行。朗L的查询是高度非过程化的,用户只带明确提出“要干什么”,而不需要指出“怎么去干”。系统将自动对查询过程进行优化,用户感到效率高,其员大优点是查询速度快。用户要向系统讲清楚“要干什么”,需要把询问用语言规定的查询格式表示出来。sQL基本查询模块的结构是:SELECT<表达式l>,<表达式2>,…,<表达式n>FRoM<关系1>,<关系2>,…,<关系m>WHERE<条件表达式>;其中sELEcT子句中用逗号分开的表达式为查询目标。最常用也是最简单的是用逗号分开的同性名,即二维表中的列。系统对查询结果按照所需的届性进行投影运算。FRoM子句指出上述查询目标及下面wHKRE子句的条件中所涉及的所有关系的关系名。wHERE子句指出查询目标必须满足的条件.系统根据条件进行选择运算,输出条件为真的元组集合。查询要用分号表示语句结束‘在条件表达式中除了常用的比较运算符以外,可用的逻辑运算符和谓词有:AND逻辑与oR逻辑或NOT逻辑非IN包含N()TIN不包含ExIST5存在UNUN集合的并INTEESECT集合的交MINUS集合的差不同系统所提供的功能有所区别,这里只介绍一般支持sQL的系统共有的基本功我们以一个简单的图书管理关系数据模型为基础,通过示例来介绍sQL的使用方设,图书管理关系数摆模型包括以厂三个关系模式,图书(总编号,分类号,书名,作者,Q版单位,单价)
读者(情书证号,,性别,单位,职称,地址).借阅(惜书证号,总编号,借阅日期.备注)例1;找出读者李欣所在的单位。SELEC丁,单位FROM读者wHERE=r9犷;例2:查看所有读者的全部情况。SE乙ECT,FROM读者;SELECT子句里的星号由于询问中无条件限制,故省略wHERE于句,但要注意用分号表示查询语句结束。例3:列出馆中所有藏书的书名及出版单位。SELECTDISTINCT书名,出版单位FRoM图书;询问中只对藏书种类的书名和出版单位感兴趣,无论藏书有多少副伞只列出一个即可。因此,用DIsTINcT告诉系统从查询结果中取掉重复元组。由用户决定是否去除重复元组是有实际意义的。若不选用DISTINcT,系统默认ALL即无论重复与否全部给出。例4:查找人民出版社的所有图书及单价,结果按单价降序排列,即珍贵书籍在前。SEIECT书名,出版单位,单价FROM图书wHERE出版单位=”人民出版社”ORDERBY单价D[SC;这里用ORDE硬BY对查询结果提出排序要求。ASt(Ascendiing)表示升序。例5:查找价格介于10和15元之间的图书,结“sELEcT书名,作者,单价,分类号F肋M图书WHERE单价BETWEENl0AND20ORDERBY分类号,单价ASC;E按分类号和单价升序排列。消BETwEEN表示在二考之间,低值在AND之前肩值在后。其等价的表示方法是(wHERE单价>=10AND单价<=20)。用A5c指出升序,也可以省略,由系统默认。sQL允许多重排序。oRDERBY后面按次序给出主排序关镊字和次排序关键字。输出结果先按主排序关键字的值排列,在主关键字值相等的情况下,再按次关键字的值排序。例6:查找人民出版社和科学出版社的所有图书及作者。sELECT书名,作者,出版单位FRoM图书wHERE出版单位IN(”人民出版社””科学出版社”);,这里的谓词[N表示包含在其后面的集合中。也可以用一个或几个oR来代替,此问题的等价查询语句是:驱I—EcT书名,作者,出版单位FROM图书
wHERE出版单位=”人民出版社”oR出版单位=研学出版社”;相比之下,用1N不仅书写简洁,而且会减少出现逻辑错误的机会。由于问题中的“和”字,用户可能将oR误写为AND。因为同一本书不可能在两家出版单位出版,结果什么也查不到。语法正确,但没有表达出询问的原意周十逻辑错误。逻辑错误是用户把“要干这个”表示成了“要干那个”,往往使查询结果“所答非所问”。例7:查找书名以“数据库”打头的所有图书及作者。SELECT书名,作者FROM图书WHERE书名LIKE“数据库%”;渭词I—IKE后面必须是字符串常量,其中可以使用两个通配特下划线代表任意一个单个字符。其作用与Dos中的?相同。百分号%代表任意多个,包括零个任意字符。其作用与飘)5中的,类似。例如:wH更RE书名LIKE”%数据库%”包含”数据库”的书名。;wHERE书名I‘IK置”%数据库”i以”数据库防尾的书名。wHERE作者NKz”%强——”作者至少四字符(两个汉字)且倒数第:;个汉字是“强”字。例8;检索借了总编号为500088和100909两本书的借书证号5ELECTx。借书证号FROM借问x,借问YwHERcx.借书证号=Y.借书证号ANDX.总编号=rf500088vANDY.总编号=”100909”;由于同一个关系在一个查询模块中出现两次wHERK子句中用别名加以限定。以上简单查询只涉及到一个关系,如果查询目标涉及到两个或几个关系,往往要;t联接运算。由于sQL是高度非过程化的,用户只要在FROM子句中指出关系名称wHERE子句写明联接条件即可,联接运算由系统去完成并实现优化*例9:查找所有俗阅丁图书的读者及所在单位*SELECTDISTINCT,单位FBOM读者,借阂wHER2读者.借书证号=借闻.借书证号;必须注意,如果不同关系中有相同的属性名,为了避免混淆应当在前面冠以关系名并用.分开。用D15了INCT表示无论一位读者借几本书,在输出结果中只出现一次。例10:找出李晶所借的所有图书的书名及借阅日期。5厦LECT,骄借图书:,书名,借阅日期”FROM图书,借阅,读者W服RE读者.借书证号=借阅.俗书证号AND借阅.总编号=图书.总编号AND=毕晶”;查询涉及到三个关系之间的自然联接,用户只需用外关键字指出联接条件,SELEC丁子句中允许有字符串常量(表达式的简单情况),W中斯借图书:r6用户作为提醒,使查询结果易于阅读。例11:查找价格在20元以上已借出的图书,结果按单价降序排列。SEI‘ECT,
FRoM图书,借阅wHERE图书.总编号=借阅.总编号AND单价>=20ORDERBY单价DESC;这里SELECT*代表图书和借问两个关系联接后的所有属性3.1.3饯套查询嵌套查询是指在sELEcT—FRoM—wHERE查询块内部再嵌入另一个查询块,称为子查询,并允许多层嵌套。由于ORDER子句是对最终查询结果的表示顺序提出要求,因此它不能出现在子查询当中例12:找出借阅了“c语言程序设计”此询问可以用联接查询来完成;sELEcT,单位FRoM读者,借阅,图书wHERE读者.借书证号=借闽.借书证号AND倍阅.总编号=图书.总编号AND书名=rrc语言程序设计”;对于非专业用户来讲wHERE子句中的条件可能过于复杂,往往丢掉一部分联接条下面的嵌套查询形式则清晰、自然并可体现出结构化程序设计的优点:sELECT,单位FROM读者WHERE借书证号IN(SELECT借书证号FR()M借问WHERE总编号INSELECT总编号FROM图书wHERE书名=pc语言程序设计”);在执行嵌套查询时,每一个内层子查询是在上一级外层处理之前完成的,即外层用到内层的查询结果。从形式上看是自下向上进行处理的。从这个规律出发,按照手工查询的思路来组织嵌套查询就轻而易举了。在嵌套查询中最常用的是谓词IN。由于查询的外层用到内层的查询结果,用户事先并不知道内层结果,这里的IN就不能用一系列oR来代替。另外,并非所有的嵌套查询都能用联接查询替代,有时结合使用更显得简洁、方便。例如:例13:找出读者的、所在单位,他们与玉鸣一在同一天借了书。sELEcT,单位,借阅日期FROM读者,借阅wHERE借问.借书证号=读者.借书证号AND借阅日期IN(SELECT借书日期FRoM借阅,读者wHERE借闻.借书证号=读者.借书证号AND=”王鸣例14:找出藏书中比高等教育出版社的所有图书单价更高的书籍。
SELECT*FROM图书wHERE单价>ALL(SELECT单价FROM图书wHERE出版单位=”高等教育出版社”)‘其中ALL表示与子查询结果的所有单价值相比都高才算满足条件。与ALL对应的是ANY,它表示与子查询结果的任何—个值相比满足条件即可。当子查询的结果不是单值,前面又有比较运算符时,一定要用ALI或ANY指明比较条件。使用时应当特别注意询问目的要求什么。此询问要求比高等教育出版社的所有图书单价更高的书,而不是其中任何一本,故不能用ANY。例15:找出藏书中所有与“数据库导论”或“数据库原理”在同一个出版单位出版的SEL霓C丁,FRoM图书W邢RE出版单位=ANY(SELEcT出版单位卢RoM图书wHERE书名IN(”数据库导论”“数据库原理”));,这里的=ANY亦可用IN代替,但其它比较运算符,如>ANY或<3.1.4使用库函数查询‘阳L提供了常用的统计函数称为库丙数。这些库函致使检索功能进一步的自变量是表达式的值,是按列计算的,最简单的表达式就是属性,也就是列。阳L的库函数有:计数函数COUNT(x)计算元组的个数;凹uNT对列的值计算个数:求和函数suM对某一列的值求和(属性必须是数值类型);计算平均AVG对莱一列的值计算平均值(属性必须是数值类型)求最大值Max找出一列值中的最大值;求最小值MIN找出一列值中的最小值。例16:求藏书总册数。SELECT”藏书总册数:,COtJNT(q)”FROM图书;例17:求科学出版社图书的最高价格、最低价格、平均价格。sELECT”最高:,MAx(单价),””最低:,M1N(单价),””平均:,AVG(单价)”FRoM图书wHERE出版单位=”科学出版社”;例18:求计算机科学系当前借问了图书的读者人数。SELEC丁”借书人数:,COUN丁(D15TINCT借书证号)”FRoM借曰WHERE借书证号IN
(SELECT借书证号FRoM读者wHERE单位;咐算机科学系”)如果询问的是该系当前借田图书的总人次,则应省略DISTINCT。例19:用库函数查询例14的询问。找出藏书中比高等教育出版社的所有图书单价更高书籍,SELECT*FROM图书WHERE单价>(SELECTMAx(单价)FROM图书wHERE出版单位=“高等教育出版社”);由于这种形式的子查询肯定只有一个结果,因此可以省赂ANY或ALL。例20:求出各个出版让图书的最高价格、最低价格、平均价格。sELEcT出版单位,MAx(单价)tMIN(单价)PAVL(单价)FROM图书GROUPBY出版单位;其中GRouPBY的作用是按属性的取值对元组分组,然后对每一组分别使用库函数。在此例中,有几个出版单位就分几个组,按组分别计算最高价格、最低价格、平均价格。请注意,如果在sELEcT子句中出现库函数,与之并列的其它项目必须也是库函数或者是GRoUPBY的对象,否则会出现逻辑错误。例21:分别找出各个单位当前借阅图书的读者入次。sELECT单位,”借书人数:,cOUNT(借书证号)”FROM借阅,读者wHERE读者.借书证号=借阅.借书证号GROUPBY单位;一个读者只有一个借书证号,同一个借书证号可以有若干张借书卡片,表现在借阅关系中借书证号可以重复出现。要查出该单位的借书人次,使用CoUNT(借书证号),不用DISTINCT限定。例22:找出藏书中各个出版单位的册数、价值总额,并按总价降序,总价相同者按册数降序排列。sEL2CT出版单位,栅数:,cOuNT(。),””总价FRoM图书GRoUPBY出版单位ORD2RBYSUM(单价).COUNT(,)DEX2;sELEcT,单位FROM读者wHERE借书证号IN(SELECT借书证号FBoM借阅
GROUPBY借书证号HAVINGCOUNT(。)>=5);例中的HAVING子句通常跟随在GROUPBY之后,其作用是限定检索i中必须包含库函数,否则条件可直接放到wHEBE子句里。例24:分别找出借书人数超过10个人的单位及人数。SELEC丁单位,“借书人数;,CoUNT(DISTINCT借书证号)”FROM借问,读者wHEeE读者.借书证号=借阅.借书证号GRoUPBY单位HAVINGCOUNT(D15TINCT惜书证号)>103从此例中可见,HAvING子句和w服RE子句并不矛盾wH霓RE限定元组,然后用GKOUPBY分组,最后用HAvING限句里不能直接用库函数作为条件表达式。例25:找出没有借阅任何图书的读者及所在单位。sELECT,单位FROM读者WHERENOT置XISTS(SELECT,FROM借闻旬中一般先用在wHERE子wHERE借阅.借书证号=读者.借书证号);其中ExlsTs表示存在,如果子查询结果非空,则满足条件jNo’rExIs门正叶相反,表示不存在,如果子查询结果为空,则满足条件。本例中的查询称为相关于查询,子查询的查询条件依赖于外层的某个值(读者.借书证号),这里的子查询不能只处理一次,要反复求值以供外层查询使用。在wHERE子句中,逻辑非NoT可以放在任何查询条件之前,也可以用在条件表达式之前。例如NOT[‘IKE、NOTIN、NoTBETWEEN、NOT单价>15等等。sQL查询功能很强,表现方式也很灵活,本例也可写为如下形式:SELECT性名.单位FROM读者WH[RE借书证号NOTIN(5ZLECT借书证号FROM借阅wHERE借阅.借书证号=读者.借书证在这种写法中,于查询只需处理一次*3.1.5集合运算关系是元组的集合,可以进行传统的集合运算。集合运算包括并UNIoN、差MLNUS、交IN丁ERSECTIoN。求一个S辽LECT子查询的结果与另一个SzL置CT子查询结果的并、查、交*集合运算是以整个元组为单位的运算,因此,这些子查询目标的结构与类型必须互相匹配。集合运算结果将去掉重复元组。例26:有一个校友通讯录关系,包含、职称和单位属性
关系一致。求校友与读者中具有教授、副教授职称人员的并集。S2LECT,职称,单位FRoM读者wHERE职称IN(“教授””副教授”),UNIONSEL2CT,职称,单位FROM校友WHERC职称IN(哟伊,划教授”)3.1.6SELECT小结sQL语言中的sELEcT句型灵活多样,所表达的语义可以1例子可知sELEcT语句的一般语法如下:SEI,EcT查询目标FROM关系[wHERE条件表达式][GROUPBY分组属性名HAvING组选择条件表达式II[oRDERBY排序同性[序I..I.其中,sEL更cT子句的查询目标可以用以下格式表示:LDISTINcT251表名.xrcouNT(。)表达式[,表达式I..·金式可以是由属性、库函数和常旦用算术运算符组成的公式。wHERE子句的条件表达式可以使用下列运算笆犬冲好话笆符=.<.>.>=,<=.7=逻辑运算符AND,OR,NOT集合元素包含运算符IN,NoTIN存在量词ExISTS(SE工ECT子查询)集合运算符并UNloN,差MINus,交通配符LIKE—,LIKE%sQL数据定义sQL除了具有查询功能之外,还包括数据定义、数据操纵和数据控制功能。数据定义是指对关系模式一级的定义。数据操纵是指对关系中的具体数据进行增、删、改和更新等操作。数据控制是指对数据访问权限的授予或撤消。在具体介绍数据定义功能之前,首先需要了解3QL语言支持的关系数据库三级模式结构。3.2.1sQL数据库的体系结构sQL支持关系数据库的三级模式结构,如图3.1所示。此图清晰地描述出了数据库的三级结构、两级独立的特点。在阳L中、有些术语与传统的关系数据库不同,关系模式称为“基本表”,存储模式称为“存储文件”,子模式称为“视图”,元组称为“行”,局性称为“列”。
1.基本表(BaseTable):本身独立存在的表,即实际存储在数据库中的表,而不是从其它表导出来的。基本表可以有若干个索引。一个基本表可以跨一个或多个存储文件,而一个存储文件可以存放一个或多个基本表。一个存储文件与外存储器上的一个物理文件相对应。存储文件和相关索引组成了关系的内模式,即存储模式。基本表的集合组成关系模型,即全局概念模式(数据的整体逻辑结构)。2.视图(view):从一个或几个基本表或其它视图导出来的表。视图本身并不独立存储数据,系统只保存视图的定义。访问视图时P6统将按照视图的定义从基本表中存取数据。由此可见,视图是个虚表,它动态地反映基本表中的当前数据,这与数据的静态复制不同。从用户的观点出发,基本表和视图都是关系,用sQL一样访问。视图可以看作用户按照应用需要定义的外模式,即用户的局部数据逻辑结构。sQL数据定义功能是指定义数据库的结构,包括定义基本表、定义视图、定义索引三个部分。3.2.2定义基本表
用sQL可以定义、扩充和取消基本表。定义一个基本表相当于建立一个新的关系模式,但尚未输入数据,只是一个空关系框架。系统将基本表的数据描述存入数据字典中,供系统或用户查阅。1.定义基本表定义基本表就是创建一个基本表,对表名(关系名称)及它所包括的各个同性名及其数据类型作出具体规定。不同系统支持的数据类型稍有区别,但一般都支持如下数据类型:cHAR(n)字符串,长度为n个西文字符。INTEGER全字长整数,范围从负10位整数到正ll位整数。SMALLlNT半字长整数,范围从一99999到999999。DECIMAL(x,y)十进制数,包括小数点及符号位共x位,其中y位小数。FLOAT(x,y)双字长浮点数,范围从o.1e一307到o.9e十308以指数形式表下面通过例子来说明如何定义基本表。例1:CREATETADLE图书(总编号分类号书名单价CHAR(6)NO丁NULL,CHAR(8),CHAR(30),DECIMA汇(10,3))‘用NOTNuLL指出该属性在输入数据时不允许有空值。在一般情况下不允许主关键字为空值,而其它属性可以有暂时不填写,或未知的值。2。修改基本表修改基本表是指对已经定义的基本表增加新的属性名(列),扩展关系模式。例2:ALTERTABLE图书ADD(作者CHAR(8),出版单位CHAR(30));新增加的同性处于表的最后一列。如果被修改的基本表原来已经有了数据.各个记录中新增加的属性值全部是空值,有待以后用更新语句修改。因此,不能用ALTERTABLE增加NOTNULL属性。3.取消基本表取消基本表是把表的定义、表中的数据、其上的索引以及以该基本表为基础所建立的所有视图全部删除,并释放所占用的存储空间。例3:DROPTABI—E图书;3.2.3定义视图数据库系统中的基本表包含多个用户共享的数据,某一个具体应用可能只使用其中一部分数据,基本表的格式也可能并不直接满足用户要求。可以从一个或几个基本表
以及已有的视图中导出适合具体应用的视图*用户对视图的查询与基本表一样。从用户观点来看,基本表和视图都是关系。但由于视图是虚表Pt并不对应一个存储的数据文件,因此通过视图对数据的修改要受到一定的限制。建立视图有两个作用:可简化查询命令;可限制某些用户的查询范围。第一个作用是由于在定义视图时已经对数据作丁一定范围的限定。第二个作用是通过对用户授权体现出来的。未经授权的用户不能访问任何基本表或视图,在基本表上建立局部视图之后再将视图授权给用户,就可以避免暴露全部基本表。1.定义视图例4:建立管理工程系的读者视图,6称为GL—R口ADER。CREATEV12wGL—READERAsSELECT,性别,职称,地址FROM读者wHERE单位=”管理工程系’wITHCHECKOPTION‘由于所建视图的属性名与子查询的朋I‘ECT子句相同,可省赂不写。其中,wITHcHEcKoPTIoN是可选择的,当要求通过视图更新或插入元组,元组必须满足视图定义条件时选用。例5;建立各个单位当前借阅图书情况的简单统计视图,名称为DwcREAT配VI厦wDw—READEB(单位,借书人数,借闻人次)5ELECT单位,COUNT(DISTINCT借书证号),COUNT(总编号)FRoM借阅,读者wHERE读者.借书证号=借问.借书证号GROUPBY单位;从此例可见,视图是基本表数据的动态宙口。对这个视图的直接查询便得到各单位当前借阅图书情况的简单统计。每次查询这一视图结果将是变化的,而不是定义视图当时的静态拷贝。2.取消视图例6:DROPVIEWGL—READER;取消视图后,其定义以及在它基础上所建立的其它视图将自动删除。3.2.4定义别名(同义词)为了使用方便,用户可以为基本表、视图和已存在的同义词起别名,所起的别名作为原对象的同义词使用。例如,某应用程序中的关系名与数据库的一个视图或基本表完全对应,只是名称不同。此时不必修改应用程序,只要为基本表定义一个程序中使用的别名就行了。
例7:为基本表借阅起一个同义词别名LOAN*CREATESYNONYMLoANFOR借阅;例8;删除同义词别名LOAN。DROPSYNONYMLOAN;3.2.5索引的建立为了提高数据的检索效率,数据库管理员可以根据实际应用情况为一个基本表建立若干个索引。由于数据库的访问路径是由系统自动进行的,一般用户并不能自主选择所用的索引。1.建立索引例9:为基本表借问建立一个按借书记号升序的索引,名为JsNo。CREATEINDExJSNOON惜问(借书证号Asc);例10:为基本表图书建立一个按借书记号升序的索引CREATEUNIQUEINDExTSNoON图书(借书证号ASC);其中UNIQUE是可选项,表示每一个索引关键字的值只对应唯一的元组。2.取消索引例11:nRoPINDExJsNo;综合上述,用cREATE和DROP命令可以分别定义和取消基本表(BAsETABLE)、视图(VIKw)、同义词(SYNoNYM)和索引(INDEx)。3.3SQL数据操纵以上sQL的数据定义功能是对数据库中各类模式进行描述(参见图3,1sQL支持的数据库体系结构),井末涉及库中的实际数据。数据操纵是指对关系中的具体数据进行增、删、改操作。3.3.1括人数据向基本表中插入数据的命令有两种格式,一种是向具体元组插入常量数据;另一种是把从子查询的结果输入到另一个关系中去。前者进行单元组(一行)插入,后者一次可插入多个元组。例1:向图书基本表中新加一个元组。基本表图书所定义的关系模式结构是;图书(总编号,分类号,书名,作者,出版单位,单价)。新增元组各个列(属性)的值必须符合定义。增加一个完整元组,并且属性顺序与定义一致,可在基本表名称后面省略属性名称。INSERTINTO图书vALuEs(”446943g,JTF31/138”算机基础””杨大华”,Y,,噶等教育出版社”f的屑性名称必须指明。例2:向图书基本表中插入一个元组的部分字段。INsERTINT0图书(总编号,书名,单价)
VALUES(rr44698088”,墩据库原理及应用”,16.50);刨3,建立一个各单位借阅图书情况统计基本表,名称为Dw‘个月,向此基本表里追加一次数据。CR配ATtTABLEDw—JSH[单位CHAR(20),借书人数SMALLINT,借书人次,SMALLINT);INsE硬TINTODw—J5H(单位,借书人数,借书人次)SELECT单位,凹UNT(DISTINCT借书证号),凹U取OM借闭,读者wHERE读者.借书证号=借阂.借书证号GROUPBY单位2此例与前面第二节例5中所定义的视图Dw—READER不同。DW—、JSH是基本表数据逐月追加,保存有历史记录。而Dw—R[ADER是视图动态窗口,每次查询这一视图仅反映当时情况。’3.3.2更新数据更新就是修改数据c在更新命令中可以用wHERE组予以更新。若不写条件,则对所有元组更新。例4:将例2插入的图书填上作者和出版单位。UPDATE图书·sET作者=”王为民”PQ版单位=”电子工业出版社”WHERE总编号=电4698088”;切5:将所有图书的单价上调5%。UPDATE图书SET单价=单价?1.05;例6:将书名中包含“计算机”的书分类号改为叮P31,UPnATE图书SET分类号=叮P31/138”wHERE书名=”%计算机%”;例7:把借书证号”7902070”改为”7912070”。UPDATE读者SET借书证号=”7912070”WHER2借书证号=”7902070”:UPDATE借阅SET借书证号=”79U070“WHERE借书证号=”7902070”2子句限定条件,对满足条件的元在修改同名属性时应当特别注意保持数据的一致性。第一个更新命令执行之后库处于不一致状态,因为读者中的借书证号已有变动,而借阅中的借书证号书未动。当下‘个更新命令执行过之后,数据库才又达到一个新的一致状态。3.3.3删除数据删除命令比较简单,删除单位是元组,不是元组的部分居性。一次可以删除一个、几个
元组,以致于将整个表删成空表,只保留表的结构定义。删除同名属性时也要注意保持数据的一致性。如果要“删除”屑性,需要用更新语句将某个记录的相应届性修改成空值。若要想从结构上取消某个属性,这是屑于修改关系模式的问题,屑于数据定义操作而不是数据操纵问题。例8:删除借书证号”9011100嘶借总编号为P/44698080”的借问登记。DEI‘ETEFROM借阅WHERE借书证号=”90llloo”AND总编号=P/44698080”;例9:删除借书证号以90开头的所有读者登记和借阅登记DELETEFROM读者WHER置借书证号=DEI。E丁EFROM借阅WHERE情书证号=”90%”3.4SQL数据控制数据控制是指通过对数据库各种权限的授予或回收来管理数据库系统。每个用户在系统登录时都要输入用户名称和口令,通过了系统的合法性检验之后才能使用系统。用户有定义基本表的权限,有使用自己所定义的基本表的所有权限。数据库管理员(DBA)对数据库的所有资源拥有所有权限,包括数据定义、数据查询、数据操纵和数据控制。数据库管理员和基本表的定义者有权将对基本表的各种权限授予别人,授权者也可以回收权限。非基本表的建立者必须经过授权才能使用不是自己定义的表。这些权限包括对基本表的修改(AlTER)、插入(则szRT)、删除(D2LETE)、更新(UPDA丁E)、建立索引(1NDEx)、查询(SELECT)和ALL(所有权限)。授权语句的格式如下:GRANT权限表oNTABLE表名TO用户名表[WITHGRANTO盯ION]该语句把对指定表的某些权限授予若干用户。当选用wITHG只ANTOP丁IoN短语时,被授权的用中有权将获得的权限再授予其它用户。被授权的对象可以是PuBLIc(所有用户),或具体用户名。例1:将查询和更新各单位借阅图书情况统计基本表DwGBANTS[LECT,UPIDATE0NTABLEDw—JSHTOPUBLIC,注意,系统为了防止滥用权限,wITHGRANToPTIoP
短语不能与PuBLIc同时3.4.2回收权限例2:回收用户LIMING和wANGWEI对基本表Dw—J5H的更新权限*REVOKEUPDATEONTABLEDw—JSRFROMLIMING.wANGWEI;授予和回收权限是有层次的。设用户A把自己所建立的表“通信录”的所有权限授予给了用户B,并用wITHGRANTOPTION允许他再向别人授权。用户B又将对“通信录”的UPDATE和SELECT权授予给用户C。后来,用户A回收丁用户B的UPDATE权限,用户c的这种权限自然也被取消了。3.4.3SQL小给sQL有语言一体化、高度非过程化、语言简洁,易于应用的特点。它可以定义关系数据模式,录入数据从而建立数据库。提供查询、更新、维护、数据库安全控制等一系列操作。亦即sQL能够实现数据库系统的全部活动。其全部功能用表3.1便可概括出来。
SQL语言虽然已经被确立为关系数据库的标准语言,但仍然存在某些不足之处。例如,sQL没有提供专门的自然联接操作,必须在w邢RE子句中显式地给出自然联接条件。另外,一个查询可以有很多种写法,而且执行效率也可能不同原统只能根据用户的表达方式进行优化,这就迫使用户花费时间和精力去寻求一个最佳表达方式。阳L语言标准经历了一个不断修订和完善的过程,从阳L86、阳L89、到sQL2、sQL3D现在能够查询对象和表的osQL(obje瓤汲L)正在开发,改进的sQL将支持对象概念,井提供高级接口。在第一章中已经提到,数据字典中存放数据库系统中有关数据的数据,称之为元数据(me施dah)。它提供对数据库数据描述的集中管理手段。内容包括对各级模式的描述,数据库的使用人员等信息。数据字典可以看作是数据库系统自身的小数据库。它既可以供数据库系统人员使用,又可以提供给一般用户使用。因此,数据字典有两方面的作用:1.有利于数据库管理员掌握整个系统结构和系统运行情况。皿A可以通过查问数据字典来监视系统,如已经建立多少个数据库,各个数据库的结构如何,多少个用户在使用系统等,并协助用户完成其应用。
2.方便用户使用系统。用户可以从数据字典中查对某个属性出现在哪个关系中等信息。数据字典在系统设计、实现、运行和扩充各阶段是管理和控制数据信息的有力工具。凹经历了人工字典、计算机文件、专用数据字典系统和数据库管理系统与数据字典一体化四个发展阶段。支持数据字典功能的数据库管理系统能够自动建立和更新数据字典。如oracle的数据字典就是数据库管理系统的—部分,系统自动建立并更新组数据字典表。oracLe数据字典64目多基本表和视图组成,用于记录有关基本表、视图结构描述以及用户授权和完整性约束等系统信息,有的基本表仅供DBA使用。数据字典中约有40个视图,是在数据字典基本表的基础上定义的,可为用户提供数据库的直观信息。其中包括系统的所有用户及其标识,所有数据库对象(如基本表、视图、索引、同义词等)的名称及描述,各种数据库对象的空间分配和使用情况,用户授权信息等。在oracle中,对数据字典公开部分的访问与其它关系一样,可以用5QL直接读取字典内容。例如:内容说明描述了字典中的基本表和视图,给出组成数据字典的所有表的目录清单。cATALOG描述用户可访问的表,包括数据字典。CoL关于用户所建立的基本表中列的定义。置xTENTS基本表内部数据结构内容。SESSIoNs用户使用系统登录记录。5川配AGE分配给用户自建表存放数据相索引的存储空间信息*TAB用户建立的基本表、视图、同义词等清单。vIEws用户对视图的定义。5YsTABAuTH用户相互授权清单。SYSUSERLISTOracle用户清单。SYSUSERAU丁HOracle用户主清单(含有用户口令),只限DBA使用。SYssToRAGE所有数据库存储情况摘要,只限DBA使用。例1:用MMING登录的用户查询数据字典的vIEwS表。SELECTxFROMVIEWS;查询结果包括视图名称、建立者及定义视图的SQI‘语句,如表3—2所示。
本章小结在这一章,我们介绍了关系数据库的标准语言,结构化查询语言sQL。以一个图书管理关系数据模型为基础,通过示例讲解sQI‘的使用方法。sQI。的查询功能十分灵活,用5ELECT—FRoM—wHERE可以实现简单查询、联接查询、嵌套查询、使用库函数查询,并且能够进行集合运算。sQL支持关系数据库的三级模式结构,它的体系结构体现了数据库的三级结构、两级独立的持点。sqL是一种功能齐全的数据库语言。它包括数据的查询、定义、操纵和控制四种功能。sQL数据定义功能包括:定义基本表、定义视图、定义同义词和建立索引。5QL数据操纵功能包括插入数据、更新数据和删除数据。sQL数据控制功能包括用户授权、回收权限。通过使用sQL应当对关系数据库系统有一个全面的认识和了解,除了数据的查询、定义、操纵和控制四种功能之外,还应加深对数据库管理员(DBA)及数据字典(凹)在数据库系统中的功能与作用的理解印认识。