已阅读5页,还剩192页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章关系数据库标准语言SQL(8-10学时),主讲:曹志英副教授大连海事大学计算机科学与技术学院研究方向:软件工程与理论数据库与信息系统电话:84729625Email:czy_sophy,数据库原理和语言,2005年8月6日,引言,SQL=StructuredQueryLanguageSQL是一种介于关系代数与关系演算之间的结构化查询语言,其功能:不仅仅是查询;还是一个通用的、功能极强的关系数据库语言。,目录,3.1SQL语言的基本概念与特点(P84-P87)3.2数据定义(P87-P91)3.3查询(P91-P116)3.4数据更新(P117-P121)3.5视图(P121-P129)3.6数据控制(P129-P133)3.7嵌入式SQL(P133-P148,可略/简述),3.1SQL语言的基本概念与特点,3.1.1SQL语言的发展及标准化3.1.2SQL语言的特点3.1.3SQL语言的基本概念,3.1.1SQL语言的发展及标准化,SQL(StructuredQueryLanguage):是关系数据库标准语言。u1974年:Boyce和Chamberlin提出。u19751979年:IBM公司SanJoseResearchLaboratory研制了SystemR(DBMS原型),实现了这种语言。u1986年10月,SQL经美国国家标准局批准成为关系数据库语言的美国国家标准。同年公布SQL的标准文本SQL-86。u1987年,ISO通过了这一标准,后经ANSI修改和完善,逐步发布SQL-89,SQL-92,SQL-99。SQL语言现已成为数据领域的一个主流语言。,3.1.2SQL语言的特点,集数据定义、数据查询、数据操纵、数据控制于一体。综合统一高度非过程化语言面向集合的操作方式以同一种语法结构提供两种使用方式自含式语言:联机交互的使用方式嵌入式语言:嵌入高级语言如C,COBOL,FORTRAN,PB等语言简洁,易学易用,SQL语言的动词,3.1.3SQL语言的基本概念,基本表(BASETABLE):是独立存在的表,一个关系对应一个基本表,一个或多个基本表对应一个存储文件,一个表可带若干个索引。存储文件的逻辑结构组成了关系数据库的内模式,物理结构是任意的,对用户透明。视图(VIEW):是一个虚拟的表,是从一个或几个基本表导出的表。它本身不独立存在于数据库中,数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中。当基本表中的数据发生变化时,从视图中查询出来的数据也随之改变。外模式对应于视图和部分基本表,模式对应于基本表,内模式对应于存储文件。,图3.1SQL语言支持的关系数据库的三级逻辑结构(P87),引用返回,3.2数据定义(P87-P91),3.2.0概述3.2.1字段数据类型3.2.2创建、修改和删除数据表3.2.3设计、创建和维护索引,3.2.0概述,SQL数据定义功能,支持三级模式:即包括对基本表、视图、索引的定义功能。由于视图是依赖基本表的“虚表”,索引依附于基本表。所以SQL通常不提供对视图的修改,以及索引的修改功能。要想修改视图定义或索引定义只能先将它删除掉,然后再重建。不过有的DBMS支持视图的修改。,SQL数据定义语句,3.2.1字段数据类型,SQL语句的数据类型应DBMS的不同而有所差异,常用的数据类型有:字符型:char(n)、varchar(n)数值型:integer(n)全字长二进制整数smallint(n)、tinyint(n)半字长二进制整数decimal(p,d)、numeric(p,d)压缩十进制数日期/时间型:date(yyyy-mm-dd)time(hh:mm:ss)timestamp(日期加时间),3.2.2创建、修改和删除数据表,3.2.2.1创建数据表3.2.2.2修改基本表3.2.2.3删除基本表,3.2.2.1创建基本表,1.基本表是关系数据库的基本组成单位,它物理地存储于数据库的文件中。2.创建基本表的SQL语法格式CREATETABLE(列级完整性约束条件,列级完整性约束条件,表级完整性约束条件);3.注意:表名是所要定义的基本表的名称,必须是合法标识符。列名是每个表所含的属性(字段名)。一个表有多个属性。定义各个列/属性时要指明其数据类型。对列定义最基本要求:类型,长度,能否为空值。关键字的大写(大小写无所谓,但为区别,作为习惯最好大写),语句的分号结束。,例1:建立一个“学生表”Student,它由学号(Sno),姓名(Sname),性别(Ssex),年龄(Sage)所在系(Sdept)五个属性组成,其中学号不能为空:且姓名取值也唯一。(P88)CREATETABLEStudent(SnoChar(5)NotNULLUNIQUE,SnameChar(20)UNIQUE,SsexChar(2),SageInt,SdeptChar(15);对于不同的DBMS,所支持到的类型不完全相同,建表时参照系统手册。注意:表名必须是合法标识符定义各个属性时要指明其数据类型,再例:创建课程(course)表:Createtablecourse(cnochar(2)primarykey,cnamechar(40)unique,ccreditinteger,ctimeint,);创建选课(sc)表:Createtablesc(cnochar(2),snochar(5),gradesingle);,4.定义完整性约束基本语法格式:CONSTRAINT注意:若不指定约束名,系统会自动取名,对于基本表的约束分为列约束和表约束:列约束是对某一个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名;表约束与列定义相互独立,不包括在列定义中。通常用于对多个列一起进行约束,与列定义用,分隔。定义表约束时,必须指出要约束的那些列的名称。,约束的命名,属性约束Namechar(10)ConstraintNameIsKeyprimaryKey元组约束ConstraintRightTitleCheck(gender=FORnameNotLikeMs.%)主码约束Constraintpk_stuPrimaryKey(sno),参照约束Constraintfk_sc_stuForeignKey(sno)Referencesstudent(sno),约束的类型与实例*,(1)PRIMARYKEY约束(2)NULL/NOTNULL约束(3)UNIQUE约束(4)CHECK完整性约束(5)FOREIGNKEY约束(6)DEFAULT约束(7)PRIMARYKEY与UNIQUE,(1)PRIMARYKEY约束,定义主键,起唯一标识作用,其值不能为NULL,也不能重复用于定义列约束时:CONSTRAINTPRIMARYKEY,CreateTableMovieStar(namechar(30)PrimaryKey,addressVarchar(255),genderchar(1),birthdayDate);,CreateTableMovieStar(namechar(30)constraintpk_namePrimaryKey,addressVarchar(255),genderchar(1),birthdayDate);,用于定义表约束时,即将某些列的组合定义为主键:CONSTRAINTPRIMARYKEY(,),CreateTableMovieStar(namechar(30),addressVarchar(255),genderchar(1),birthdayDate,PrimaryKey(name);,CreateTableMovie(titlechar(20),namechar(30),yearinteger,incolorboolean,studionamechar(20),producerC#integer,constraintpk_tnPrimaryKey(title,name);,(2)NULL/NOTNULL约束,只能用于定义列约束CONSTRAINTNULL|NOTNULL在定义属性时,约束该属性不可取NullSnamechar(20)notnull不加约束:隐含允许NullPrimaryKey约束:隐含NotNull,(3)UNIQUE约束,UNIQUE约束用于指明基本表在某一列或多个列的组合上的取值必须唯一定义列约束:CONSTRAINTUNIQUE定义表约束:CONSTRAINTUNIQUE(,),CreateTableMovieStar(namechar(30)PrimaryKey,IDchar(18)Unique,addressVarchar(255),genderchar(1),birthdayDate);,CreateTableMovieStar(namechar(30),IDchar(18),addressVarchar(255),genderchar(1),birthdayDate,PrimaryKey(name),Unique(ID);,(4)CHECK完整性约束,CHECK约束用来检查字段值所允许的范围表约束与列约束语法格式为:CONSTRAINTCHECK()列级约束:在定义属性时约束该属性必须使Check中的条件为True表级约束:存在于关系定义中的Check对关系中的当前元组的约束不适于多关系、子查询,【例】建立考生登记表,要求考号非空且惟一,年龄小于65,性别只能是“男”或“女”,姓名非空。,CREATETABLEExaminee(EnoCHAR(14),EnameCHAR(10)NOTNULL,EageINTCONSTRAINTY1CHECK(Eage65),EsexCHAR(2)CONSTRAINTY2CHECK(EsexIN(男,女),PRIMARYKEY(Eno);,【例】建立考生成绩登记表,要求各科成绩之和=800。CREATETABLEExgrade(EnoCHAR(14),CompositionDECIMAL(4,2),MathDECIMAL(4,2),EnglishDECIMAL(4,2),SynthesisDECIMAL(4,2),CONSTRAINTYS1CHECK(Composition+Math+English+Synthesis=800));,(5)FOREIGNKEY约束,FOREIGNKEY约束指定某一个列或一组列作为外部键,其中:包含外部键的表,称为从表;包含外部键所引用的主键或唯一键的表,称主表。系统保证从表在外部键上的取值要么是主表中某一个主键值或唯一键值,要么取空值。以此保证两个表之间的连接,确保了实体的参照完整性。,定义列约束:CONSTRAINTREFERENCES()属性级/列级:Createtablesc(Cnochar(2)constraintfk_cnoreferencescourse(cno),Snochar(5)constraintfk_snoreferencesstudents(sno),gradesingle);,定义表约束:CONSTRAINTFOREIGNKEY()REFERENCES()实例Createtablesc(cnochar(2),snochar(5),gradesingle,constraintfk_snoforeignkey(sno)referencesstudents(sno),constraintfk_cnoforeignkey(cno)referencescourse(cno);,(6)DEFAULT约束,如果用户在插入新行时没有显示为列提供数据,系统将默认值赋给该列只能用于定义列约束语法格式:CONSTRAINTDEFAULT表达式实例:CreatetableDynamic_data(ModifyDatechar(30)DefaultTimeStamp,d_valueinteger);AlterTablestudentsAddIDintegerDefaultAutoIncrement;,(7)PRIMARYKEY与UNIQUE,PRIMARYKEY与UNIQUE约束类似,通过建立唯一索引来保证基本表在主键列取值的唯一性,但它们之间存在着很大的区别:在一个基本表中,只能定义一个PRIMARYKEY约束,但可定义多个UNIQUE约束;对于指定为PRIMARYKEY的一个列或多个列的组合,其中任何一个列都不能出现空值,而对于UNIQUE所约束的唯一键,则允许为空。注意:不能为同一个列或一组列既定义UNIQUE约束,又定义PRIMARYKEY约束。,练习:,1)创建表cars(model_no,brand,make,style,year,description),其中:model_no是主键,brand非空。,1)createtablecars(model_nochar(10)primarykey,brandchar(20)notnull,makevarchar(40),stylechar(20),yeardate,descriptionvarchar(200);,3)createtablecar_parts(model_nochar(10),part_nochar(12),qty_regintconstraintpk_mpprimarykey(model_no,part_no),constraintfk_model_noforeignkey(model_no)referencescars(model_no),constraintfk_part_noforeignkey(part_no)referencesparts(part_no);,2)createtableparts(part_nochar(12)primarykey,namechar(20)unique,descriptionvarchar(200);,2)创建表parts(part_no,name,description),其中:part_no是主键,name要求唯一。,3)创建表car_parts(model_no,part_no,qty_req),其中:model_no+part_no是主键,model_no是外键(被参照文件是cars),part_no是外键(被参照文件是parts)。,3.2.2.2修改基本表(P89),SQL语言使用ALTERTABLE命令来修改基本表格式:ALTERTABLEADDMODIFYDROP;,注意:1.使用ADD方式增加的新列自动填充NULL值,所以增加的新列不能指定NOTNULL约束。,例:向student表中增加“入学时间”列,其数据类型为日期型,不允许为空。表中无数据时:AlterTablestudentADDscomedatenotnull;表中有数据时:AlterTablestudentADDscomedate;Updatestudentsetscomectod(1999-01-01);AlterTablestudentModifyscomenotnull;,例:向sc表中增加主键约束,名字为pk_sno_cno。AlterTablescAddconstraintpk_sno_cnoprimarykey(sno,cno);例:删除sc表中外键约束fk_cno。AlterTablescdropconstraintfk_cno;例:删除学生姓名必须取唯一值的约束ALTERTABLEStudentDropUNIQUE(Sname)例:将students表的cert_code改为id_no。Altertablestudentsrenamecert_codetoid_no;例:将students表名改为student。Altertablestudentsrenamestudent;,2.使用MODIFY方式时:,不能将含有空值的列的定义修改为NOTNULL约束;若列中已有数据,则不能减少该列的宽度,也不能改变其数据类型;只能修改NULL|NOTNULL约束,其它类型的约束在修改之前必须先删除,然后再重新添加修改过的约束定义。例:将年龄的属性类型改为半字长整数AltertablestudentModifysagesmallint;将姓名的属性类型改为最大为40的可变长度字符AltertablestudentModifysnamevarchar(40);,有些DBMS可以修改属性约束AlterTableMovieStarModifygenderNull;AlterTableMovieStarModifygenderCheck(genderIn(F,M);AlterTableMovieStarAddConstraintRightTitleCheck(gender=FORnameNotLikeMs.%);AlterTableMovieStarDropConstraintRightTitle;,SQL没有提供删除属性列的语句,可以间接实现。先将表中要保留的列及其内容复制到一个新表中,然后删除原表,在将新表命名为原表名。例:删除students中的列cert_code。1)Createtablestudents_1as(selectsno,sname,ssex,sage,sdeptfromstudents);2)Droptablestudents;3)Altertablestudents_1renamestudents;,3.2.2.3删除基本表(P90),删除表的语法格式:DROPTABLE注意:用户只能删除自己建立的表,不能删除其他用户所建的表。基本表定义一旦被删除,表中数据,此表上建立的索引和视图都将自动被删除掉。有的系统(如Oracle),删除基本表后建立在此表上的视图定义仍然保留在数据字典中。但用户使用时就报错。例:删除学生基本表StudentDROPTABLEStudent;,3.2.3设计、创建和维护索引,3.2.3.1索引的含义3.2.3.2索引的分类3.2.3.3建立索引3.2.3.4删除索引,3.2.3.1索引的含义,索引是一种数据结构,是对照表、指针表。索引是为了加速对表中元组的检索而创建的一种分散存储结构。索引是对表而建立的,由除存放表的数据页面以外的索引页面组成。索引加快查询速度,减慢更新的速度。,3.2.3.2索引的分类,1.按照索引记录存放位置:聚集索引与非聚集索引聚集索引:按照索引的字段排列记录,并且依照排好的顺序将记录存储在表中,即索引项的顺序与表中记录的物理顺序一致。非聚集索引:按照索引的字段排列记录,但是排列的结果并不会存储在表中,而是另外存储。2.唯一索引的概念唯一索引:表示表中每一个索引值只对应唯一的数据记录。不同元组中索引字段的值不允许相同。3.复合索引的概念复合索引:是将两个字段或多个字段组合起来建立的索引,而单独的字段允许有重复的值。,3.2.3.3建立索引,语法:CREATEUNIQUECLUSTERINDEXON(次序,次序);次序用来指定索引值的排列顺序,可为ASC(升序)或DESC(降序),缺省值为ASC。例1:为students表按sname建唯一索引Createuniqueindexidx_snameonstudents(sname);例2:为courses表按cname建聚集索引Createclusterindexidx_cnameoncourses(cname);例3:为sc表按sno降序和cno升序建唯一索引Createuniqueindexidx_sno_cnoonsc(snodesc,cno);,注意:1.改变表中的数据(如增加或删除记录)时,索引将自动更新。索引建立后,在查询使用该列时,系统将自动使用索引进行查询。2.索引数目无限制,但索引越多,更新数据的速度越慢。对于仅用于查询的表可多建索引,对于数据更新频繁的表则应少建索引。,例4:CREATEUNIQUEINDEXStuSnoONStudent(SNO);CREATEUNIQUEINDEXCoucNoONCourse(CNO);CREATEUNIQUEINDEXScnoONSC(SNOASC,CNoASC);,3.2.3.4删除索引,索引一经建立,就由系统使用和维护它。不需用户干预建立索引是为了减少查询操作的时间。但如果数据项删改频繁,系统会花费许多时间来维护索引。这时,可以删除一些不必要的索引。句法:DROPINDEX;例1:删除Student表的stuname索引DROPINDEXstuname;例2:Dropindexidx_sname;,3.3SQL数据查询(P91-P116),数据库查询是数据库的核心的操作:用SELECT实现。SELECT有丰富的功能。,3.3.1SELECT命令的格式与基本使用3.3.2单表查询3.3.3连接查询3.3.4嵌套查询3.3.5集合查询,3.3.1SELECT命令的格式与基本使用,SELECT语句的一般格式为:SELECTALLDISTINCT,.WHERE条件表达式GROUPBYHAVINGORDERBYASCDESC;查询的结果是仍是一个表。,SELECT语句的执行过程是:根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组;再按SELECT子句中的目标列表达式,选出元组中的属性值,形成结果表;如果有GROUP子句,则将结果按的值进行分组,该属性列值相等的元组为一组;如果GROUP子句带HAVING短语,则只有满足指定条件的组才予输出;如果有ORDER子句,则结果表还要按的值的升序或降序排序。,3.3.2单表查询(P92-P94),3.3.2.1查询语句中的投影操作3.3.2.2条件查询3.3.2.3对查询结果排序3.3.2.4常用集函数及统计汇总查询3.3.2.5分组查询,3.3.2.1查询语句中的投影操作,投影操作(选取表中的若干列)是从关系的属性集中选择属性子集(与关系代数的投影运算等同),即由关系的部分列组成一个新关系。1.查询表中指定的部分列查询结果中的重复行可通过“DISTINCT”被去掉2.查询表中全部列用*表示表的全部列名,而不必逐一列出3.查询经过计算的值4.选择表中若干元组,消除取值重复的解,目标列表达式,SELECT语句中的“目标列表达式”的语法图,表达式,引用返回,利用投影查询时不仅可以表中属性列,还可以是算术表达式。Selectsname,2003-sagefromstudent;利用投影查询时不仅可以是算术表达式,还可以是字符串常量、函数等。Selectsno,date(),birth_datefromstudents;利用投影查询可控制列名的顺序,并可通过指定别名改变查询结果的列标题的名字。,1.查询表中指定的部分列,例:查询全体学生的学号与姓名(P93例1):SELECTSNO,SNameFROMStudent查询全体学生的学号,姓名与所在的系(P93例2):SELECTSName,SNo,SDeptFROMStudent,2.查询表中全部列,将表中的所有属性列都选出来,可以有两种方法。一种方法就是在SELECT关键字后面列出所有列名。另一种是,如果列的显示顺序与其在基本表中的顺序相同,也可以简单地将指定为*。例:查询全体学生的详细记录:可列出全部列名,可用*号代替(P93例3):SELECT*FROMStudent等价于SELECTSno,Sname,Ssex,Sage,SdeptFROMStudent,3.查询经过计算的值,不仅可以是表中的属性列,也可以是表达式。,再例:查询全体同学的姓名,出生年份和所在系,要求用小写字母表示系名。SELECTSNameNAME,YearOfBirth:,2003SAge,ISLOWER(SDept)FROMStudent;查询结果见P94上部表。,例:查询经过计算的值查全体同学的姓名及其出生年份(见P93例4)SELECTSName,2003SAgeFROMStudent;查询结果见P93下部表。,3.查询经过计算的值Cont.01,用户可以通过指定改变查询结果的,这对于含算术表达式、常量、函数名的目标列表达式,尤为有用!SELECTSNameNAME,YearOfBirth:BIRTH,2001SAgeBIRTHDAY,ISLOWER(SDept)DEPARTMENTFROMStudent;查询结果见P94中部表。,4.选择表中若干元组,消除取值重复的解,SELECT查询结果不像关系代数,自动去掉重复元组,必须用DISTINCT进行去掉,即消除取值重复的解。,SELECTDISTINCTSNOFROMSC;缺省时,为ALL。加上DISTINCT后,就消除了结果中的重复元组。,例:查询选修了课程的学生学号(P95例6)SELECTSNOFROMSC;从选课表中,对列SNO进行投影得到选课的学生号,但本句的结果数与库中记录条数相同,有许多重复项,因一个学生选了多门课。,3.3.2.2条件查询,条件查询,是指从关系中选择满足条件的部分元组,通过WHERE子句来实现。WHERE子句通过三部分来描述:1列名;2运算符;3列名、常数。WHERE子句常用的查询条件:,3.3.2.2条件查询Cont.01,1.比较大小2.确定范围3.确定集合4.字符匹配5.涉及空值的查询6.多重条件查询,1.比较大小(P96),例(1):查询计算机系学生的名单SELECTSNameFROMStudentWHERESDept=CS;,例(3):查询考试成绩有不及格的学生学号。SELECTDINSTINCTSNoFROMSCWHEREGrade、=、90/*其他限制条件*/,3.3.4嵌套查询(P106-P113),定义:查询块:一个SELECTFROMWHERE语句称为一个查询块。嵌套查询:将一个查询块嵌套在另一个查询块的WHERE子句或HAVING补语的条件中的查询称为嵌套查询。用途:嵌套查询使我们可以用多个简单查询构成复杂查询,从而增强SQL的查询功能。,3.3.4嵌套查询(P106-P113)Cont.01,嵌套查询的层次划分lWHERE子句或HAVING补语的条件中的含有其他查询块的查询块称为“外层查询”或“父查询”;l被放在WHERE子句或HAVING补语的条件的查询块称为“内层查询”或“子查询”。注意事项lSQL语言允许多层嵌套查询,以层层嵌套的方式来构造程序,正是SQL中“结构化”的含义所在。l但是,子查询的SELECT语句中,不能使用ORDERBY子句,ORDERBY子句只能对最终查询结果排序。嵌套查询的一般求解方法l总体策略-由里向外处理。即:l每个子查询在上一级查询处理之前求解;l子查询的结果用于建立其父查询的查找条件。,3.3.4嵌套查询(P106-P113)Cont.02,不相关子查询:子查询的查询条件不依赖于父查询。相关子查询:子查询的查询条件依赖于父查询的某个属性值嵌套查询中的谓词:notIN;比较运算符;ANY,ALL;notEXISTS,适用于子查询的结果是一个集合(P106-109),子查询返回单值可用比较运算符(P109-111),与比较符连用;用集函数更好些(P111-114),EXISTS代表存在量词“”。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真假值。EXISTS与NOTEXISTS可等价替代其它形式查询,但反之不成立。EXISTS查询是高效方法。一般处理过程(P112)。,引用返回,有的嵌套查询可以用连接查询来实现,但并非所有嵌套查询都可以用连接查询替换。,3.3.4嵌套查询(P106-P113)Cont.03,3.3.4.1返回一组值的子查询3.3.4.2返回一个值的子查询3.3.4.3带有EXISTS谓词的子查询(P111),3.3.4.1返回一组值的子查询(P107带IN谓词子查询),如果子查询的返回值不止一个,而是一个集合时:(1)可以采用谓词IN;(2)或者,在比较运算符和子查询之间插入ANY或ALL。,例1:查询与“刘晨”在同一个系学习的学生。(P107例37)先分步来完成此查询,然后再构造嵌套查询。,(1)确定“刘晨”所在的系名SELECTSdeptFROMStudentWHERESname=刘晨;,(2)查询所有在IS系学习的学生SELECTSno,Sname,SdeptFROMStudentWHERESdept=IS;,引用返回,3.3.4.1返回一组值的子查询Cont.01,将第(1)步查询嵌入到第(2)步查询的条件中,SQL语句如下:SELECTSno,Sname,SdeptFROMStudentWHERESdeptIN(SELECTSdeptFROMStudentWHERESname=刘晨);,DBMS求解该查询时,实际上也是分步去做的,类似于上面写的分步过程。,3.3.4.1返回一组值的子查询Cont.02,例1中的查询,也可以用自身连接来完成:SELECTS1.Sno,S1.Sname,S1.SdeptFROMStudentS1,StudentS2WHERES1.Sdept=S2.SdeptANDS2.Sname=刘晨;可见,实现同一查询可以有多种方法,当然不同方法其执行效率可能会有差别,甚至会差别很大。例1中的父查询和子查询均引用了Student表,可以像自身连接那样用别名将父查询中的Student表与子查询中的Student表区分开:SELECTSno,Sname,SdeptFROMStudentS1WHERES1.SdeptIN(SELECTSdeptFROMStudentS2WHERES2.Sname=刘晨);,3.3.4.1返回一组值的子查询Cont.03,例2:查询选修了课程名为“信息系统”的学生的学号和姓名。本查询涉及学号、姓名和课程名三个属性。学号、姓名存放在Student表中;课程名存放在Course表中;但Student与Course两个表之间没有直接联系,必须通过SC表建立它们二者之间的联系。所以本查询实际上涉及了三个关系。嵌套查询语句:SELECTSno,SnameFROMStudentWHERESnoIN(SELECTSnoFROMSCWHERECnoIN(SELECTCnoFROMCourseWHERECname=信息系统);,3.3.4.1返回一组值的子查询Cont.04,例3:查询选修95001所选课程的课程名、课程号和学分。Selectcno,cname,creditFromscWherecnoIN(SelectcnoFromSCWherecno=95001);,3.3.4.1返回一组值的子查询Cont.05,子查询多行一列,设招生考试统计查询数据库中包括三个基本表(关系),其结构与样例数据如表1、表2、表3所示。学校(校代码,校名,校类型,计招人数,实录人数,平均分)考生(考号,考分,姓名,性别,所在地,民族)考生志愿(考号,一本志愿校代码,二本志愿校代码,志愿序号),3.3.4.1返回一组值的子查询Cont.06,表1学校School,3.3.4.1返回一组值的子查询Cont.07,表2考生Examinee,3.3.4.1返回一组值的子查询Cont.08,表3考生志愿Ewill,3.3.4.1返回一组值的子查询Cont.09,例4:查询志愿填报西安交通大学或西北工业大学的考生考号,姓名,考分。Selectexno,exname,exgradeFromexamineeWhereexnoin(SELECTExnoFROMEwillWHEREScode1IN(SELECTSccodeFROMSchoolWHEREScname=西安交通大学ORScname=西北工业大学)),3.3.4.1返回一组值的子查询Cont.10,引用返回,3.3.4.1返回一组值的子查询Cont.11,例4的查询同样可以用连接查询来实现:SELECTexno,exname,exgradeFROMexaminee,school,ewillWHEREexaminee.exno=ewill.exnoANDschool.sccode=ewill.scode1AND(Scname=西安交通大学ORScname=西北工业大学);从例3、例4可以看出,查询涉及多个关系时,用嵌套查询逐步求解,层次分明,易于构造,具有结构化程序设计的优点(这是我们所追求的!)。有些嵌套查询可以用连接运算替代,有些是不能替代的。到底采用哪种方法,用户可以根据自己的习惯确定。不相关子查询是最简单的一类子查询。其各子查询都只执行一次,其结果用于父查询。子查询的查询条件不依赖于父查询。,父查询与多值子查询之间的比较需用All来连接(P109-111),all子句的定义Fallrtr(Ft),=false,=true,=true(因为54and56),=false,3.3.4.1返回一组值的子查询Cont.12,3.3.4.1返回一组值的子查询Cont.13,例5:找出年龄最小的学生Select*FromStudentWheresageany(SelectsageFromStudent);,或Select*FromstudentWheresage(Selectmin(sage)FromStudent);,3.3.4.1返回一组值的子查询Cont.15,引用返回,3.3.4.1返回一组值的子查询Cont.16,例7:找出具有最高平均成绩的学号及平均成绩Selectsno,avg(grade)FromSCGroupBysnoHavingavg(grade)=all(Selectavg(grade)FromSCGroupBysno);,3.3.4.2返回一个值的子查询(P109带比较符子查询),含义:“返回一个值的子查询”“带比较运算符的子查询”,是指父查询与子查询之间用比较运算符进行连接。时机:当用户能确知“内层子查询”的返回值只有一个(是单值)时,可以使用比较运算符(=,=,=,!=)将父查询和子查询连接起来。例1:找出与95001同龄的学生(一个学生只有一个年龄)。Select*FromStudentWheresage=(SelectsageFromStudentWheresno=95001),比较运算符,3.3.4.2返回一个值的子查询Cont.01,注意:子查询一定要跟在比较运算符之后。例2:下列写法是错误的。Select*FromStudentWhere(SelectsageFromStudentWheresno=95001)=sage,产生错误原因是:将子查询放在了比较运算符“=”的前边。,带有EXISTS的子查询,不返回任何实际数据,它只得到逻辑值“真”或“假”。existsrrnotexistsrr=例1:列出选修了C01课程的学生的学号、姓名Selectsno,snameFromStudentWhereExists(Select*FromSCWhereSC.sno=Student.snoAndcno=C01);,他选修了这门课程,3.3.4.3带有EXISTS谓词的子查询(P111),相关子查询的执行顺序是:首先选取父查询表中的第一行记录,内部的子查询利用此行中相关的属性值进行查询,然后父查询根据子查询返回的结果判断此行是否满足查询条件。如果WHERE子句返回值为真,则把该行放入父查询的查询结果集合中。重复执行这一过程,直到处理完父查询表中的每一行数据。,3.3.4.3带有EXISTS谓词的子查询Cont.01,3.3.4.3带有EXISTS谓词的子查询Cont.02,带有EXISTS的子查询,其目标列表达式通常都用*。相关子查询:子查询的查询条件依赖于外层父查询的某个属性值,即外层元组的属性作为内层子查询的条件。相关子查询与不相关子查询的区别例2:列出得过100分的学生的学号、姓名Selectsno,snameFromStudentWhereExists(Select*FromSCWhereSC.sno=Student.snoAndgrade=100);,他有这样的选课记录,3.3.4.3带有EXISTS谓词的子查询Cont.03,例3:列出没有选C01课程的学生的学号、姓名Selectsno,snameFromStudentWhereNotExists(Select*FromSCWhereSC.sno=Student.snoAndcno=C01);,不存在这样的选课记录,3.3.4.3带有EXISTS谓词的子查询Cont.04,例4:查询选修了C01课程的学生的系主
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东省惠州市2025年物理高一上期末质量检测试题含解析
- 黑龙江佳木斯市第一中学2025年高一物理第一学期期末综合测试试题含解析
- 河北省邯郸市永年区第二中学2026届高一化学第一学期期中质量跟踪监视试题含解析
- 现代物流工艺流程总结
- 止水条体积膨胀倍率试验记录
- 大学生职业生涯规划与就业创业指导(实践版)笔试题库 言语理解与表达1
- 高一数学上学期第三次月考(北师大版2019高效培优强化卷)(参考答案)
- 英语写作智能评阅系统对比研究-以iWrite和批改网为例
- 会计学术会议征文选题
- 学术访谈李少锋主编访谈录(附《应用语言学研究方法》第1期论文)
- 数字化转型与AI赋能智慧城市建设中的社会治理研究报告
- 监理工程服务方案(3篇)
- 人教PEP版(2024)四年级上册英语-Unit 5 The weather and us 单元整体教学设计(共6课时)
- 活性炭生产工作业指导书
- 2025年全国军事理论及国防教育相关知识试题库(含答案)
- 农业无人机打药培训课件
- 头晕鉴别诊断
- 八年级上名著《红岩》第3章(讲练测)
- 国家公共营养师考试历年真题及答案
- 集团消防管理办法
- 成人手术后疼痛评估与护理-2024中华护理学会团体标准
评论
0/150
提交评论