




已阅读5页,还剩142页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.,第3章SQL语言,学习目标了解SQL的基本构成掌握SQL的数据定义语言掌握SQL语言的各种查询的实现掌握SQL语言的数据更新语言掌握视图的定义及其应用,.,3.1SQL概述,SQL(StructuredQueryLanguage,结构化查询语言),是定义和管理关系数据库的国际标准的编程语言。SQL于1974年由Boyce和Chamberlin提出的,并于19741979年由IBM公司的SanJoseResearchLaboratory研制了关系数据库管理系统SystemR上实现了这种功能。,.,3.1.1SQL的发展,SQL语言是定义和管理关系数据库的国际标准的编程语言。所经历的主要阶段如下:1986年,ANSI的数据库委员会发布了文件:X.135-1986数据库语言(简称SQL-86)。1987年,ISO也通过了这一标准。1989年10月,ANSI的数据库委员会发布了文件:X3.135-1989数据库语言-完整和增强的SQL(简称SQL-89)发布,SQL89成为DBMS遵循的新标准。1992年8月,ANSI和ISO共同发布了SQL-92(简称SQL-2)标准。,.,1999年,ISO发布了SQL-99(简称SQL-3)标准。2003年,ISO发布了SQL-2003(简称SQL-4)标准。,.,3.1.2SQL的特点,SQL是一个集数据查询、数据操纵、数据定义和数据控制于一体数据库管理系统语言。主要特点有:综合统一。利用SQL可以独立完成数据库生命周期中的全部活动;高度非过程化。利用SQL实现对关系的操作,用户只需提出“干什么”,无需规定“如何干”;即不需要指定操作过程,也不需要了解存取路径;面向集合的操作方式。一种(语法)结构两种使用方式,表现在:联机使用方式:即自主式语言;,.,嵌入式使用方式:即SQL语句嵌入到某种高级语言的程序中使用。语言简洁,易学易用。SQL功能强大且具有两种不同的使用方式,但语言十分简洁,完成核心功能的语句仅仅只有9个,如下表3-1所示。,表3-1SQL语言的动词,.,3.1.3SQL的组成,SQL语言主要由以下几部分构成:1数据定义功能即SQL的模式语句,主要有:模式的定义、修改、删除功能;索引的定义、修改、删除功能;视图的定义、删除功能;存储过程、触发器等的定义、修改、删除功能;各种完整性约束条件的定义及核查机制。,.,2数据操纵功能即SQL的数据操作语句,主要有:基于关系代数和元组演算的数据查询和数据更新(插入、修改和删除)语句;嵌入式SQL的数据操作语句;事务及其控制语句;3数据控制功能关系、视图的访问权限的设置、取消及核查;SQL的连接语句;其它的控制功能语句。,.,3.1.4SQL查询的基本概念,SQL支持关系数据库的三级模式结构,如下图3-1所示。,.,基本表(Table):是独立存在的表,一个关系对应一个基本表,表中保存同一实体集中各实体的数据。一个或多个基本表对应一个存储文件。一个基本表可以定义若干索引,索引也存储在存储文件中。视图(View):是由基本表或视图导出的虚表,本身不存储实际的数据。在数据库中存储的只是视图的定义。从用户的角度,视图和基本表在概念上是等价的。除此之外,SQL中还有导出表,即查询结果集。是根据基本表或视图查询得到的结果集。约束和断言(ConstraintAndAssertion):是标识有效数据集合的命名规则。它们为表、行或域(列)限定了相容的数据;并定义了两个检查特性:延迟模式和约束核查时间。,.,断言是与一些模式有关;常以核查约束的形式出现;约束是与一些表或域有关。在实际的DBMS产品中常以核查约束或规则的形式出现。触发器(Trigger):是与单一基本表相关联的命名规则。每个触发器定义一个触发器事件,规定了对表进行更新操作时在表中产生的一个触发动作;触发时间规定了被触发动作发生的时间是在触发事件之前或之后。SQL调用例程(SQLInvokedRoutine):SQL调用例程是有一些模式或模块组成。由系统定义:称为调用例程或过程;由用户定义:称为自定义函数或存储过程。,.,SQL中要定义的数据对象有许多,基本的有:基本表、视图、索引等,这些都由SQL的数据定义语句来实现如下表3-2。先讨论基本表和索引的相关定义语句。,3.2SQL的数据定义语言,表3-2SQL的数据定义语句,.,根据实验将要使用的具体的DBMS产品是SQLServer,详见补充1。,3.2.1数据库的定义、删除与修改,.,1数据库的创建使用Transact-SQL语句CREATEDATABASEON,n,nLOGON,nCOLLATE其中:,.,:=PRIMARY(NAME=,FILENAME=OS文件的路径及名字,SIZE=文件初始大小,MAXSIZE=最大值|UNLIMITED,FILEGROWTH=文件大小增量值):=FILEGROUP,.,例1:CreateDatabasesale_management_dataOnPrimary(Name=sale_file1,Filename=e:sale_systemdatasale_file1.mdf,Size=100MB,MaxSize=2000MB,FileGrowth=10MB),(Name=sale_file2,Filename=e:sale_systemdatasale_file2.ndf,Size=10MB,MaxSize=1000MB,FileGrowth=10),.,Logon(Name=sale_log,Filename=f:sale_systemdatasale_log.ldf,Size=10MB,MaxSize=1000MB,FileGrowth=10MB)说明:Database_name:要建立的数据库的逻辑名称。要求:整个SQLServer服务器唯一;长度不超过128个字符。ON与LOGON:指定数据库的数据文件、文件组和日志文件。当有多个数据文件或日志文件是,彼此之间要用“,”分隔。对于关键字PRIMARY,若有,指定其后的的数据文件属于主文件组;若没有,则第一个数据文件是主文件。,.,SIZE参数:指定数据文件或日志文件的初始大小。单位可以是KB、MB、GB、TB。对主数据文件,其最小值应等于model数据库中主数据文件的大小。若省略时,默认数据文件和日志文件大小为1MB(主数据文件除外)。MAXSIZE参数:指定数据文件或日志文件可以增加到的最大容量。若省略时,默认到磁盘空间用尽为止(相当于MAXSIZE=UNLIMITED)。FILEGROWTH参数:指定数据文件或日志文件的空间的每次增长量。有绝对增长量(不能小于64KB)和相对增长量两种方式。,.,2数据库的修改数据库创建完毕后,可能根据需要须修改数据库本身的各项设置,主要包括:更改数据库名称扩充数据文件或日志文件空间;收缩数据文件或日志文件空间;添加或删除数据文件或日志文件;创建文件组;改变默认文件组;更改数据库的配置设置;更改数据库的所有者。,.,使用Transact-SQL语句ALTERDATABASEADDFILE,nTOFILEGROUP|ADDFILEGROUP|ADDLOGFILE,n|REMOVEFILE|REMOVEFILEGROUP|MODIFYFILE|MODIFYNAME=|MODIFYFILEGROUPfilegroup_property|NAME=,.,其中::=(NAME=,NEWNAME=,FILENAME=OS文件的路径及名字,SIZE=文件的初始大小,MAXSIZE=最大的文件容量,FILEGROWTH=文件大小增量)说明:注意各功能子句的作用;与“创建数据库”基本相同,仅多了一个“NEWNAME”项。,.,MODIFYFILE子句:修改指定的数据文件。每次修改时,只能修改FILENAME、SIZE、FILEGROUP、MAXSIZE属性中的一项。使用该命令改变数据文件容量时,只能增加不能减少。,.,3数据库的删除使用Transact-SQL语句DROPDATABASE,在SQLServer中,只有数据库所有者和sysadmin、dbcreator固定服务器角色才有权限删除数据库。当删除数据库时,其数据文件和事务日志文件也会同时被删除。,.,建立数据库后最重要的一类定义就是定义基本表,首先介绍SQL-3中的数据类型,如表3-3所示。,3.2.2基本表的定义、删除与修改,表3-3SQL-3中的数据类型,.,.,1基本表的定义语法格式:CREATETABLE(,)=,=(,)DEFAULTNOTNULLUNIQUECONSTRAINT()=PRIMARYKEY(),FOREIGNKEY()REFERENCES()CHECK(expL),.,说明:DEFAULT:默认值设定。当有该选项时,在进行数据插入时若没有指定该列的值时,就自动取为默认值;NOTNULL:是否允许空值设定。当有该选项时,在进行数据插入时必须为该列指定具体值;UNIQUE:值的唯一性设定。当有该选项时,整个表中该列值唯一;CONSTRAINT():列级完整性设定。列级完整性是一个条件表达式。若有该选项时,则在对该列数据进行更新时其值必须满足相应的条件。,.,若在该列上定义了几个约束,则该列的取值必须是几个条件表达式所限定值集的交集。表级完整性约束主要有三类:PRIMARYKEY():主码约束设定。用来定义表中所有的记录必须满足的实体完整性;一个表只能有一个主码。FOREIGNKEY()REFERENCES(:外码约束设定。用来定义表中的外码以及外码引自于哪个表;一个表可以有多个外码。CHECK(expL):核查约束设定。用来定义表中同一记录内不同的属性之间必须满足的依赖(函数)关系。,.,基本表定义举例例:学生-选课数据库中的四个表的定义。专业设置表(专业编号,系名,专业名);学生情况表(学号,姓名,性别,出生日期,入学年份,专业编号);课程设置表(课程编号,课程名称,学时数,学分,先修课程号);学生选课(学号,课程编号,成绩)。,.,CREATETABLEMajor(major_noCHAR(3)NOTNULLCONSTRAINTmajor_const(major_nolike1-90-90-9andmajor_nonotlike100),departmentVARCHAR(30)NOTNULL,specialityVARCHAR(30)NOTNULL,PRIMARYKEY(major_no)CREATETABLEStudent(snoCHAR(10)NOTNULLCONSTRAINTsno_const(snolike1-90-90-90-91-90-90-91-90-90-9andsubstring(sno,9,2)notlike00),.,snameCHAR(10)NOTNULL,sexCHAR(2)NOTNULLCONSTRAINTsex_const(sexIN(“男”,“女”),birthdayDATENOTNULLCONSTRAINTbith_const(birthday=0andscore,!=20ANDsage=70WHERE子句与HAVING短语的区别:WHERE子句作用于表或视图;HAVING短语作用于组,且只能出现在GROUPBY子句中。,.,凡是在一个查询的FROM子句中有两个或两个以上的查询对象的,都是连接查询。连接查询是关系数据库中最主要的查询形式。具体有:等值连接、自然连接、非等值连接、自身连接、外连接和复合条件查询等。连接条件WHERE子句中表示两个表的条件称为连接条件或连接谓词。决定了两个关系中哪些元组相互匹配、连接结果中出现那些属性(列)。在连接条件或连接谓词中的列名称为连接字段。在连接条件各连接字段不一定同名,但必须是可比的。,3.3.2连接查询,.,连接谓词的一般格式:/./.=、=、和是同一列名:称为自然连接查询,前必须有前缀,这种查询是最常用的一种;/.BETWEEN/.AND/.若查询语句的FROM子句中有多个查询对象而又没有WHERE子句:称为笛卡尔积。,.,若一个查询语句的WHERE子句有多个连接谓词:称为复合连接查询,这种查询是最传统的查询形式。无论是哪一种连接谓词,若查询对象是同一个表(必须取不同的别名,连接谓词中使用别名):称为自身连接查询。连接查询的机制嵌套循环法(NESTED-LOOP)和笛卡尔积的构造方式完全一样。排序合并法(SORT-MERGE)(常用于=连接)首先按连接属性对表1和表2排序;,.,对表1的第一个元组,从头开始扫描表2,顺序查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。当遇到表2中第一个大于表1连接字段值的元组时,对表2的查询不再继续;找到表1的第二个元组,然后从刚才的中断点处继续顺序扫描表2,重复和上一步相似的操作;重复上述操作,直到表1中全部元组都处理完。索引连接(INDEX-JOIN)对表2按连接字段建立索引;对表1中的每个元组,依次根据连接字段值查询表2的索引,当找到满足条件的元组时,就将两个表中的元组拼接起来,形成一个结果表中元组。,.,连接类型连接类型决定了如何处理连接条件不满足(不匹配)的元组。SQL-3中允许的连接类型和连接条件如下:连接类型:INNERJOIN(内连接)、LEFTOUTERJOIN(左外连接)、RIGHTOUTERJOIN(右外连接)、FULLOUTERJOIN(完全外连接);连接条件:NATURAL、ON,.,复合条件查询,所谓复合条件查询指的是WHERE子句中含多个连接条件。例1:查询选修了课程号是S11-01且成绩在80分(含80分)以上的学生的学号、姓名、成绩。SELECTS.sno,sname,cname,scoreFROMstudentasS,select_courseasSCWHERES.sno=SC.snoandSC.cno=S11-01andscore=80例2:查询平均成绩在75分以上(含75分)的学生学号、姓名、选课门数、最高成绩、最低成绩和平均成绩。,.,SELECTS.snoas学号,snameas姓名,COUNT(DISTINCTcno)as选课门数,MAX(score)as最高成绩,MIN(score)as最低成绩,AVG(score)as平均成绩FROMStudentasS,Select_CourseasSCWHERES.sno=SC.snoGROUPBYS.snoHAVING平均成绩=75例3:查询学生学号、姓名、选修的课程名及成绩。SELECTS.snoas学号,snameas姓名,cnameas课程名,scoreas成绩FROMStudentasS,Select_CourseasSC,CourseWHERES.sno=SC.snoandSC.cno=Co,.,例4:查询所有课程都及格的学生的学号、姓名、最高成绩、最低成绩和平均成绩。SELECTS.snoas学号,snameas姓名,MAX(score)as最高成绩,MIN(score)as最低成绩,AVG(score)as平均成绩FROMStudentasS,Select_CourseasSCWHERES.sno=SC.snoGROUPBYS.snoHAVING最低成绩=60,.,例5:查询选修了课程号是C02-01所有同学的学号、姓名、性别、出生日期和级别。SELECTS.sno,sname,sex,birthday_date,enter_dateFROMStudentasS,select_courseasSCWHERES.sno=SC.snoandcno=C02-01例6:查询选修了高等数学所有同学的学号、姓名、性别、系名、专业、出生日期和级别。SELECTS.sno,sname,sex,department,speciality,birthday_date,enter_dateFROMStudentasS,select_courseasSC,CourseasC,MajorasMWHERES.sno=SC.snoandSC.cno=C.CnoandS.major_no=M.major_noandcnamelike高等数学,.,例7:查询成绩至少比选修了课程号C02-01的某一个学生的成绩要高的学生的学号、姓名、性别和级别。SELECTDISTINCTS.sno,sname,sex,enter_dateFROMStudentasS,Select_CourseasSCX,Select_CourseasSCYWHERES.sno=SCX.snoandSCX.scoreSCY.scoreandSCY.cno=C02-01,.,连接查询,所谓连接查询指的是表之间的关系通过各表中字段的值相等的连接关系来实现。连接关系一般SELECT命令的FROM子句中表示,而WHERE子句则进一步对要查询的记录加以限制;这种查询的FROM子句的一般形式是:FROMASINNER/LEFTOUTER/RIGHTOUTERJOINASON.=.和应该是相同的字段名(推荐使用方式),若是不同的名字,则必须是数据类型和值域相同。,.,1内连接内连接实际上是等值连接,关键字是INNERJOIN.ON。连接的字段通常名字相同;查询结果集中仅包括两个表中连接字段相等(相匹配)的情况;若将关键字是INNER换成NATURAL就变成了自然连接。,.,例1:查询平均成绩在75分以上(含75分)的学生学号、姓名、选课门数、最高成绩、最低成绩和平均成绩。SELECTS.snoas学号,snameas姓名,COUNT(DISTINCTcno)as选课门数,MAX(score)as最高成绩,MIN(score)as最低成绩,AVG(score)as平均成绩FROMStudentasSINNERJOINSelect_CourseasSCONS.sno=SC.snoGROUPBYS.snoHAVING平均成绩=75,.,例2:查询选修了课程号是S11-01且成绩在80分(含80分)以上的学生的学号、姓名、性别、课程名、年龄、成绩。SELECTS.sno,sname,sex,cname,year(getdate()-year(birthday_date)assage,scoreFROMstudentasSINNERJOINSelect_CourseasSCONS.sno=SC.snoINNERJOINCourseasCONSC.cno=C.cnoWHERSC.cno=S11-01andscore=80,.,例3:查询所有选修了高等数学的学生的学号、姓名、性别、系名、专业、出生日期和级别。SELECTS.sno,sname,sex,department,speciality,birthday_date,enter_dateFROMStudentasSINNERJOINselect_courseasSCONS.sno=SC.snoINNERJOINCourseasCONSC.cno=C.cnoINNERJOINMajorasMONS.major_no=M.major_noWHEREcnamelike高等数学,.,2外连接关键字是:LEFT/RIGHT/FULLOUTERJOIN.ON。查询结果集中不仅包括两个表中连接字段相等(相匹配)的情况,而且包括两个表中连接字段不匹配的情况。参与连接的两个表有左,右的次序。左外连接以左表为主,关键字是LEFTOUTERJOIN.ON。其处理过程是:先内连接。处理两个表中连接字段相匹配的记录;,.,然后处理不匹配的记录。对于左边表中每一条在右边表中不匹配的记录t:结果集中有一条记录r,r从左边表中得到的字段就是记录t,而其它来自右边表中的字段值全被赋为空(NULL)。例1:查询学生的学号、姓名、级别、选课编号。SELETS.sno,sname,sex,enter_year,cnoFROMStudentasSLEFTOUTERJOINSelect_CourseasSCONS.sno=SC.sno在上例中,左表是学生情况表(Student),右表是学生选课表(Select_Course)。查询结果表中不仅有已选课的学生及其选课情况,而且有未选课的学生情况。,.,例2:查询未选修任何课程的同学的学号、姓名、性别、级别、专业编号。SELETS.sno,sname,sex,enter_year,major_noFROMStudentasSLEFTOUTERJOINSelect_CourseasSCONS.sno=SC.snoWHERcnoISNULL,.,右外连接以右表为主,关键字是RIGHTOUTERJOIN.ON。其处理过程是:先内连接。处理两个表中连接字段相匹配的记录;然后处理不匹配的记录。对于右边表中每一条在左边表中不匹配的记录t:结果集中有一条记录r,r从右边表中得到的字段就是记录t,而其它来自左边表中的字段值全被赋为空(NULL)。例3:查询学生的学号、姓名、选课的课程号、成绩。SELETS.sno,sname,cno,scoreFROMStudentasSRIGHTOUTERJOINSelect_CourseasSCONS.sno=SC.sno,.,在上例中,左表是学生情况表(Student),右表是学生选课表(Select_Course)。查询结果表中不仅有已被学生选修的课程情况,而且有未被学生选修的课程情况。例4:查询没有任何同学选修的课程的课程编号、课程名称、学时数、学分。SELETC.cno,cname,class_hourse,study_numFROMSelect_CourseasSCRIGHTOUTERJOINCourseasCONSC.cno=C.cnoWHERSC.snoISNULL,.,全外连接全外连接是左外连接和右外连接的组合,关键字是FULLOUTERJOIN.ON。其处理过程是:先内连接。处理两个表中连接字段相匹配的记录;然后处理与左边表的记录不匹配的情况。对于左边表中每一条在右边表中不匹配的记录t:结果集中有一条记录r,r从左边表中得到的字段就是记录t,而其它来自右边表中的字段值全被赋为空(NULL)。最后处理与右边表的记录不匹配的情况。对于右边表中每一条在左边表中不匹配的记录t:结果集中有一条记录r,r从右边表中得到的字段就是记录t,而其它来自左边表中的字段值全被赋为空(NULL)。,.,3.3.3嵌套查询,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。子查询的限制:不能使用ORDERBY子句。层层嵌套方式反映了SQL语言的结构化;有些嵌套查询可以用连接运算替代;不相关子查询(嵌套子查询):子查询的查询条件不依赖于父查询;相关子查询(相关查询):子查询的查询条件依赖于父查询。,.,嵌套子查询,是由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。嵌套子查询的WHERE子句的一般形式是:WHERE(SELECTFROM.):=NOTIN,ANY/SOME/ALL=,=,!=其中:=SOME(或=ANY)与IN等价:ALL与NOTIN等价。,.,1集合成员资格测试使用了集合运算符NOTIN,实际上是测试元组是否是另一个关系中的成员。例1:查询选修了课程号是C02-01所有同学的学号、姓名、性别、出生日期和级别。SELECTsno,sname,sex,birthday_date,enter_dateFROMStudentWHEREsnoIN(SELECTsnoFROMSelect_CourseWHEREcno=C02-01)连接查询可以等同写一个嵌套子查询,但反过来却不一定成立。,.,例2:查询所有选修了高等数学的同学的学号、姓名、性别、出生日期和级别。SELECTsno,sname,sex,birthday_date,enter_dateFROMStudentWHEREsnoIN(SELECTsnoFROMSelect_CourseWHEREcnoIN(SELECTcnoFROMCourseWHEREcnameLIKE高等数学)当查询涉及到多个表时,利用嵌套子查询来逐层分解,使得整个查询模块层次分明、结构清晰。实际上,查询优化处理的结果也是表示成这种形式。,.,例3:查询所有选修了数据库的同学的学号、姓名、性别、系名、专业和级别。SELECTDISTINCTsno,sname,sex,department,speciality,enter_dateFROMStudentASS,MajorASMWHERES.major_no=M.major_noandsnoIN(SELECTsnoFROMSelect_CourseWHEREcnoIN(SELECTcnoFROMSelect_CourseWHEREcnameLIKE数据库%),.,例4:查询选修课程号为S10-01而未选修课程号为C02-01所有同学的学号、姓名、性别、系名、专业和级别。SELECTDISTINCTsno,sname,sex,department,speciality,enter_dateFROMStudentASS,MajorASMWHERES.major_no=M.major_noandsnoIN(SELECTsnoFROMSelect_CourseASSCXWHERESCX.cno=S10-01andSCX.snoNOTIN(SELECTsnoFROMSelect_CourseASSCYWHERESCY.cnoC02-01),.,2集合成员的比较例5:查询成绩至少比选修了课程号是C02-01的某个同学的成绩要高的学生的学号、姓名、性别和级别。分析:选修了课程号是C02-01的学生成绩有许多,是一个成绩集合。至少比某个要高(大、低、小)实际上是和集合中的成员比较;元组与集合中的成员比较需要使用相应的量词:部分量词(SOME,ANY)和全称量词(ALL);短语“至少比要高(大、低、小)”的集合成员比较用ANY;而“比所有要高(大、低、小)”的集合成员比较用ALL。,.,SELECTsno,sname,sex,enter_dateFROMStudentWHEREsnoIN(SELECTsnoFROMSelect_CourseASSCXWHERESCX.scoreANY(SELECTscoreFROMSelect_CourseASSCYWHERESCY.cno=C02-01)ANY和ALL谓词有时可以用集函数实现,如表3-6。,表3-6ANY与ALL与集函数的对应关系,.,相关子查询,1相关子查询查询思想相关子查询是由外向里逐层判断,与嵌套子查询的处理方向正好相反。是利用存在量词EXISTS构造的子查询,其查询思想是:首先取外层查询中表的第一个元组,根据它与内层查询相关关系(相应的属性值的关系)处理内层查询,若内层查询的WHERE子句返回值为真,则取此元组放入结果表;然后再取外层表的下一个元组;重复这一过程,直至外层表全部检查完为止。,.,EXISTS谓词带有EXISTS谓词的子查询不返回具体数据,只是用来测试子查询的结果集是否为空,即只产生逻辑真值“true”或逻辑假值“false”。若内层查询结果非空:则返回真值;若内层查询结果为空:则返回假值。由EXISTS引出的子查询,其目标列表达式只能用*,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。NOTEXISTS谓词与EXISTS谓词的含义刚好相反。,.,例6:查询选修了课程号是C02-01所有同学的学号、姓名、性别、出生日期和级别。方法一:用复合条件查询SELECTsno,sname,sex,birthday_date,enter_dateFROMStudentASS,Select_CourseASSCWHERES.sno=SC.snoandSC.cno=C02-01方法二:用嵌套子查询SELECTsno,sname,sex,birthday_date,enter_dateFROMStudentWHEREsnoIN(SELECTsnoFROMSelect_CourseWHEREcno=C02-01),.,方法三:用相关子查询SELECTsno,sname,sex,birthday_date,enter_dateFROMStudentASSWHEREEXISTS(SELECT*FROMSelect_CourseASSCWHEREsno=S.snoandSC.cno=C02-01)例7:查询没有选修S11-02号课程的学生的学号、姓名、性别、出生日期和级别。SELECTsno,sname,sex,birthday_date,enter_dateFROMStudentASSWHERENOTEXISTS(SELECT*FROMSelect_CourseASSCWHEREsno=S.snoandSC.cno=C02-01),.,2用EXISTS/NOTEXISTS实现全称量词SQL语言中没有全称量词(Forall);可以把带有全称量词的谓词转换为等价的带有存在量词的谓词演算:(x)P(x(P)例8:查询选修了全部课程的学生的学号、姓名、性别和级别。没有全称量词,将题目的要求换一种说法:查询这样的学生,没有一门课程是他不选修的。则对应的SQL语句是:SELECTsno,sname,sex,enter_yearFROMStudentASSWHERENOTEXISTS,.,(SELECT*FROMCourseASCWHERENOTEXISTS(SELECT*FROMSelect_CourseASSCWHEREsno=S.snoANDcno=C.cno)3逻辑蕴涵的处理SQL中没有表示逻辑蕴涵(Implication)的运算,但可以用等价变换将逻辑蕴涵转换为等价的带有存在量词的谓词演算:PqPq例5:查询至少选修了学生2014414208选修的全部课程号的学生的学号、姓名、性别和级别。分析:本查询是典型的逻辑蕴涵关系。,.,谓词p:学生2014414208选修了课程y;谓词q:学生x选修了课程y;上述例题的查询要求可表示为:(y)Pq(y)Pq(y(Pq)(y(Pq)(y(Pq)表示的直接含义是:不存在这样的课程y,学生2014414208选修了,而学生x没有选修。则对应的SQL语句是:,.,SELECTsno,sname,sex,enter_dateFROMStudentWHEREsnoIN(SELECTDISTINCTsnoFROMSelect_CourseASSCXWHERENOTEXISTS(SELECT*FROMSelect_CourseASSCYWHERESCY.sno=2002414208ANDNOTEXISTS(SELECT*FROMSelect_CourseASSCZWHERESCZ.sno=SCX.snoANDSCZ.sno=SCY.sno),.,4不同形式的查询间的替换一些带EXISTS或NOTEXISTS谓词的子查询不能被其他形式的子查询等价替换;所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换;一些带EXISTS或NOTEXISTS的相关子查询不能用其他形式的子查询来表示。,.,3.3.4集合查询,SQL-3支持的集合查询操作有:并操作(UNION)、交操作(INTERSECT)、差操作(MINUS)。1并操作(UNION)查询并操作查询的基本形式是:UNION参加UNION操作的两个查询:和目标列必须完全相同(结果表的列数必须相同,对应项的数据类型也必须相同)。,.,例1:查询专业号是414或年龄不大于19岁的学生。方法一:用复合条件查询SELECTDISTINCT*FROMStudentWHEREmajor_no=414ORyear(getdate()-year(enter_date)=60)ASresult_set(sno,max_score,min_score,avg_score)ONS.sno=result_set.sno,.,例2:对于课程号M01-01,查询出成绩在平均成绩以上的所有学生的学号,姓名,成绩。SELECTS.sno,sname,scoreFROMselect_courseasS,(SELECTSC.cno,avg(SC.score)ASavg_scoreFROMselect_courseasSCWHERESC.cno=M01-01GROUPBYSC.cno)ASavgsWHERES.cno=M01-01andS.scoreavg_score,.,例3:查询没有任何同学选修的课程的信息。SELECT*FROMcourseasST,(SELECTsno,C.cnoFROMselect_courseasSCRIGHTOUTERJOINcourseasCONSC.cno=C.cnoWHEREsnoisNULL)asSTCWHEREST.cno=STC.cno,.,SQL的数据更新包括插入、修改和删除三种操作。,3.4SQL的数据更新,.,3.4.1数据插入,数据插入有两种方式:插入单个元组;插入子查询的结果。1插入单个元组语句格式:INSERTINTO(,)VALUES(,)功能:将新元组插入指定表中。,.,说明:INTO子句指定要插入数据的表名及属性列;属性列的顺序可与表定义中的顺序不一致;没有指定属性列:表示要插入的是一条完整的元组,且属性列属性与表定义中的顺序一致;指定部分属性列:插入的元组在其余属性列上取:空值:若表定义时没有指定NOTNULL;默认值:若表定义时指定SETDEFAULT。VALUES子句提供所要插入的列对应的值。值必须与INTO子句中指定的属性列相匹配:,.,值的个数:个数相同,特别是未指定列时;值的类型:必须在关系模式中的相应域中。例1:将一个新学生记录:(学号:2014414124;姓名:陈冬声;性别:男;出生年月:07/21/97;级别:2014;专业号:414)插入到Student表中。INSERTINTOStudentVALUES(2014414124,陈冬声,男,07/21/97,2014,414)例2:插入一条选课记录(2014414124,C02-01)。INSERTINTOSC(Sno,Cno)VALUES(2014414124,C02-01)新插入的记录在score列上取空值。,.,2插入多个元组在许多实际的应用中,在查询的基础上,将查询的结果插入到某个表中,这种插入就是多元组的插入。语句格式:INSERTINTO(,)功能:将子查询结果插入指定表中。说明:INTO子句(同单个元组的插入)。子查询:SELECT子句的目标列必须与INTO子句中指定的属性列相匹配(同单个元组的插入)。,.,例3:根据要求,将每个学生学号、最高成绩、最低成绩、平均成绩的统计结果插入到数据库中。首先定义一个表CREATETABLECalculate_Score(snoCHAR(10)NOTNULL,max_scoreNUMERIC(6,2),min_scoreNUMERIC(6,2),avg_scoreNUMERIC(6,2),PRIMARYKEY(sno)然后从数据库中查询所需信息插入到表中INSERTINTOCalculate_ScoreSELECTsno,MAX(score),MIN(score),AVG(score)FROMSelect_CourseGROUPBYsno,.,例4:根据要求,将每个学生学号、姓名、最高成绩、最低成绩、平均成绩的统计结果插入到数据库中。首先定义一个表CREATETABLECalculate_Gard(snoCHAR(10)NOTNULL,snameCHAR(10)NOTNULL,Max_scoreNUMERIC(6,2),min_scoreNUMERIC(6,2),avg_scoreNUMERIC(6,2),PRIMARYKEY(sno),FROGINKEY(sno)REFERENCESStudent(sno),.,然后从数据库中查询所需信息插入到表中INSERTINTOCalculate_GardSELECTsno,sname,max_score,min_score,a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 家居用品佣金合同
- 餐厅合作入股合同范本
- 餐饮设备采购合同范本
- 酒水回收销售合同范本
- 上海窗帘加盟合同范本
- 道路绿化保养合同
- 焊接水管合同范本
- 管道拆装维修合同范本
- 光缆熔接施工合同范本
- 工业围挡租赁合同范本
- 妊娠期合并症-心脏病的护理(妇产科学课件)
- 急救护理学高职PPT完整全套教学课件
- AutoCAD计算机辅助设计标准教程(中职)PPT完整全套教学课件
- 安全生产费用使用范围及计量办法
- 肾脏疾病常见症状和诊疗
- 安全环保职业卫生消防题库及答案
- 数据中心负荷计算方法
- 金X绅士无双攻略
- 第八章 立体几何初步(章末复习) 高一数学 课件(人教A版2019必修第二册)
- GB/T 27518-2011西尼罗病毒病检测方法
- GB/T 26255-2022燃气用聚乙烯(PE)管道系统的钢塑转换管件
评论
0/150
提交评论