【文档说明】第3章-关系数据库的标准语言SQL分解课件.ppt,共(98)页,407.502 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-92321.html
以下为本文档部分文字说明:
数据库原理湖南工学院计算机系数据库原理PrinciplesofDatabase第3章关系数据库的标准语言SQL第3章关系数据库的标准语言SQL【本章掌握内容】1、数据定义语言的使用方法2、数据操作语言的使用方法【本章了解内容】1、存储过程的编写2、触发器的编写数
据库原理第3章关系数据库的标准语言SQL3.1SQL概述3.2SQL的数据定义3.3SQL的数据操纵3.4视图3.5触发器数据库原理3.1SQL概述SQL最早是1974年由Boyce和Chamberlin提出,并作为IBM公司研制的关系数据库管理系统原型Syst
emR的一部分付诸实施的。现在SQL已经成了关系数据库的标准语言,并且发展了三个主要标准,即ANSI(美国国家标准机构)SQL;对ANSISQL修改后在1992年采纳的标准,称为SQL-92或SQL2;最近又出了SQL-99
,也称SQL3标准。数据库原理3.1.1SQL的特点1.综合统一(1)数据定义语言(DataDefinitionLanguage,DDL)。DDL用于定义数据库的逻辑机构,是对关系模式一级的定义,包括基本表、视图及索引的定
义。(2)数据查询语言(DataQueryLanguage,DQL)。DQL用于查询数据。(3)数据操纵语言(DataManipulationLanguage,DML)。DML用于对关系模式中的具体数据进行增、删、改等操作。
(4)数据控制语言(DataControlLanguage,DCL)。DCL用于数据访问权限的控制。数据库原理2.高度非过程化用户无需了解存取路径,存取路径的选择以及SQL语句的操作过程由系统自动
完成。这不但大大减轻了用户负担,而且有利于提高数据独立性。3.用同一种语法结构提供两种使用方式SQL语言既是自含式语言,又是嵌入式语言。作为自含式语言,它能够独立地用于联机交互的使用方式,用户可以在终端键盘上直接输入SQL命令对数据库进行操作。作为嵌入式语言,SQL
语句能够嵌入到高级语言(例如C)程序中,供程序员设计程序时使用。4.语言简洁,易学易用数据库原理3.1.2SQL语言的基本概念数据库的体系结构分为三级,SQL也支持这三级模式结构1.基本表(BaseTable)基本表是模式的
基本内容。实际存储在数据库中的表对应一个实际存在的关系。2.视图(View)视图是外模式的基本单位,用户可以通过视图使用数据库中基于基本表的数据。视图是从其它表(包括其它视图)中导出的表,它仅是保存在数据的一种逻辑定义字典中,本身并不独立存储在数据库中,因此视图是一种虚表。3.存储文件存储
文件是内模式的基本单位。一个基本表对应一个或多个存储文件,一个存储文件可以存放在一个或多个基本表,一个基本表可以有若干个索引,索引同样存放在存储文件中。存储文件的存储结构对用户来说是透明的。数据库原理SQL支持的数据库体系结构数据库原理3.2SQL的数据定义通过
SQL语言的数据定义功能,可以完成基本表、视图、索引的创建和修改数据库原理数据类型1)数值型INTEGER:定义数据类型为整数类型,它的精度(总有效位)由执行机构确定。SMALLINT:定义数据类型为短
整数类型,它的精度由执行机构确定。NUMERIC(p,s):定义数据类型为数值型,并给定精度p(总的有效位)或标度s(十进制小数点右面的位数)。FLOAT(p):定义数据类型为浮点数值型,其精度等于或大于给定的精度p。REAL:定义数据类型为浮点数值型,它的精度由执行机构确定。数据库原理
DOUBLEPRECISION:定义数据类型为双精度浮点类型,它的精度由执行机构确定。(2)字符类型CHARACTER(n):定义数据类型为字符串,并给定串长度(字符数)。VARCHAR(n):定义可变长度的字符串,其最
大长度为n。(3)位串型BIT(n):定义数据类型为二进制位串,其长度为n。BITVARYING(n):定义可变长的二进制位串,其最大长度为n。(4)时间型DATETIME:定义一个日期时间类型,日期和时间数据由有效的日期或时间组成。(5)布尔型BOOLEAN:定义布尔数,其值可以
是TRUE(真)或FALSE(假)。数据库原理3.2.1基本表的定义CREATETABLE<基本表名>(<列名1><列数据类型>[列完整性约束],<列名2><列数据类型>[列完整性约束],……[表级完整性约束])数据库原理创建基本表例子例3.1创建员工关系表。CREATETABLEE
mployee(EnoCHAR(5),EnameVARCHAR(10),SexCHAR(2),MarryCHAR(2),DnoCHAR(4));数据库原理例3.2创建员工关系表时加入列完整性约束。CREATETABLEEmployee(EnoCHAR(5)NOTN
ULLUNIQUE,EnameVARCHAR(10)NOTNULL,SexCHAR(2)NOTNULL,MarryCHAR(2)DEFAULT'未',DnoCHAR(4)NULL);数据库原理3.2.2基本表的修改与删除ALTERTABLE<基本表名>[ADD<新列名><列数
据类型>[列完整性约束]][DROPCOLUMN<列名>][MODIFY<列名><新的数据类型>][ADDCONSTRAINT<表级完整性约束>][DROPCONSTRAINT<表级完整性约束>]数据库原理基本表修改例子例3.3在Employe
e表中增加一个Birth列(出生)。ALTERTALBEEmployeeADDBirthDATETIMENULL;例3.4修改Employee表中Marry列为BOOLEAN。ALTERTALBEEmploy
eeMODIFYMarryBOOLEAN;例3.5删除Employee表中新增的Birth列。ALTERTALBEEmployeeDROPCOLUMNBirth;数据库原理2.基本表的删除当数据库某个基本表不再使用时,可以将其删除。当一个基本表被删除后,该
表中的所有数据连同该表建立的索引都会被删除。但由该表导出的视图的定义仍然存在数据字典当中,只是无法使用。DROPTABLE<基本表名>数据库原理3.2.3索引的建立和维护为了改善查询性能,可以建立索引。索引是根据表中的一列或若干列按照一定顺序建立的列值,与表中记录
行之间具有一一对应关系的辅助表结构。索引属于物理存储的路径概念,而不是用户使用的逻辑概念。建立在多个列上的索引被称为复合索引。有两种重要的索引:聚集索引(ClusteredIndex)非聚集索引(Non-clusteredIndex)。数据库原理聚集索引聚集索引类
似于按姓氏排列数据的电话簿。由于聚集索引规定了数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。聚集索引对于那些经常要搜索范
围值的列特别有效。数据库原理非聚集索引非聚集索引与书本中的索引类似。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息则按另一种顺序存储(这可以由聚集索引规定)。与使用书中索引的方式相似,DBMS在搜索数据值时,先对
非聚集索引进行搜索,找到数据值在表中的位置,然后从该位置直接检索数据数据库原理1.创建索引CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<基本表名>(<列名>[<次序>],[,<列名>[<次序>]]…);说明:(1)UNI
QUE:规定索引的每一个索引值只对应于表中的唯一记录。(2)CLUSTER:规定此索引为聚集索引。省略CLUSTER则表示创建的索引为非聚集索引。(3)<次序>:建立索引时指定列名的索引表是ASC(升序)或DESC(降序
)。数据库原理创建索引例子例3.7在Employee表的属性列Eno上创建一个非聚集索引。CREATEINDEXIDX_DNO_ENOONEmployee(DnoASC,EnoASC);例3.8在Employee表
的属性列Ename上创建一个聚集索引。CREATECLUSTERINDEXIDX_ENAMEONEmployee(EnameASC);数据库原理2.删除索引过多或不当的索引会导致系统低效。用户在表中每加进一个索引,数据库就要做更多的工作。过多的索引甚至会导致索引碎片,降低系统
效率。DROPINDEX<索引名>数据库原理3.3SQL的数据操纵SQL语言的数据操纵功能主要包括查询(SELECT)、插入(INSERT)、删除(DELETE)和更新(update)四个方面。数据库原理3.3.1数据查询SQL数据查询是SQL语言中最重
要、最丰富也是最灵活的内容。SELECT<列名或表达式A1>,<列名或表达式A2>,…,<列名或表达式An>FROM<表名或视图名R1>,<表名或视图名R2>,…<表名或视图名Rm>WHEREP;查询的基本结构包括了三个字句:SELECT、FR
OM、WHERE。数据库原理(1)SELECT子句,对应关系代数中的投影运算,用于列出查询结果的各属性。(2)FROM子句,对应关系代数中的广义笛卡尔乘积,用于列出被查询的关系:基本表或视图。(3)WHERE子句,对应关系代数中的选择谓词,这些谓词涉及FROM子句中的关系
的属性,用于指出连接、选择等运算要满足的查询条件。SQL数据查询的基本结构在关系代数中等价于:πA1,A2,…An(бp(R1×R2×…×Rm))数据库原理SQL数据查询的一般格式为:SELECT[ALL|DISTINCT]<列名或表达式>[别名1][,<列名或表达式>[别名2]]…FRO
M<表名或视图名>[表别名1][,<表名或视图名>[表别名2]]…[WHERE<条件表达式>][GROUPBY<列名1>][HAVING<条件表达式>][ORDERBY<列名2>][ASC|DESC]数据库原理1.单表无条件查询单表无条件查询是指只含有SELECT子句和FROM子句的查询SELE
CT[ALL|DISTINCT]<列名或表达式>[别名1][,<列名或表达式>[别名2]]…FROM<表名或视图名>[表别名1][,<表名或视图名>[表别名2]]…数据库原理①查询关系中的指定列例3.10查询所有学生的学号、姓
名、年龄。SELECTSno,Sname,AgeFROMStudent;例3.11查询所有课程的基本情况。SELECTCno,Cname,CreditFROMCourse数据库原理②DISTINCT保留字的使用当查询的结果只包含元表中的部分列时,结果中可能会出现重复列,使用DISTINCT保留
字可以使重复列值只保留一个。③查询列中含有运算的表达式SELECT子句的目标列中可以包含带有+、-、×、/的算术运算表达式,其运算对象为常量或元组的属性。数据库原理列名中含有算术表达式例子【例3.13】查询所有学生
的学号、姓名和出生年份。SELECTSno,Sname,2005-AgeFROMStudent数据库原理(4)查询列中含有字符串常量【例3.14】查询每门课程的课程名和学分。SELECTCname,'学分',CreditFROMC
ourse这种书写方式可以使查询结果增加一个原关系里不存在的字符串常量列,元组在该列上的每个值就是字符串常量。数据库原理(5)查询列中含有集函数COUNT(*)统计查询结果中的元组个数COUNT(<列名>)统计查询结果中一个列上值的个数MAX(<列名>)计算查询结果中
一个列上的最大值MIN(<列名>)计算查询结果中一个列上的最小值SUM(<列名>)计算查询结果中一个数值列上的总和AVG(<列名>)计算查询结果中一个数值列上的平均值①除COUNT(*)外,其他集函数都会先去掉空值再计算。②在<列名>
前加入DISTINCT保留字,会将查询结果中重复的列去掉后再计算。数据库原理列名含有函数运算例子【例3.15】COUNT函数的使用。SELECTCOUNT(*)FROMStudent统计学生表中的记录数。SELECTCOUNT(Place)FROMStudent统计
学生的籍贯(去掉空值)。SELECTCOUNT(DISTINCTPlace)FROMStudent统计学生的籍贯种类数。数据库原理2.单表带条件查询一般地,数据库中的数据量都非常大,显示表中所有的行是很不现实的,可以在查询的时候根据查询条件对表进行水平分割,使用WHERE子句即可实现
。SELECT[ALL|DISTINCT]<列名或表达式>[别名1][,<列名或表达式>[别名2]]…FROM<表名或视图名>[表别名1][,<表名或视图名>[表别名2]]…WHERE<条件表达式>数据库原
理(1)使用关系运算表达式的查询使用比较运算符的条件表达式的一般形式为:<列名>θ<列名>和<列名>θ常量值例3.17查询籍贯是湖北的学生信息。SELECT*FROMStudentWHERESlace='湖北'数
据库原理例3.18查询选修了C01号课程且考试及格的学生学号和成绩。SELECTSno,GradeFROMStudyWHERECno=’C01’ANDGrade>=60数据库原理(2)使用特殊运算符ANSI标准SQL允许在WHERE子句中使用特殊的运算符。运算符含义IN、NOTI
N判断属性值是否在一个集合内BETWEEN…AND…、NOTBETWEEN…AND…判断属性值是否在某个范围中ISNULL、ISNOTNULL判断属性值是否为空LIKE、NOTLIKE判断字符串是否匹配数据库原理例3.19查询籍贯为湖北和福建两地的学生信息。SELECT*FROMSt
udentWHEREPlaceIN('湖北','福建')相当于SELECT*FROMStudentWHEREPlace='湖北'ORplace='福建')数据库原理例3.20从Study表中查询考
试成绩在85和95之间的学生学号。SELECTSnoFROMStudyWHEREGradeBETWEEN85AND95SELECTSnoFROMStudyWHEREGrade>=85ANDGrade<=95数据库原理(3)字符串比较在SQL中可以使用关系运算符来进行字符串比较。实际上比
较的是它们的词典顺序(如字典顺序或字母表顺序)。如果a1a2…an和b1b2…bm是两个字符串,若a1<b1或a1=b1且a2<b2或a1=b1,a2=b2且a3<b3,当n<m并且1a2…an=b1b2…bn时,字符串a1a2…an<b1b2…bm,也就是第一个字符串正
好是第二个字符串的前缀。例如fodder<foo数据库原理SQL也提供了一种简单的模式匹配功能用于字符串比较,可以使用LIKE和NOTLIKE来实现=和<>的比较功能基本格式为:<列名>LIKE/NOTLIKE<字符串常数>数据库原理通
配符字符串常数中通常要使用通配符。在字符串常数中除通配符外的其它字符只代表自己。通配符可以出现在字符串的任何位置。但通配符出现在字符串首时查询效率会变慢。通配符含义%表示任意长度的字符串_(下划线)表示任意的单个字符数据库原理例3.21查询姓王的学生的
学号、姓名、年龄。SELECTSno,Sname,AgeFROMStudentWHERESnameLIKE'王%'若通配符本身就是字符串常量的内容,则可增加短语ESCAPE,使之转义。如:WHEREsnameLIKE‘To\_%’ESCAPE‘\’,则紧跟在
\后面的_不是通配符而是字符串常量的一个字符而已。该查询条件为:Sname属性值以“To_”开头,后面紧跟任意个字符的串。数据库原理3.分组查询和排序查询(1)GROUPBY与HAVING含有GROUPBY的查询称为分组查询。GROUPBY子句把一个表按某一指定列(或一些列)上的值相等的原则
分组,然后再对每组数据进行规定的操作。分组查询一般和查询列的集函数一起使用,当使用GROUPBY子句后,所有的集函数都将是对每一个组进行运算,而不是对整个查询结构进行运算。数据库原理例3.22查询每一门课程的平均得分。在Study关系表中记录着学生选修的每门课程和相应的考试成绩。由于一门课程
可以有若干个学生学习,SELECT语句执行时首先把表Study的全部数据行按相同课程号划分成组,即每一门课程都有一组学生和相应的成绩,然后再对各组执行AVG(grade)SELECTCno,AVG(Grade)
FROMStudyGROUPBYCno数据库原理查询课程的平均得分CnoAVG(Grade)C0175.5C0283C0375C0473.5C0597数据库原理例3.23查询被3人以上选修的每一门课程的平均成绩、最高分、最
低分。SELECTCno,AVG(Grade),MAX(Grade),MIN(Grade)FROMStudyGROUPBYCnoHAVINGCOUNT(*)>=3本例中SELECT语句执行时首先按Cno把表Study分组,然后对各组的记录执
行AVG(Grade)、MAX(Grade)、MIN(Grade)等集函数,最后根据HAVING子句的条件表达式COUNT(*)>=3过滤出组中记录数在3条以上的分组。数据库原理(2)排序查询SELE
CT子句的ORDERBY子句可使输出的查询结果按照要求的顺序排列。由于是控制输出结果,因此ORDERBY子句只能用于最终的查询结果。基本格式是:ORDERBY<列名>[ASC|DESC]有了ORDERBY子句后,
SELECT语句的查询结果表中各元组将按照要求的顺序排列:首先按第一个<列名>值排列;前一个<列名>相同的,再按下一个<列名>值排列数据库原理例3.24查询所有学生的基本信息,并按年龄升序排列,年龄相同的按学号降序排列。SELECT*FROMStudentORDERB
YAge,SnoDESC数据库原理4.多表查询在数据库中通常存在着多个相互关联的表,用户常常需要同时从多个表中找出自己想要的数据,这就涉及到多个数据表的查询。SQL通过连接查询、并操作、交操作、差操作可以实现
关系代数中的运算功能。数据库原理(1)连接查询SQL提供在FROM子句中列出每个关系,然后在SELECT子句和WHERE子句中引用FROM子句中的关系的属性,而WHERE子句中用来连接两个关系的条件称为连接条件。例3.25查询籍贯为湖北的学生的学号、选修的课程
号和相应的考试成绩。SELECTStudent.Sno,Cno,GradeFROMStudent,StudyWHEREStudent.Sno=Study.SnoANDPlaceLIKE'湖北‘数据库原理④在等值连接
中,目标列可能出现重复的列,例如:SELECTStudent.*,Study.*FROMStudent,StudyWHEREStudent.Sno=Study.SnoANDPlaceLIKE'湖北'这里Student.Sno和Study.Sno是两个重
复列数据库原理⑤还有一种特殊的连接运算,它不带连接条件,称为乘积运算SELECTStudent.Sno,Cno,GradeFROMStudent,Study两个关系的乘积会产生大量没有意义的元组,并且这种操作要消耗大量的系统资源,一般很少使用。数据库原理可以进行两个以上的连接。
例3.26查询籍贯为湖北的学生的姓名、选修的课程名称和相应的考试成绩。SELECTSname,Cname,GradeFROMStudent,Study,CourseWHEREStudent.Sno=Study.SnoANDStudy.Cno
=Course.CnoANDPlaceLIKE'湖北'数据库原理(3)自身连接有一种连接是一个关系与自身进行的连接,这种连接称做自身连接。SQL允许为FROM子句中的关系R的每一次出现定义一个别名。这样在SELECT子句和WHER
E子句中的属性前面就可以加上“别名.<属性名>”。数据库原理例3.27查询籍贯相同的两个学生的基本信息。SELECTA.*FROMStudentA,StudentBWHEREA.Place=B.Place该例中要查询的内容属于表Student。上面的语句将表Student分别取两个别名
A、B。这样A、B相当于内容相同的两个表。将A和B中籍贯相同的元组进行连接,经过投影就得到了满足要求的结果。数据库原理(3)并操作SQL使用UNION把查询的结果并起来,并去掉重复的元组,如果要保留所有重复,则必须使用UNIONALL。【例3.28】查询籍贯是湖北的学生以及姓张的学生的基
本信息。SELECT*FROMStudentWHEREPlaceLIKE'湖北'UNIONSELECT*FROMStudentWHERESnameLIKE'张%'数据库原理(4)交操作SQL使用INTERSECT把同时出现在两个查询中的结果取出,实现交操作,并且也会去掉重复的元组,如
果要保留所有重复,则必须使用INTERSECTALL。例3.29查询年龄大于18岁、姓张的学生的基本信息。SELECT*FROMStudentWHEREAge>18INTERSECTSELECT*FROMStudentWHERESnameLIKE'张
%'数据库原理(5)差操作SQL使用MINUS把出现在第一个查询结果中但不出现在第二个查询结果中的元组取出,实现差操作。例3.30查询年龄大于20岁的学生基本信息与女生的基本信息的差集。SELECT*FROMStudentWHEREAge>
20MINUSSELECT*FROMStudentWHERESexLIKE'女'数据库原理5.嵌套查询嵌套查询是指一个SELECT-FROM-WHERE查询块嵌入在另一个SELECT–FROM–WHERE查询块WHERE子句中
的查询。外层查询称为父查询,内层查询称为子查询。子查询中还可以嵌套其它子查询,即允许多层嵌套查询,其执行过程是由里到外的,每一个子查询是在上一级查询处理之前完成的在子查询中不能使用ORDERBY子句。数据库原理(1)返回单值的子查询子查询返回的检索信息是单一的值。这类子查询看起来就像常量一
样,因此经常把这类子查询的结果与父查询的属性用关系运算符来比较。例3.31查询选修了C语言的学生的学号和相应的考试成绩。SELECTSno,GradeFROMStudyWHERECno=(SELECTCnoFROMCourseWHERECnameLIKE‘
C语言’)数据库原理例3.32查询考试成绩大于总平均分的学生学号。SELECTDISTINCTSnoFROMStudyWHEREGrade>(SELECTAVG(Grade)FROMStudy)在嵌套查询中,只有能确切知道内层查询返回的是单值时,才可以直接使用关系
运算符进行比较。数据库原理(2)返回多值的子查询使用ALL、ANY等谓词来解决。例3.33查询成绩至少比选修了C02号课程的一个学生成绩低的学生学号。SELECTSnoFROMStudyWHEREGra
de<ANY(SELECTGradeFROMStudyWHERECno='C02')ANDCno<>'C02'ANY运算符表示至少一个或某一个,因此使用<ANY就可表示至少比某集合中的一个少的含义数据库原理实际上,比最大的值小就等价于<ANY
,该例子可用聚合函数MAX来实现。SELECTSnoFROMStudyWHEREGrade<(SELECTMAX(Grade)FROMStudyWHERECno='C02')ANDCno<>'C02'数据库原理例3.34查询成绩比所有选修了C02号课程的学生成绩低的学生学号。SELECTS
noFROMStudyWHEREGrade<ALL(SELECTGradeFROMStudyWHERECno='C02')ANDCno<>'C02'ALL运算符表示所有或者每个,因此使用<ALL就可表示至少比某集合所有都少的含义。实际上,比
最小的值小就等价于<ALL数据库原理该例子可用聚合函数MIN来实现。SELECTSnoFROMStudyWHEREGrade<(SELECTMIN(Grade)FROMStudyWHERECno='C02')ANDCno<>'C02
'数据库原理对于在父查询中需要判断某个属性的值与子查询结果中某个值相等的这类查询可以用IN实现,也就是说可以用IN来代替“=ANY”。例3.35查询选修了C语言的学生的基本信息。SELECT*FROMStuden
tWHERESnoIN(SELECTSnoFROMStudyWHERECnoINSELECTCnoFROMCourseWHERECnameLIKE‘C语言’)数据库原理(3)相关子查询子查询的查询条件依赖于父查询,每次要对子查询中的外部元组变量的某一项赋值,
这类子查询称为相关子查询。在相关子查询中经常使用EXISTS谓词。子查询中含有EXISTS谓词后不会返回任何结果,只得到“真”或“假”。数据库原理【例3.36】查询选修了C语言的学生的学号。SELECTSnoFRO
MStudyWHEREEXISTS(SELECT*FROMCourseWHEREStudy.Cno=Course.CnoANDCnameLIKE‘C语言‘)首先取外层查询中Study表的第一个元组,根据它与内层查询相关的属性值(即Cno值)处理内层查询
,若WHERE子句的返回值为真(即内层查询结果非空),则取此元组放入结果表中数据库原理与EXISTS谓词相对应的是NOTEXISTS谓词。使用存在量词NOTEXISTS后,若内层查询结果为空,则外层的WHERE子句返回真值,否则返回假值。例3.37查询所有没选C04号课程
的学生的姓名。SELECTSnameFROMStudentWHERENOTEXISTS(SELECT*FROMStudyWHEREStudy.Sno=Student.SnoANDCno=‘C04’)数据库原理SQL语言中没有全称量词,因此必须利用谓词演算将一个带有全称量词的谓词
转换为等价的带有存在量词的谓词:例3.38查询选修了全部课程的学生姓名。由于没有全称量词,这里将题目的意思转换成等价的存在量词形式:查询这样的学生姓名,没有一门课程是他不选的。该查询可以形式化的表示如下:用p表示谓词“该学生选课”用x表示谓词“课程”,则上述查询可表示为,即“对于任何
一门课程该学生都选了”,将它转换为等价的带有存在量词的谓词后,则表示为,即“没有任何一门课程该学生不选”。()(())xpxp数据库原理该查询涉及3个关系表:存放学生姓名的Student表、存放所有课程信息的Course表、存放学生选课信息
的Study关系表。其SQL语句如下:SELECTSnameFROMStudentWHERENOTEXISTS(SELECT*FROMCourseWHERENOTEXISTS(SELECT*FROMStudyWHERESno=Student.SnoAN
DCno=Course.Cno))数据库原理SQL语言中也没有蕴函逻辑运算,因此必须利用谓词演算将一个逻辑蕴函的谓词转换为等价的带有存在量词的谓词:pqpq数据库原理例3.39查询至少选修了学生03061选修
的全部课程的学生学号。本题的查询要求解释如下:查询这样的学生,凡是03061选修的课程,他都选了。换句话说,若有一个学号为x的学生,对所有的课程y,只要学号为03061的学生选修了课程y,则x也选修了y,那么就将他的学号选出来。该查询可以形式化如
下:用p表示谓词“学生03061选修了课程y”用q表示谓词“学生x选修了课程y”则上述查询可表示为:该查询可转换为如下等价形式:()()(())(())()ypqypqypqypq数据库原理它所表达的语义为:不存在这样的课程y
,学生03061选了y,而学生x没有选。用SQL语言可表示如下:SELECTDISTINCTSnoFROMStudyXWHERENOTEXISTS(SELECT*FROMStudyYWHEREY.Sno='03061'ANDNOTEXIST(SELECT*FROMStudyZWHEREZ.
Sno=X.SnoANDZ.Cno=Y.Cno))数据库原理3.3.2插入数据当基本表建立以后,就可以往表中插入数据了,在SQL中插入数据使用INSERT语句实现。INSERT语句有两种插入形式:插入单个元组插入
多个元组。数据库原理1.插入单个元组INSERTINTO<基本表名>[(<列名1>,<列名2>,…,<列名n>)]VALUES(<列值1>,<列值2>,…,<列值n>)其中,<基本表名>指定要插入元组的表的名字;<列名1>,<列名2>,…,<列名n>为要添加列值的列名序列;VALU
ES后则一一对应要添加列的输入值。数据库原理例3.40在学生表中插入一个学生记录(04027,肖文,男,19,福建)。INSERTINTOStudentVALUES('04027','肖文','男',19,'福建')
例3.41在学习表中插入一个学生选课记录(04027,05)。INSERTINTOStudy(Sno,Cno)VALUES(‘04027’,‘05’)数据库原理2.插入多个元组INSERTINTO<基本表名>[(<列名1>,<
列名2>,…,<列名n>)]子查询这种形式可将子查询的结果集一次性插入基本表中。如果列名序列省略,则子查询所得到的数据列必须和要插入数据的基本表的数据列完全一致。如果列名序列给出,则子查询结果与列名序列要一一对应。数据
库原理【例3.42】如果已建有课程平均分表Course_avg(Cno,Average),其中average表示每门课程的平均分,向Course_avg表中插入每门课程的平均分记录。INSERTINTOCourse_avg(Cno,Average)SELE
CTCno,AVG(Grade)FROMStudyGROUPBYCno数据库原理3.3.3删除数据SQL提供了DELETE语句用于删除每一个表中的一行或多行记录。DELETE是数据操纵语句,只是删除表中的每条记录,不能删除表的定义。DELETE语句的一般格式:DELETEFROM<表名>
[WHERE<条件>]数据库原理例3.43删除籍贯为湖北的学生基本信息。DELETEFROMStudentWHEREPlaceLIKE'湖北'此查询会将籍贯列上值为“湖北”的所有记录全部删除。在WHERE条件中同样可以使用复杂的子查询。例3.44删除成绩不及格的学生
的基本信息。DELETEFROMStudentWHERESnoIN(SELECTSnoFROMStudyWHEREGrade<60)数据库原理3.3.4修改数据在SQL中使用UPDATE语句修改满足指
定条件元组的指定列值。满足指定条件的元组可以是一个元组,也可以是多个元组。UPDATE语句的一般格式为:UPDATE<基本表名>SET<列名>=<表达式>[,<列名>=<表达式>]…[WHERE<条件>]数
据库原理【例3.45】将数据库原理的学分改为3。UPDATECourseSETCredit=3WHERECnameLIKE'数据库原理'在WHERE条件中同样可以使用复杂的子查询。【例3.46】将所有选了数据结构的学生成绩
加5分。UPDATEStudySETGrade=Grade+5WHEREcnoIN(SELECTCnoFROMCourseWHERECnameLIKE‘数据结构’)数据库原理3.4视图视图是外模式的基本单位,从用户观点来看,视
图和基本表是一样的。实际上视图是从若干个基本表或视图导出来的表,因此当基本表的数据发生变化时,相应的视图数据也会随之改变。视图定义后,可以和基本表一样被用户查询、更新,但通过视图来更新基本表中的数据要有一定的限制。数据库原理
3.4.1建立视图SQL语言用CREATEVIEW命令建立视图,其一般格式为:CREATEVIEW<视图名>[(<列名>[,<列名>]…)]AS(子查询)[WITHCHECKOPTION]WITHCHECKOPTION是可选项,该选项表示
对所建视图进行INSERT、UPDATE和DELETE操作时,让系统检查该操作的数据是否满足子查询中WHERE子句里限定的条件,若不满足,则系统拒绝执行。数据库原理例3.47建立一个湖北考籍的学生信息视图。CREATEVI
EWHBStudentASSELECTSno,Sname,Sex,AgeFROMStudentWHEREPlaceLIKE'湖北'例3.48建立一个学习了C语言的所有学生信息的视图。CREATEVIEWC_stud_info(Sno,Sname,Sex,Place)ASSEL
ECTSno,Sname,Sex,PlaceFROMStudentWHERESnoIN(SELECTSnoFROMStudyWHERECnoIN(SELECTCnoFROMCourseWHERECnameLIKE‘C语言’))数据库原理3.4.2删除视图在SQL
中删除视图使用DROPVIEW语句,其一般格式为:DROPVIEW<视图名>例3.49删除视图HBStudent。DROPVIEWHBStudent本例将从数据字典中删除视图HBStudent的定义。数据库原理3.4.3查询视图视图已经建立,用户就可
对视图进行查询操作。从用户角度来说,查询视图与查询基本表是一样的,可是视图是存在于数据库当中的虚表,所以DBMS执行对视图的查询实际上是根据视图的定义转换成等价的对基本表的查询。因此DBMS对某SELECT语句进行处理时,若发现被查询对象是视图,则DBMS将进行下述操作:(
1)从数据字典中取出视图的定义。(2)把视图定义的子查询和本SELECT语句定义的查询相结合,生成等价的对基本表的查询(此过程称为视图的消解)。(3)执行对基本表的查询,把查询结果(作为本次对视图的查询结
果)向用户显示。数据库原理【例3.50】在例3.47建立的视图HBStudent中查找年龄大于20岁的学生基本信息。SELECTSno,Sname,Sex,AgeFROMHBStudentWHEREAge>20本例在执行时会转化为下列执行语句:SELECTSno,Sna
me,Sex,AgeFROMStudentWHEREPlaceLIKE'湖北'ANDAge>20数据库原理3.4.4更新视图视图更新是指对视图进行插入(INSERT)、删除(DELETE)和修改(UPDATE)操作。同查询视图一样,因为视图是虚表,所以对视图的更新实际是转换成对基本表的更
新。若加上子句WITHCHECKOPTION,则在对视图更新时,系统将自动检查原定义的条件是否满足。若不满足,则拒绝执行。数据库原理【例3.51】在湖北考籍的学生视图HBStudent中插入一湖北考生信息,该学生信息为:(04031,戴敏,女,21)INSERTINTOHBst
udentVALUES(‘04031’,‘戴敏’,‘女’,21)该语句执行时将转换成对Student表的插入:INSERTINTOStudentVALUES(‘04031’,‘戴敏’,‘女’,21,‘湖北’)系统会自动将学生所在的考籍“
湖北”放入VALUES子句中。数据库原理为了能正确执行视图更新,各DBMS对视图更新都有若干规定,由于各系统在实现方法上存在差异,这些规定也不尽相同。一般的限制有如下几个:(1)通常对于由一个基本表导出的视图,如
果是从基本表去掉除码外的某些列和行,那么是允许更新的。(2)一般对于多表连接得到的视图不允许更新。(3)若视图的列是由库函数或计算列构成,则不能更新。(4)若视图定义中含有DISTINCT、GROUPBY等子句,则不允许更
新。数据库原理3.4.5视图的优点1.视图提供一定程度的逻辑独立性用户程序是通过视图来访问数据库的,视图相当于用户的外模式,只需要修改用户的视图定义来保证用户的外模式不变,而用户的程序不必改变。2.视图有利于
数据的保密对于不同的用户定义不同的视图,而只授予用户访问自己视图的权限3.视图简化了用户的操作视图机制是用户把注意力集中在自己所关心的数据上。这种视图所表达的数据逻辑结构相比基本表而言,更易被用户所理解。数据库原理3.5触发
器触发器技术是保证数据完整性的高级技术,触发器还可以用于对系统的高级监测,确保系统在正常的工作环境中运行。一个触发器由两部分组成:触发事件及触发条件和动作。(1)触发事件。对数据库进行插入、删除、修改等操作时触发器被激发。①AFTER:在触发事件
完成之后,测试触发条件,如满足,则执行触发动作。②INSTEADOF:在触发事件发生时,测试触发条件,如满足,则执行触发器动作,从而替代触发器事件的操作。(2)触发条件和动作。条件指定其它准则,以确定DELETE、INSERT或UPDATE语句是否导
致执行触发器动作。数据库原理3.5.2创建触发器触发器由CREATETRIGGER语句创建,一般格式为:CREATETRIGGER<触发器名>ON<表名>FOR|AFTER|INSTEADOF{[DELETE,INSERT,UPDAT
E]}AS[IFUPDATE(<列名>)[{AND|OR}UPDATE(<列名>)]…]SQL语句[…]数据库原理1)触发器名是要建立的触发器名字;表名是该触发器的操作对象;AFTER和INSTEADOF是触发事件的两种时间选项,如果仅指定FOR关键字,则AF
TER是默认设置;{[DELETE,INSERT,UPDATE]}是激活触发器的触发事件。(2)必须至少指定一个选项,其顺序可以任意组合,如果指定的选项多于一个,则需要用逗号分隔这些选项。(3)[IFUPDATE(<列名>)[{AND|OR}UPDATE(<列名>)]…]用于测试在
指定的列上进行的INSERT或UPDATE操作,不能用于DELETE操作。用AND或OR可以组合指定多列。在INSERT操作中,IFUPDATE将返回TRUE值,因为这些列插入了显式值或隐性值(NULL)。(4)SQL语句[…]是触发器的条件和操作。