《数据库原理资料》PPT课件.ppt

上传人:tia****nde 文档编号:3320755 上传时间:2019-12-11 格式:PPT 页数:234 大小:889.50KB
返回 下载 相关 举报
《数据库原理资料》PPT课件.ppt_第1页
第1页 / 共234页
《数据库原理资料》PPT课件.ppt_第2页
第2页 / 共234页
《数据库原理资料》PPT课件.ppt_第3页
第3页 / 共234页
点击查看更多>>
资源描述
普通高等教育十一五规划教材数据库原理教程,范明、叶阳东、邱保志、职为梅编著科学出版社,2008,第4章关系数据库标准语言SQL,第4章关系数据库标准语言SQL,4.1引言4.2数据定义4.3数据查询4.4数据更新4.5视图4.6嵌入式SQL,4.1引言,引言,SQL(StructuredQueryLanguage)结构化查询语言,是关系数据库的标准语言SQL是一个通用的、功能极强的关系数据库语言,背景,SQL语言最早称为Sequel,是Boyce和Chamberlin1974年提出的。Sequel不断发展,并更名为SQL由于SQL,功能丰富,语言简洁,使用灵活,倍受用户和业界欢迎,被众多计算机公司和软件公司所采用。1974年由Boyce和Chamberlin提出,在IBM公司的SystemR上实现。1986年被美国国家标准局(ANSI)批准为关系数据库语言的美国标准。1987年国际标准化组织(ISO)通过这一标准自SQL-92以来,SQL标准的规模开始变大(SQL-89标准大约120页,SQL-92标准超过620页,而SQL-99标准多达1700页)。目前,大多数商品化DBMS支持SQL-92主要部分(初级标准和部分中、高级的标准),并在其他方面有一些扩展。SQL-99扩充太快,过于庞大,DBMS开发商对实现SQL-99似乎不太积极。本书关于SQL的介绍主要基于SQL-92,背景,标准大致页数发布日期SQL/861986.10SQL/89(FIPS127-1)120页1989年SQL/92622页1992年SQL991700页1999年SQL2003360页2003年,SQL数据库体系结构要点,一个SQL模式是表和约束的集合一个表由行集组成,表有基本表、视图、导出表一个基本表可以跨一个/多存储文件,一个存储文件可存放一个/多个基本表,每个存储文件与外部存储器上的一个物理文件对应。SQL查询可以对基本表、视图查询用户可以是应用程序或终端用户,SQL概述,SQL是一种完整的数据库语言,它提供了丰富的功能SQL的使用方式SQL的表的类型,SQL概述(续),SQL的功能SQL的数据定义语言(DDL)提供了模式定义、修改和删除,基本表定义、修改和删除、域定义修改和删除。SQL的数据操纵语言(DML)提供了数据查询子语言。SQL的数据查询子语言是关系完备的,并且具有关系代数和关系演算的双重特征。SQLDML不仅包括数据查询,而且包括数据更新(数据插入、删除和修改)语句,允许用户更新数据库。SQLDDL还允许用户定义视图,并且SQLDML允许用户对视图进行查询和受限的更新操作。,SQL概述(续),SQL的功能(续)SQLDDL允许用户定义各种完整性约束条件,并在数据库访问时自动检查,确保数据库操作不会破坏完整性约束条件。SQLDDL还包括授权定义,用来定义用户对数据库对象(基本表、视图等)的访问权限,防止非法访问,确保数据库的安全性。SQL还支持事务,提供了定义事务开始和结束的语句SQL不是应用开发语言,只提供对数据库的操作功能,不能完成对屏幕的控制、菜单管理、报表生成SQL的使用方式独立使用嵌入到通用程序设计语言中,SQL概述(续),SQL的表的类型基本表(basetable)持久基本表(persistentbasetable)全局临时表(globaltemporarytable)局部临时表(localtemporarytable)导出表:根据查询表达式,由一个或多个基本表直接或间接导出视图:命名的导出表,SQL的特点,SQL的特点集多种数据库语言于一体高度非过程化面向集合的操作方式一种语法两种使用方式功能强大,语言简洁,SQL的特点(续),1.集多种数据库语言于一体(综合统一)非关系模型的数据语言一般分为:模式数据定义语言(模式DDL)外模式数据定义语言(外模式DDL,子模式DDL)数据存储有关的描述语言(DSDL)数据操纵语言(DML)当用户数据库投入运行后,如果要修改模式,必须停止运行,转储数据,修改模式并编译后再重装数据库,SQL的特点(续),1.集多种数据库语言于一体(续)SQL语言集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体。可以独立完成数据库生命周期中的全部活动定义关系模式,插入数据,建立数据库;对数据库中的数据进行查询和更新;数据库重构和维护数据库安全性、完整性控制等用户数据库投入运行后,可根据需要随时逐步修改模式,不影响数据的运行。数据操作符统一,查找、插入、删除、更新等只需一种操作符,SQL的特点(续),2.高度非过程化非关系数据模型的数据操纵语言“面向过程”,必须使用类似于指针的机制,指定存取路径SQL只要提出“做什么”,无须了解存取路径。例如,使用SQL语言表达查询时,用户只需要正确地表达需要哪些信息,这些信息在哪些关系中,结果元组应当满足什么条件系统将考察多种执行方案,选择并运行一个最优的执行方案得到结果。大大减轻了用户负担有利于提高数据的独立性,SQL的特点(续),3.面向集合的操作方式非关系数据模型采用面向记录的操作方式,操作对象是一条记录SQL采用集合操作方式操作对象、查找结果可以是元组的集合一次插入、删除、更新操作的对象可以是元组的集合,SQL的特点(续),4.一种语法两种使用方式SQL是独立的语言能够独立地用于联机交互的使用方式SQL又是嵌入式语言SQL能够嵌入到高级语言(例如C,C+,Java)程序中,供程序员设计程序时使用,SQL的特点(续),5.功能强大语言简洁SQL是一种完整地数据库语言,其功能涵盖数据定义、数据操纵、数据控制等数据管理的主要需求。但SQL语言相对比较简洁,其核心动词只有9个。SQL语言的语法简单,与英语口语的风格类似,易学易用。,4.2数据定义,4.2数据定义,SQL的数据定义语言DDL包括定义模式、域、关系(SQL称之为基本表)、视图、索引、断言、授权等。本节介绍如何定义基本表、索引和模式,4.5节将介绍如何定义和使用视图,域、断言和授权定义将在第5章讨论,SQL的数据类型,SQL支持许多内置的数据类型允许用户定义新的域(数据)类型。SQL支持的数据类型包括CHARACTER(n):长度为n的定长字符串CHARACTERVARYING(n):最大长度为n的变长字符串BIT(n):长度为n的二进制位串BITVARYING(n):最大长度为n的变长二进制位串INTEGER:长度为4BSMALLINT:长度为2B,SQL的数据类型(续),SQL支持的数据类型NUMERIC(p,d):定点数,p位数字,小数点后d位DECIMAL:(同上)FLOAT(n):浮点数,精度至少n位数字REAL:浮点数DOUBLEPRECISION:双精度浮点数DATE:日期YYYY-MM-DDTIME:时间HH:MM:SSTIMESTAMP:时标,即日期时间INTERVAL:时间间隔,SQL的数据类型(续),CHAR(n):定长字符串,长度n由用户指定。省略(n)时,长度为1。CHAR的全称是CHARACTER。VARCHAR(n):变长字符串,最大长度n由用户指定。VARCHAR的全称是CHARACTERVARYING定长和变长字符串的差别主要表现在前者需要固定长度的空间,而后者占用的空间在最大长度范围内是可改变的。BIT(n):定长二进位串,长度n由用户指定。省略(n)时,长度为1。BITVARYING(n):变长二进位串,最大长度n由用户指定。INT:整数,其值域依赖于具体实现。INT的全称是INTEGER。SMALLINT:小整数,其值域依赖于具体实现,但小于INT的值域,SQL的数据类型(续),NUMERIC(p,d):p位有效数字的定点数,其中小数点右边占d位。DEC(p,d):p位有效数字的定点数,其中小数点右边占d位。DEC的全称是DECIMAL。FLOAT(n):精度至少为n位数字的浮点数,其值域依赖于实现。REAL:实数,精度依赖于实现。DOUBLEPRECISION:双精度实数,精度依赖于实现,但精度比REAL高。DATE:日期,包括年、月、日,格式为YYYY-MM-DD。TIME:时间,包括时、分、秒,格式为HH:MM:SS。TIME(n)可以表示比秒更小的单位,秒后取n位。TIMESTAMP:时间戳,是DATE和TIME的结合INTERVAL:时间间隔。SQL允许对DATE、TIME和INTERVAL类型的值进行计算。,SQL的数据类型(续),SQL提供ETRACT(fieldFROMVar),从DATE、TIME和TIMESTAMP类型变量Var从提取字段field。对于DATE类型的变量,field可以是YEAR、MONTH和DAY;对于TIME类型的变量,field可以是HOUR、MINUTE和SECOND;而对于TIMESTAMP类型field可以是YEAR、MONTH、DAY、HOUR、MINUTE和SECOND例如,如果d是DATE类型,则ETRACT(YEARFROMd)返回d中的年份。,定义、修改和删除基本表,说明:本章,我们将“表”和“关系”视为同义词(尽管它们实际上有差别)将“属性”、“属性列”和“列”视为同义词使用“元组”或“记录”表示表的行。术语“基本表”主要用于表示持久基本表,而“表”泛指基本表和导出表(包括视图),定义、修改和删除基本表(续),符号约定表示X是需要进一步定义或说明语言成分。X表示X可以缺省或出现一次。X表示X可以出现一次。X|Y表示或者X出现,或者Y出现,但二者不能同时出现。SQL语言的保留字(如CREATE)不区分大小写。为醒目起见,对于SQL语句中的SQL的保留字,我们使用大写。SQL语句用分号结束。一个SQL语句可以写在一行或多行中,各种空白符号用于分隔不同的词。良好的语句的书写风格使得程序赏心悦目、易于阅读。,定义基本表,创建一个基本表要对基本表命名,定义表的每个列,并定义表的完整性约束条件。SQL语言使用CREATETABLE语句创建基本表,其基本格式如下:CREATETABLE(,);是标识符,对定义的基本表命名;圆括号中包括一个或多个,零个或多个,中间用逗号隔开,定义基本表(续),定义每个属性(列)的名称、类型、缺省值和列上的约束条件,格式如下:DEFAULT,其中,是标识符,对定义的列命名;定义列的取值类型,它可以是4.2.1节介绍的任意类型,也可以是用户定义的域类型(见5.3节);可选短语“DEFAULT”定义列上的缺省值,是中的一个特定值或NULL(空值);每个列上可以定义零个或或多个约束条件,约束列的取值,定义基本表(续),列约束定义格式如下CONSTRAINT其中可选短语“CONSTRAINT”为列约束命名常用的列约束包括:NOTNULL:不允许该列取空值不加NOTNULL限制时,该列可以取空值。PRIMARYKEY:指明该列是主码,其值非空、惟一。UNIQUE:该列上的值必须惟一相当于说明该列为候选码。CHECK():指明该列的值必须满足的条件,其中是一个涉及该列的布尔表达式,定义基本表(续),一个表可以包含零个或多个,用于定义主码、其他候选码、外码和表上的其它约束。表约束定义定义形式如下:CONSTRAINT其中可选短语“CONSTRAINT”为表约束命名PRIMARYKEY(A1,Ak):说明属性列A1,Ak构成该关系的主码。当主码只包含一个属性时,也可以用列约束定义主码。UNIQUE(A1,Ak):说明属性列A1,Ak上的值必须惟一相当于说明A1,Ak构成该关系的候选码当候选码只包含一个属性时,也可以用列约束定义候选码。CHECK():说明该表上的一个完整性约束条件。通常,是一个涉及该表一个或多个列的布尔表达式,定义基本表(续),外码比较复杂,它具有下形式:FOREIGNKEY(A1,Ak)REFERENCES()属性A1,Ak是关系(表)的外码给出被参照关系的表名给出被参照关系的主码说明违反参照完整性时需要采取的措施(详见第5章),定义基本表(续),例4.1下面的语句创建教师表TeachersCREATETABLETeachers(TnoCHAR(7)PRIMARYKEY,TnameCHAR(10)NOTNULL,SexCHAR(2)CHECK(Sex=男ORSex=女),BirthdayDATE,TitleCHAR(6),DnoCHAR(4),FOREIGNKEY(Dno)REFERENCESDepartments(Dno);,定义基本表(续),创建选课表SC用如下语句:CREATETABLESC(SnoCHAR(9),CnoCHAR(5),GradeSMALLINTCHECK(Grade=0ANDGrade=、=、或!=)和都是可求值的表达式,并且它们的值可以进行比较。通常,这些值表达式是常量、属性和函数。比较表达式根据比较关系是否成立产生真假值例4.10(1)查询职称(Title)为讲师的全体教师的姓名和性别。SELECTTname,SexFROMTeachersWHERETitle=讲师;(2)查询考试成绩不及格的学生的学号。SELECTDISTIINCTSnoFROMSCWHEREGrade=1987ANDyear(Birthday)1990;,带WHERE的简单查询(续),3.IN表达式判定一个给定的元素是否在给定的集合中IN表达式有两种形式:NOTIN()|NOTIN在第一种形式中,是可求值的表达式(通常是属性),而包括一个或多个可求值的表达式(通常是字面值,如45,教授等),中间用逗号隔开当且仅当的值出现在中,IN()为真,而NOTIN()为假。,带WHERE的简单查询(续),例4.12(1)查询计算机科学与技术和软件工程专业的学生的学号和姓名。SELECTSno,SnameFROMStudentsWHERESpecialityIN(计算机科学与技术,软件工程)(2)查询既不是计算机科学与技术,也不是软件工程专业的学生的学号和姓名。SELECTSno,SnameFROMStudentsWHERESpecialityNOTIN(计算机科学与技术,软件工程);当很小时,IN和NOTIN表示的查询条件都容易用多重比较表示。然而,当较大时,使用IN表达式更简洁,带WHERE的简单查询(续),4.LIKE表达式使用比较运算符,两个字符串可以在字典序下进行比较。但是这种比较是精确比较,不能解决诸如“查找课程名的前两个汉字是数据的课程”这类模糊查询。LIKE表达式允许我们表示这类查询。LIKE表达式的一般形式为:NOTLIKEESCAPE其中和都是字符串表达式,它们的值是可比较的。通常,是属性,是给定的字符串常量。中允许使用通配符,带WHERE的简单查询(续),有两种通配符“_”(下横线)可以与任意单个字符匹配而“%”可以与零个或多个任意字符匹配ESCAPE通常的形式是ESCAPE。它定义“”为转义字符,将紧随其后的一个字符转义。如果中的_或%紧跟在之后,则这个_或%就失去了通配符的意义,而取其字面意义当且仅当与匹配时,LIKE为真,而NOTLIKE为假,带WHERE的简单查询(续),例4.13(1)查询所有以“数据”开头的课程名。SELECTCnameFROMCoursesWHERECnameLIKE数据%;(2)查询姓李并且姓名只有两个汉字的学生的学号和姓名。SELECTSno,SnameFROMStudentsWHERESnameLIKE李_;注意:一个汉字占两个字符位置,带WHERE的简单查询(续),(3)查询以C_打头的课程的详细信息。由于通配符“_”出现在模式中,我们需要使用转义字符将它转义。该查询可以用如下语句实现:SELECT*FROMCoursesWHERECnameLIKEC_%ESCAPE;其中,ESCAPE短语定义“”为转义字符,模式C_%中的“_”被转义,不再取通配符含义,而是取字面意义。注意:C_%中的“%”仍然是通配符,因为转义字符只对紧随其后的一个字符转义,带WHERE的简单查询(续),5.NULL表达式SQL允许元组的某些属性上取空值(NULL)。空值代表未知的值,不能与其他值进行比较NULL表达式允许我们判定给定的值是否为空值。NULL表达式的常见形式如下|ISNOTNULLNULL表达式可以判定一个特定的值或子查询结果是否为空值。通常,是属性例如,如果A是属性,则AISNULL为真当且仅当属性A上取空值例4.14查询成绩为空的学生的学号和课程号。SELECTSno,CnoFROMSCWHEREGradeISNULL;,排序和分组,1.将查询结果排序通常,查询结果的显示次序是任意的查询的结果按一定的次序显示更便于观察ORDERBY子句可以将查询的结果按一定次序显示。并可以按多个结果列将查询结果排序,其一般形式如:ORDERBYASCDESC,ASCDESC其中,是属性名或属性的别名,必须出现在SELECT子句中ORDERBY后可以有一个或多个,中间用逗号隔开。每个都可以独立指定按升序(ASC)还是按降序(DESC)排序,缺省时为升序如果指定多个,则查询结果按指定的次序,首先按第一个的值排序,第一个值相同的结果元组按第二个的值排序,如此下去,排序和分组(续),例4.15(1)查询每位学生CS202课程的成绩,并将查询结果按成绩降序排序。SELECT*FROMSCWHERECno=CS202ORDERBYGradeDESC;(2)查询每位学生的每门课程的成绩,并将查询结果按课程号升序、成绩降序排序。SELECT*FROMSCORDERBYCno,GradeDESC;,排序和分组(续),2.聚集函数在实际应用中,常常需要计算一些统计量例如,统计学生的总人数、女生的人数、学生的平均成绩等等SQL语言提供了一些聚集函数,使用这些聚集函数可以方便的进行各种统计查询。SQL的聚集函数可以单独使用聚集函数作用于整个查询结果SQL的聚集函数也可以配合GROUPBY(分组)子句使用聚集函数作用于查询结果的每个分组聚集函数单独使用时,可以认为整个查询结果形成一个分组,排序和分组(续),SQL的聚集函数具有如下形式:COUNT(ALL|DISTINCT*)或(ALL|DISTINCT)第一种情况比较简单COUNT(*)或COUNT(ALL*)返回每个分组中的元组个数COUNT(DISTINCT*)返回每个分组中不同元组的个数。,排序和分组(续),对于第二种情况,可以是COUNT(计数)SUM(和)AVG(平均值)MAX(最大值)MIN(最小值)是可求值的表达式,通常是属性。短语ALL或DISTINCT是可选的,缺省时为ALL,排序和分组(续),设f是聚集函数,e是值表达式f(ALLe)或f(e)对每个分组,首先对该分组中每个元组计算e,得到e值的多重集;然后,将f作用于该多重集得到聚集函数值而f(DISTINCTe)与f(e)的唯一不同是,f(DISTINCTe)在得到函数值之前要删除多重集中的重复元素。例如,设A是属性SUM(DISTINCTA)将对每个分组中的元组,在属性A的不同值上求和SUM(A)将简单地对每个分组中的元组,在属性A上求和,排序和分组(续),例4.16(1)查询选修了CS302课程的学生的人数。SELECTCOUNT(*)FROMSCWHERECno=CS302;(2)查询CS302课程成绩最低分、平均分和最高分。SELECTMIN(Grade),AVG(Grade),MAX(Grade)FROMSCWHERECno=CS302;,排序和分组(续),3.分组SQL语言提供了GROUPBY子句用于分组,其一般形式如下:GROUPBY,HAVING其中,是属性(可以带表名前缀),它所在的表出现在FROM子句中可选的HAVING子句用来过滤掉不满足的分组,缺省时等价于HAVINGTRUE类似于WHERE子句的查询条件,但其中允许出现聚集函数。对于带GROUPBY子句的SELECT语句,SELECT子句中的结果列必须是GROUPBY子句中的或聚集函数,排序和分组(续),带GROUPBY子句的SELECT语句的执行效果相当于:首先对FROM子句中的表计算笛卡尔积再根据WHERE子句的查询条件从中选择满足查询条件的元组,得到查询的中间结果然后,按照GROUPBY子句指定的一个或多个列对中间结果分组,在这些列上的值相等的元组分为一组计算聚集函数(如果SELECT子句或HAVING短语包含聚集函数的话),并按照HAVING短语中的分组选择条件过滤掉不满足条件的分组最后,投影到SELECT子句的结果列上,得到查询的回答,排序和分组(续),例4.17查询每个学生的平均成绩,输出学生的学号和平均成绩。SELECTSno,AVG(Grade)FROMSCGROUPBYSno;例4.18查询每个学生的平均成绩,并输出平均成绩大于85的学生学号和平均成绩。SELECTSno,AVG(Grade)FROMSCGROUPBYSnoHAVINGAVG(Grade)85;,连接查询,SQL支持多表查询,允许FROM子句中包括多个表当FROM子句中包含多个表时,相当于求这些表的笛卡尔积一般地,将来自不同表的任意元组串接在一起所形成的元组并没有实际意义,我们需要的是自然连接和其他连接SQL允许FROM子句中包含各种连接的表例如,T1NATURALJOINT1产生表T1和T2的自然连接,可以作为一个表引用出现在FROM子句中许多商品化的DBMS并不能很好地支持这些功能可以在WHERE子句中说明连接条件,并通过SELECT子句选取所需要的属性来实现各种连接在这种意义下,涉及多个表的查询通常称为连接查询。,连接查询(续),例4.19查询学号为200605098的学生的各科成绩,对每门课程显示课程名和成绩。SELECTCname,GradeFROMSC,CoursesWHERESC.Cno=Courses.CnoANDSno=200605098;其中SC.Cno=Courses.Cno是连接条件,相当于求SC和Courses的自然连接而Sno=200605098是该查询的选择条件注意:Cno既是表SC的属性,也是Courses的属性。为了避免二义性,我们必须在Cno前加前缀“SC.”或“Courses.”其实,任何属性前都可以加前缀。但是,当A只是FROM子句中一个表的属性时,前缀可以省略,连接查询(续),例4.20查询选修CS202课程,并且成绩在90分以上的所有学生的学号、姓名和成绩。SELECTStudents.Sno,Sname,GradeFROMStudents,SCWHEREStudents.Sno=SC.SnoANDCno=CS202ANDGrade90;例4.21查询每个学生选修的每门课程的成绩,要求列出的学号、姓名、课程名和成绩。SELECTStudent.Sno,Sname,Cname,GradeFROMStudents,SC,CoursesWHEREStudents.Sno=SC.SnoANDSC.Cno=Course.Cno;,连接查询(续),例4.22查询每个学生的平均成绩,并输出平均成绩大于85的学生学号、姓名和平均成绩。SELECTStudent.Sno,Sname,AVG(Grade)FROMSC,StudentsWHEREStudents.Sno=SC.SnoGROUPBYStudents.Sno,SnameHAVINGAVG(Grade)85;注意:对于带GROUPBY子句的查询,SELECT子句中的结果列只能是分组属性和聚集函数。由于查询要求显示学生的姓名,因此在该查询中,我们按学生的学号和姓名分组。按学生的学号和姓名分组与按学号分组的效果是一样的,连接查询(续),自身连接是一个表和它自己进行连接,通常情况下使用的不多,对于一些特定的查询,自身连接查询非常有效。例4.23查询和王丽丽出生年月相同的学生的姓名。SELECTS2.SnameFROMStudentsS1,StudentsS2WHERES1.Birthday=S2.BirthdayANDS1.Sname=王丽丽ANDS2.Sname王丽丽;,连接查询(续),表Students在FROM子句中出现两次,分别对它们使用别名S1和S2。这种别名可以看作元组变量该查询的执行相当于:对于Students的每个元组S1,考察Students的每个元组S2,如果它们满足WHERE子句中的条件,则显示元组S2的Sname属性值。条件S2.Sname王丽丽使得显示的结果不包括王丽丽本人实际上,不仅可以把表别名看作元组变量,而且也可以将表名看作该表的元组变量例如,例4.19可以解释为:对于SC的每个元组SC,考虑Courses的每个元组Courses,如果它们满足条件SC.Cno=Courses.CnoANDSno=200605098,则显示元组Courses的Cname属性和元组SC的Grade属性的值,嵌套查询,SQL是一种结构化查询语言,它允许将一个查询作为子查询嵌套在另一个SELECT语句中最常见的嵌套是将子查询嵌套在WHERE子句或HAVING短语的条件中我们称将一个查询嵌套在另一个查询中的查询称为嵌套查询,并称前者为子查询(内层查询),后者为父查询(外层查询)子查询中不能使用ORDERBY子句嵌套查询可以分两类不相关子查询的子查询的条件不依赖于父查询相关子查询的子查询的查询条件依赖于父查询。使用子查询可以对集合的成员资格、集合比较和集合基数进行检查。可以引进子查询的表达式包括IN表达式、存在表达式、NULL表达式和唯一表达式等,嵌套查询(续),1.IN引出的子查询2.集合的比较引出的子查询3.存在量词引出的子查询4.检测子查询结果中的重复元组,嵌套查询(续),1.IN引出的子查询IN表达式的第一种形式,用于判定一个给定的值是否在给定的集合中(前面已经见过)IN表达式的第二种形式可以更一般地判定集合成员资格,其形式如下:NOTIN其中形如(,),并且当元组只有一个分量时,可以省略圆括号当出现在的结果中,IN为真,而NOTIN为假,嵌套查询(续),例4.24查询和王丽丽在同一个专业学习的女同学的学号和姓名。下面的查询得到王丽丽的专业SELECTSpecialityFROMStudentsWHERESname=王丽丽;将它作为子查询,我们得到该查询的SQL语句:SELECTSno,SnameFROMStudentsWHERESex=女ANDSpecialityIN(SELECTSpecialityFROMStudentsWHERESname=王丽丽);,嵌套查询(续),上面的例子中,表Students出现在父查询和子查询中。这不会引起混淆与程序设计语言变量类似,子查询的FROM子句中的表(包括它的属性,下同)仅在子查询中存在并起作用,而父查询FROM子句中的表在父查询和子查询都存在,但是当子查询的FROM子句包含相同的表时,其作用域不包含子查询然而,我们可以对父查询中的表起别名,并在子查询中引用它的属性。当子查询中还包含子查询时,解释类似,嵌套查询(续),2.集合的比较引出的子查询SQL允许将一个元素与子查询的结果集进行比较。这种量化比较表达式的常用形式是:ALL|SOME|ANY其中通常是属性是比较运算符(=、!、=、的结果为单个值时,ALL、SOME和ANY可以省略。,嵌套查询(续),设v是的值,S是的查询结果,它是元组(值)的集合vALLS为真,当且仅当v与S中的每个值都满足比较关系vSOMES(或vANYS)为真,当且仅当v与S中的某个值满足比较关系例如,当v大于S中每个值时,vALLS为真;而当v不等于S中的某个值时,vSOMES为真注意:=SOME等价于IN,但是SOME并不等价于NOTIN,嵌套查询(续),例4.25查询比软件工程专业所有学生都小其他专业的学生的学号、姓名、专业和出生日期。下面的语句将得到软件工程专业所有学生的出生日期:SELECTBirthdayFROMStudentsWHERESpeciality=软件工程;将它作为子查询,我们得到该查询的SQL语句:SELECTSno,Sname,Speciality,BirthdayFROMStudentsWHERESpeciality软件工程ANDBirthday85,子查询导出的表(续),如果我们用Course_avg_grade(Cno,Avg_grade)对该查询结果命名,则我们很容易从中选择平均成绩高于85分的课程这样,该查询可以用如下语句实现:SELECTCno,Avg_gradeFROM(SELECTCno,AVG(Grade)FROMSCGROUPBYCno)ASCourse_avg_grade(Cno,Avg_grade)WHEREAvg_grade85;,子查询导出的表(续),例4.32重做例4.26,即查询平均成绩最高的课程的课程号和平均成绩SELECTCno,MAX(Avg_grade)FROM(SELECTCno,AVG(Grade)FROMSCGROUPBYCno)ASCourse_avg_grade(Cno,Avg_grade);,集合运算,SQL语言也支持传统的集合运算,包括并(UNION)、交(INTERSECT)、差(EXCEPT)集合运算的常见形式为:ALL其中产生元组的集合,通常是SELECT查询或集合运算的结果;是UNION、INTERSECT或EXCEPT。与SELECT语句不同,集合运算将自动删除结果中的重复元组。可选的ALL可以用来保留运算结果中的重复元组。与关系代数一样,SQL的集合运算要求参与运算的元组集的列数必须相同,对应列的数据类型也必须相同。集合运算都可以用SELECT查询实现,集合运算(续),例4.33查询选修了CS301号课程或者选修了CS306号课程的学生的学号。SELECTSnoFROMSCWHERECno=CS301UNIONSELECTSnoFROMSCWHERECno=CS306这等价于:SELECTDISTINCTSnoFROMSCWHERECno=CS301ORCno=CS306,集合运算(续),例4.34查询既选修了CS301号课程,又选修了CS306号课程的学生的学号。SELECTSnoFROMSCWHERECno=CS301INTERSECTSELECTSnoFROMSCWHERECno=CS306;,集合运算(续),这等价于:SELECTDISTINCTSnoFROMSCWHERECno=CS301ANDSnoIN(SELECTSnoFROMSCWHERECno=CS306);,集合运算(续),例4.35查询选修了CS301号课程,但未选修CS306号课程的学生的学号。SELECTSnoFROMSCWHERECno=CS301EXCEPTSELECTSnoFROMSCWHERECno=CS306;,集合运算(续),这等价于SELECTDISTINCTSnoFROMSCWHERECno=CS301ANDSnoNOTIN(SELECTSnoFROMSCWHERECno=CS306);,集合运算(外连接),INNERJION、LEFTOUTERJOIN、RIGHTOUTERJOIN、FULLOUTERJOIN例如:RLEFTOUTERJOINSonR.B=S.BANDR.C=S.C,4.4数据更新,4.4数据更新,4.4.1插入(INSERT)4.4.2删除(DELETE)4.4.3修改(UPDATE),插入,INSERT语句有两种使用形式:向基本表插入单个元组主要用于数据输入向关系中插入新元组将查询的结果(多个元组)插入基本表,插入(续),1.插入单个元组插入单个元组的INSERT语句的格式为:INSERTINTOT(A1,.,Ak)VALUES(c1,ck)其中T通常是基本表,也可以是视图A1,.,Ak是T的属性c1,ck是常量该语句的功能是:将VALUES子句给出的新元组(c1,ck)插入INSERTINTO指定基本表T中(A1,.,Ak)缺省时,VALUES子句必须按基本表属性的定义次序提供新元组每个属性上的值,插入(续),给出(A1,.,Ak)时,属性的次序可以是任意次序,并且可以仅列举基本表的部分属性。此时,VALUES子句中的常量个数与属性的个数相等,并且ci是新元组在属性Ai上的值(i=1,k);在除A1,.,Ak之外的其他属性上,新元组取缺省值(如果定义了缺省值的话)或空值NULL,插入(续),例4.36将学号为200616010、姓名为司马相如、性别为男、生日为1985-01-28、入校年份为2006年、专业为计算数学、所在院系为MATH的学生元组插入到Students表中。INSERTINTOStudentsVALUES(200616010,司马相如,男,1985-01-28,2006,计算数学,MATH)上面的语句可以改写为:INSERTINTOStudents(Sno,Sname,Sex,Birthday,Enrollyear,Speciality,Dno)VALUES(200616010,司马相如,男,1985-01-28,2006,计算数学,MATH);,插入(续),例4.37向表SC中插入一个选课记录,登记一个学号为200616010的学生选修了课程号为MA302的课程。INSERTINTOSC(Sno,Cno)VALUES(200616010,MA302);我们没有为Grade提供值,并且Grade上没有定义缺省值,因此新插入的元组在Grade上取空值NULL,插入(续),2.插入查询结果插入单个元组的INSERT语句主要用于数据输入。SQL还允许将查询结果插入到一个基本表中插入查询结果的语句格式为:INSERTINTOT(A1,.,Ak)其中T通常是基本表,也可以是视图A1,.,Ak是T的属性,它们的进一步解释同上通常是一个SELECT语句该语句对查询表达式求值,并将结果元组集插入到基本表T中,插入(续),例4.37设存放就餐卡登记信息关系Cardinf具有如下模式Cardinf(Card-no,Name,Balance)其中Card-no为持卡人编号,Name为持卡者姓名,Balance为卡中余额假设信息工程学院要为本院每位教师办理一个校内就餐卡,直接用教师号作为持卡人编号,并预存100元,插入(续),可以用如下INSERT语句插入新的就餐卡信息:INSERTINTOCardinf(Card-no,Name,Balance)SELECTTno,Tname,100.00FROMTeachersWHEREDno=IE;注意:常量100.00出现在SELECT子句中。这使得查询结果的每个元组的第3列均取常量值100.00,删除,当关系表中的某些记录数据不再需要时,可以使用DELETE语句进行删除DELETE语句格式为:DELETEFROMTWHERE其中T通常是基本表,但也可以是某些视图与SELECT语句中的查询条件类似事实上,除了只能从一个表删除元组之外,删除与查询的主要差别是:删除将满足条件的元组从数据库中物理地删除,而查询将满足条件的元组显示给用户。DELETE语句的功能是从指定的表T中删除满足的所有元组WHERE子句缺省时,则删除表T中全部元组(剩下一个空表T),删除(续),例4.38删除学号为200624010的学生记录可以用:DELETEFROMStudentsWHERESno=200624010;而删除所有学生的记录可以用:DELETEFROMStudents;尽管DELETE语句只能从一个表删除元组,但是删除条件可以涉及多个表,删除(续),例4.39删除计算机软件与理论专业的所有学生的选课记录。如下语句得到计算机软件与理论专业所有学生的学号:SELECTSnoFROMStudentsWHERESpeciality计算机软件与理论;这样,下面的语句将删除计算机软件与理论专业的所有学生的选课记录:DELETEFROMSCWHERESnoIN(SELECTSnoFROMStudentsWHERESpeciality计算机软件与理论);,修改,使用UPDATE语句可以修改表中某些元组指定属性上的值UPDATE语句格式为:UPDATETSETA1=e1,Ak=ekWHERE其中T通常是基本表,但也可以是某些视图A1,.,Ak是T的属性,而e1,.,ek是表达式;与SELECT语句中的查询条件类似。该语句的功能是:修改表T满足的元组即,对于表T中每个满足的元组t,求表达式ei的值,并将它赋于元组t的属性Ai,其中i=1,2,k;WHERE子句缺省时,修改表T的所有元组,修改(续),例4.40将职工号为B050041的教师的职称修改为副教授。UPDATETeachersSETTitle=副教授WHERETno=B050041;UPDATE语句只能修改一个表的元组。但是,修改条件中可以包含涉及其他表的子查询,修改(续),例4.41将软件工程课程成绩低于60分的所有学生的软件工程成绩提高5分下面的语句找出软件工程的课程号SELECTCnoFROMCoursesWHERECname软件工程;而修改软件工程成绩可以用如下语句实现UPDATESCSETGrade=Grade+5WHEREGrade60ANDCnoIN(SELECTCnoFROMCoursesWHERECname软件工程);,4.5视图,4.5视图,视图是一种命名的导出表,是从一个或几个基本表(或视图)导出的表与基本表不同,视图的数据并不物理地存储在数据库中(物化视图除外)查询时,凡是能够出现基本表的地方,都允许出现视图只有可更新的视图才允许更新。本节讨论视图的创建、删除、操作、视图的优点和作用,4.5视图(续),4.5.1定义视图和删除视图4.5.2基于视图的查询4.5.3基于视图的更新4.5.4视图的作用,定义和删除视图,1.定义视图使用CREATEVIEW语句可以创建视图,其语句格式为:CREATEVIEW(,)ASWITHCHECKOPTION其中是标识符,对定义的视图命名;圆括号中包括一个或多个,中间用逗号隔开,为结构的诸列命名通常是一个SELECT查询,其中不包含DISTINCT短语和ORDERBY子句当SELECT子句中的结果列都是属性名时,(,)可以缺省,并用SELECT子句的结果列作为视图表的属性,定义视图(续),当视图定义中包含可选短语WITHCHECKOPTION时,该视图应当是可更新的,并且在更新时考虑的查询条件。注意CREATEVIEW是说明语句,它创建一个视图,并将视图的定义存放在数据字典中,而定义中的并不立即执行,定义视图(续),例4.42建立软件工程专业学生的视图SE_Students,它包含Students中除Speciality之外的所有属性和软件工程专业所有学生的信息CREATEVIEWSE_StudentsASSELECTSno,Sname,Sex,Birthday,DnoFROMStudentsWHERESpeciality=软件工程WITHCHECKOPTION;,定义视图(续),SE_Students是通过单个表Students上的选择和投影定义的视图,包含Students的码通常,这种视图称为行列子集视图行列子集视图是可更新的,因此我们使用了短语WITHCHECKOPTION,以便通过该视图插入学生元组将属性Speciality上的值自动设置为“软件工程”SELECT子句中的结果列都是属性,它们成为视图表的属性,定义视图(续),例4.43建立信息工程学院学生选课视图EI_SC,它与SC具有相同的属性,但只包含信息工程学院学生的选课记录。CREATEVIEWEI_SC(Sno,Cno,Grade)ASSELECT*FROMSCWHERESnoIN(SELECTSnoFROMStudentsWHEREDno=IE);,定义视图(续),视图还可以基于多个表定义:例4.44建立学生成绩视图Student_Grades,它包含如下属性:学号、学生姓名、课程名和成绩。CREATEVIEWStudent_Grades(Sno,Sname,Cname,Grade)ASSELECTS.Sno,Sname,Cname,GradeFROMStudentsS,SC,CoursesCWHERES.Sno=SC.SnoANDC.Cno=SC.Cno;,定义视图(续),SQL还允许定义基于视图的视图,即利用已经定义的视图定义新的视图:例4.45建立计算机科学与技术专业学生成绩视图CS_Student_Grades,它包含如下属性:学号、学生姓名、课程名和成绩CREATEVIEWCS_Student_Grades(Sno,Sname,Cname,Grade)ASSELECTS.Sno,Sname,Cname,GradeFROMStudentsS,Student_GradesSGWHERES.Sno=SG.SnoANDSpeciality=计算机科学与技术;,定义视图(续),在定义视图的查询表达式中还可以使用聚集函数,这样定义的视图称为聚集视图例4.46定义学生平均成绩视图Student_Avg_Grades,它包括如下属性:学生的学号、姓名和平均成绩(Avg_Grade)CREATEVIEWStudent_Avg_Grades(Sno,Sname,Avg_Grade)ASSELECTS.Sno,Sname,AVG(Grade)FROMStudentsS,SCWHERES.Sno=SC.SnoGROUPBYS.Sno,Sname;,删除视图,视图的删除语句的格式为:DROPVIEWCASCADE|RESTRICT删除视图就是把视图的定义从数据字典中删除CASCADE或RESTRICT是可选的,缺省时为RESTRICTCASCADE导致级联删除,即同时删除基于该视图定义的视图,并继续该过程RESTRICT将限制删除,仅当没有其它成分依赖于该视图时才删除,删除视图(续),DROPVIEWStudent_Grades或DROPVIEWStudent_GradesRESTRICT不能删除例4.44定义的视图Student_Grades,因为视图CS_Student_Grade
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!