ch6_数据库语言SQL_第1页
ch6_数据库语言SQL_第2页
ch6_数据库语言SQL_第3页
ch6_数据库语言SQL_第4页
ch6_数据库语言SQL_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第6章 数据库语言SQL本章内容概述本章内容概述n结构化查询语言结构化查询语言SQL既是数据操作语言,又是数据定义语言既是数据操作语言,又是数据定义语言支持对数据库的查询、修改和模式定义支持对数据库的查询、修改和模式定义SQL本质上是查询语言标准,对应几个版本本质上是查询语言标准,对应几个版本n诞生简史诞生简史1974年,由年,由Boyce(Boyce-Codd范式)和范式)和Chamberlin提提出出19751979年,年,IBM的的San Jose研究室的研究人员在数据研究室的研究人员在数据库管理系统库管理系统System R中实现了中实现了SQL语言。语言。nANSI SQL(86|8

2、9) 1986年年10月,美国国家标准局(月,美国国家标准局(ANSI)的数据库委员会)的数据库委员会批准批准SQL-86版为美国数据库语言的标准。版为美国数据库语言的标准。(ANSI) SQL-92:SQL2n早期的早期的SQL Server中的中的T-SQL是是ANSI SQL的延伸,的延伸,但最为符合但最为符合SQL-92标准,更新版本已经在此基础上标准,更新版本已经在此基础上有所扩充有所扩充(ANSI) SQL-99:SQL3n一个区别实例:在一个区别实例:在ANSI SQL-92标准中,标准中,ORDER BY子句中不允许出现没有在子句中不允许出现没有在SELECT清单中指定的表达清

3、单中指定的表达式,但式,但ANSI SQL-99标准允许标准允许(ANSI)SQL-2003:最新标准,尚在制定中最新标准,尚在制定中nSQL Server2005在部分功能上符合在部分功能上符合SQL2003的标准的标准n本章主要介绍一般性的本章主要介绍一般性的SQL结构,不考虑版本差异结构,不考虑版本差异具体在具体在DBMS工具软件使用时可能会有细微差别工具软件使用时可能会有细微差别本章的本章的SQL是作为独立的查询语言进行分析的是作为独立的查询语言进行分析的n实际使用中经常将实际使用中经常将SQL嵌入到宿主语言的数据模块中嵌入到宿主语言的数据模块中包括事务处理机制包括事务处理机制n第第7

4、章针对约束和触发器进行分析,它们是对数据库内容章针对约束和触发器进行分析,它们是对数据库内容施加用户控制的一种方式;施加用户控制的一种方式;n第第8章讲述提高章讲述提高SQL查询效率的方法,主要采用索引及相查询效率的方法,主要采用索引及相关的数据结构;关的数据结构;n第第9章讲述数据库相关的编程技术,通过存储过程介绍嵌章讲述数据库相关的编程技术,通过存储过程介绍嵌入式入式SQL的程序语法结构的程序语法结构5查询所用数据库查询所用数据库:电影数据库电影数据库 Movies (title, year, length, genre, studioName, producerC#) StarsIn (

5、movieTitle, movieYear, starName) MovieStars (name, address, gender, birthdate) MovieExecs (name, address, cert#, netWorth) Studios (name, address, presC#) 6.1 SQL中的简单查询中的简单查询nSelect-from-where查询语句查询语句基本查询类似关系代数中的选择操作基本查询类似关系代数中的选择操作例例6.1,比较简单,但要注意字段(属性)数,比较简单,但要注意字段(属性)数据类型有不同据类型有不同 例例6.1: 查找查找Disne

6、y 公司,在公司,在1990年制作的所有电影的有关信息年制作的所有电影的有关信息 SELECT * FROM Movies WHERE studioName=Disney AND year=19906.1 SQL中的简单查询中的简单查询n阅读和书写技巧阅读和书写技巧先看先看from子句,弄清设计的关系子句,弄清设计的关系再看再看where子句,了解要找的元组需要具备什么特征子句,了解要找的元组需要具备什么特征或者必须满足什么条件或者必须满足什么条件最后看最后看select子句,决定输出内容子句,决定输出内容n大小写无关(大小写无关(146页上方文本框内容)页上方文本框内容)但要注意单引号括起来

7、的字符串内容有区分大小写但要注意单引号括起来的字符串内容有区分大小写n关键字和关系名都不区分大小写关键字和关系名都不区分大小写FROM、From或或fromnfrom和和FROM是不同的字符串是不同的字符串6.1 SQL中的简单查询中的简单查询nSQL中的投影中的投影例例6.2:简单说明句法结构:简单说明句法结构n注意第注意第145页该例分析内容最后一句话,对应第页该例分析内容最后一句话,对应第151页习题页习题6.1.1例例6.3:投影同时更改属性名,注意新关系实:投影同时更改属性名,注意新关系实例的模式发生变化例的模式发生变化例例6.4:不是直接投影到属性,而是属性的表:不是直接投影到属性

8、,而是属性的表达式达式例例6.5:例:例6.4的特例,表达式为常量。的特例,表达式为常量。n可用于新关系的初始化过程设定属性值可用于新关系的初始化过程设定属性值9n SQL中的选择中的选择 WHERE子句,表达查询满足条件的元组子句,表达查询满足条件的元组 运算符运算符/关键字关键字 比较比较 =, , =, =, , !, ! 确定范围确定范围 NOT BETWEEN . AND . 确定集合确定集合 NOT IN 字符匹配字符匹配 NOT LIKE 空值空值 IS NOT NULL 逻辑逻辑 AND OR NOT 串的拼接串的拼接 | + SQL Server 2000以上以上6.1 SQ

9、L中的简单查询中的简单查询6.1 SQL中的简单查询中的简单查询nSQL中的选择中的选择关键是条件子句的内容关键是条件子句的内容P147 例例6.6 nSQL查询和关系代数(查询和关系代数(P146文本框内容)文本框内容)一句话归纳一句话归纳n标准标准SQL查询查询SELECT L FROM R WHERE C 等等价于关系代数表达式价于关系代数表达式 L (C ( R ) )n字符串字符串SQL中支持两种不同类型字符串,即定长中支持两种不同类型字符串,即定长char (m)和和可变长可变长varchar (n)n位串的表示:位串的表示:B011 、X7ff6.1 SQL中的简单查询中的简单查

10、询n字符串比较字符串比较按字典顺序和字母表顺序从前往后按字典顺序和字母表顺序从前往后nfodderfoo, bar=0 _(下划线下划线) 任意字符任意字符 指定范围内的任意单个字符指定范围内的任意单个字符 不在指定范围内的任意单个字符不在指定范围内的任意单个字符nP148 例例6.7 where title like star _ _ _ _;12例:例: LIKE %been% LIKE Ma% LIKE CK% 第第1个是个是C或或K LIKE A-D% 第第1个不是个不是A-D之间之间 LIKE %ea_ LIKE _en6.1 SQL中的简单查询中的简单查询n单引号单引号SQL规定两

11、个连续单引号表示一个单引号,而不作为字规定两个连续单引号表示一个单引号,而不作为字符串的结束符符串的结束符n例例6.8 WHERE title LIKE %s%n%和和_ 需要转义字符表示需要转义字符表示(148页文本框页文本框)SQL中用中用ESCAPE x来指定任意字符来指定任意字符x临时担任转义字符,临时担任转义字符,此时此时x%( _ )表示表示%( _ )n例如:例如:s LIKE x%x% ESCAPE x 该模式匹配以字符该模式匹配以字符%开头并同时以它结尾的字符串,开头并同时以它结尾的字符串,这里仅仅中间的这里仅仅中间的%能匹配能匹配“任何字符串任何字符串”6.1 SQL中的简

12、单查询中的简单查询n日期和时间日期和时间SQL的实现版本中通常将的实现版本中通常将Date和和Time作为独立的数据类作为独立的数据类型型, TIMESTAMP组合日期和时间组合日期和时间DATE 1948-05-14TIME 15:00:02.5TIMESTAMP 1948-05-14 12:00:00日期时间的比较日期时间的比较: 前一个日期早于第二个前一个日期早于第二个 小于小于 () 同一天内,前一个时间早于第二个同一天内,前一个时间早于第二个 小于(小于( )6.1 SQL中的简单查询中的简单查询n空值和涉及空值的比较空值和涉及空值的比较SQL中空值的三种含义中空值的三种含义n未知值

13、:有值但不知道是什么,例如生日,一般用作未知值:有值但不知道是什么,例如生日,一般用作属性初始化属性初始化n不适用的值:表示任何值在这里都没有意义,如单身不适用的值:表示任何值在这里都没有意义,如单身汉的配偶(姓名)属性只能是空,给任何具体值都不汉的配偶(姓名)属性只能是空,给任何具体值都不符合实情符合实情n保留的值:属于某对象但无权知道的值,一般用在权保留的值:属于某对象但无权知道的值,一般用在权限不足以获取实际取值时,例如未公布的电话号码在限不足以获取实际取值时,例如未公布的电话号码在phone属性中显示为属性中显示为NULL6.1 SQL中的简单查询中的简单查询nNULL的运算规则的运算

14、规则NULLNULL和其他任何值的算术运算结果都是和其他任何值的算术运算结果都是NULLNULLNULLNULL和其他任何之进行比较运算结果都是和其他任何之进行比较运算结果都是UNKNOWNUNKNOWNNULLNULL是一个特殊值,但又不算是一个常量,所以不能直接将是一个特殊值,但又不算是一个常量,所以不能直接将NULLNULL作为操作数作为操作数 例例6.9 设设x 值为值为 NULLnx + 3 的值为的值为NULL,但,但NULL + 3不合法!不合法!nx = 3的值是的值是UNKNOWN,但,但NULL = 3不合法不合法n(150页文本框内容)使用空值的小缺陷:页文本框内容)使用

15、空值的小缺陷:0与与x的积为的积为NULL而不是而不是0 x x的值为的值为NULL而不是而不是0判断判断x的值是否为空值:的值是否为空值:x IS NULL,结果为,结果为TRUE或或FALSE6.1 SQL中的简单查询中的简单查询n布尔值布尔值UNKNOWN详细运算真值表见详细运算真值表见P150图图6-2n将将TRUE看作看作1,FALSE看作看作0,UNKNOWN看作看作0.5AND运算取小运算取小OR运算取大运算取大NOT运算取对运算取对1的补的补n条件表达式结果是条件表达式结果是UNKNOWN的等同的等同FALSE处理处理UNKNOWN引出的一个缺陷引出的一个缺陷n例例6.10,本

16、意是想查询返回所有元组,但实际返回的是,本意是想查询返回所有元组,但实际返回的是LENGTH属性非空的元组属性非空的元组不用专门弥补(题目中的语句构造特殊,其实可以用不用专门弥补(题目中的语句构造特殊,其实可以用多种方式实现同样功能且不会出错,习题多种方式实现同样功能且不会出错,习题6.1.6),但),但在实际应用在实际应用SQL时要注意细节以防出现意外情况时要注意细节以防出现意外情况6.1 SQL中的简单查询中的简单查询n输出排序输出排序 ORDER BY 属性列表属性列表 ASC/DESC排序是在排序是在FROM、WHERE和别的子句的结果上进行,和别的子句的结果上进行,排序之后再用排序之

17、后再用SELECT子句。子句。排序列可以是表达式:排序列可以是表达式:ORDER BY A+B DESC;例例6.11 查询查询Disney公司公司1990年拍摄的影片信息,以片长的年拍摄的影片信息,以片长的升序排列,同样片长的,以片名的字母序排列。升序排列,同样片长的,以片名的字母序排列。 SELECT * FROM Movies WHERE studioName=Disney AND year=1990 ORDER BY length, title6.1 SQL中的简单查询中的简单查询n习题习题6.1.2(a)(c)6.1.3(a)(b)(e)6.1.5n注意题目要求是要描述清楚满足这些条

18、件的元组集注意题目要求是要描述清楚满足这些条件的元组集合,即什么样的元组能够使得表达式结果为真?这合,即什么样的元组能够使得表达式结果为真?这样就把样就把UNKNOWN结果排除在外了。结果排除在外了。n基本的简单基本的简单SQL查询语法介绍完毕,下面查询语法介绍完毕,下面进入跨表查询进入跨表查询6.2 多关系查询多关系查询nSQL中的积和连接中的积和连接简单做法:在简单做法:在from字句中列出所有关系字句中列出所有关系例例6.12 找出电影找出电影Star Wars的制片人名字的制片人名字 SELECT name FROM Movies, MovieExecs WHERE title =St

19、ar Wars AND producerC# = cert#n图图6-3中给出了形象描述中给出了形象描述n避免属性歧义避免属性歧义重名的处理重名的处理例例6.13 SELECT MovieS, MovieE FROM MovieStars, MovieExecs WHERE MovieStars.address = MovieExecs.address6.2 多关系查询多关系查询n元组变量元组变量为关系的每次出现定义一个别名,用来区分同一查询中为关系的每次出现定义一个别名,用来区分同一查询中需要多次出现的同一关系的不同(甚至同一)元组需要多次出现的同一关系的

20、不同(甚至同一)元组例例6.14,查找具有相同住址的两个影星,查找具有相同住址的两个影星SELECT , FROM MovieStars star1, MovieStars star2 WHERE star1.address = star2.address AND n比较住址的元组都是来自同一个关系比较住址的元组都是来自同一个关系MovieStarn注意注意的作用是为了避免同一元组自身比较后作为结果的作用是为了避免同一元组自身比较后作为结果去掉这一条件,则所有人自己和自己之间都满足条件了,结去掉这一条件,则所有人

21、自己和自己之间都满足条件了,结果中多了这部分元组,而实际上不符合要求果中多了这部分元组,而实际上不符合要求n但如果改成但如果改成也有问题,每一对满足条件的人都会出现两次也有问题,每一对满足条件的人都会出现两次都能保证结果中每对只出现一次都能保证结果中每对只出现一次n多关系查询的解释多关系查询的解释Select查询有三种不同的备选实现机制,其作用都是实现查询有三种不同的备选实现机制,其作用都是实现同一个查询同一个查询嵌套循环嵌套循环n所有关系都对应元组变量,每一个元组变量对应一层所有关系都对应元组变量,每一个元组变量对应一层循环,遍历该元组变量对应的关系循环,遍历该元组变量对应的关系图图6-4描

22、述了按照嵌套循环机制响应一个简单查询描述了按照嵌套循环机制响应一个简单查询的处理流程的处理流程并行赋值并行赋值n以一种任意的顺序,或者说并行的顺行从适当的关系以一种任意的顺序,或者说并行的顺行从适当的关系中把所有可能的元组都赋给元组变量。对于每一种赋中把所有可能的元组都赋给元组变量。对于每一种赋值,考虑值,考虑WHERE子句是否为真。每一种产生真值子句是否为真。每一种产生真值WHERE子句的赋值给答案贡献一个元组。子句的赋值给答案贡献一个元组。6.2 多关系查询多关系查询n多关系查询的解释多关系查询的解释转换成关系代数转换成关系代数n把把SQL查询转换成相应的关系代数操作查询转换成相应的关系代

23、数操作从从from子句的元组变量开始求笛卡尔积子句的元组变量开始求笛卡尔积再将再将where子句转换成条件进行选择操作子句转换成条件进行选择操作最后用最后用select子句投影子句投影例例6.15 将将6.14的查询转换成关系代数的查询转换成关系代数6.2 多关系查询多关系查询n多种关系查询的解释多种关系查询的解释意外结果意外结果 SELECT R.A FROM R, S, T WHERE R.A=S.A OR R.A=T.A;n本意希望通过查询语句计算本意希望通过查询语句计算R(ST),当,当T为空时得到为空时得到RS,分别用三种实现机制分析得到的结果都是空,分别用三种实现机制分析得到的结果

24、都是空n一个实例:假设一个实例:假设R是本班学生学号列表,是本班学生学号列表,S为本年段获国家为本年段获国家奖学金的学号,奖学金的学号,T为本年段获校级奖学金的学号,希望求出为本年段获校级奖学金的学号,希望求出本班所有获国奖或校奖的学号本班所有获国奖或校奖的学号 Select R.no from R, S, T where R.no=S.no OR R.no=T.non但如果本班无人获国奖,按照前面的分析可知,查询结果但如果本班无人获国奖,按照前面的分析可知,查询结果会连我班获校奖学号也丢失会连我班获校奖学号也丢失6.2 多关系查询多关系查询n查询的并、交、差查询的并、交、差SQL提供了对应的

25、操作用在查询结果上,条件是这些查询提供了对应的操作用在查询结果上,条件是这些查询结果提供的关系具有相同的属性和属性类型列表。结果提供的关系具有相同的属性和属性类型列表。用用UNION、INTERSECT和和EXCEPT对应并交差对应并交差n例例6.16,图,图6-5,可以简单思考如果不用并交差如何实现,可以简单思考如果不用并交差如何实现SELECTn例例6.17,找出不是电影公司制片人的影星的名字和地址,找出不是电影公司制片人的影星的名字和地址n例例6.18,找出所有出现在,找出所有出现在Movies和和StarsIn中的电影的名字和中的电影的名字和年份。年份。6.2 多关系查询多关系查询6.

26、3 子查询子查询n使用子查询的四种方式使用子查询的四种方式上节介绍的并交差上节介绍的并交差子查询返回常量用作子查询返回常量用作WHERE的后继处理的后继处理子查询返回关系给子查询返回关系给WHERE子查询返回关系给子查询返回关系给FROMn产生标量值的子查询产生标量值的子查询标量:能成为元组字段值的原子值标量:能成为元组字段值的原子值例例6.19 找出找出Star Wars的制片人,两种思路实现查询的制片人,两种思路实现查询n在第二种思路中,嵌套子查询返回唯一的结果作为标量在第二种思路中,嵌套子查询返回唯一的结果作为标量在此结果中,如果返回关系(多个元组)则出错在此结果中,如果返回关系(多个元

27、组)则出错(因为使用因为使用=)但可以通过将但可以通过将=变成变成IN来避免(后面会介绍到)来避免(后面会介绍到)6.3 子查询子查询n含有关系的条件表达式含有关系的条件表达式NOT EXISTS R:当且仅当:当且仅当R非空则为真非空则为真NOT s IN R:当且仅当:当且仅当s等于等于R中的某一个值中的某一个值NOT s ALL R:当且仅当:当且仅当s大于大于R中的任何一个值中的任何一个值NOT s ANY R:当且仅当:当且仅当s至少大于至少大于R中某个值中某个值n含有元组的条件表达式含有元组的条件表达式例例6.20, 找出哈里森福特主演的电影的制片人找出哈里森福特主演的电影的制片人

28、n分为三层嵌套实现,图分为三层嵌套实现,图6-7(分析子查询应从里向外分析分析子查询应从里向外分析)n另一思路在图另一思路在图6-9,不用嵌套子查询,思考区别?,不用嵌套子查询,思考区别?这种做法的问题是可能会返回重复的制片人元组,避免的方这种做法的问题是可能会返回重复的制片人元组,避免的方式是式是DISTINCT约束约束而前面嵌套子查询用而前面嵌套子查询用IN本质上是集合运算,所以一般不会重本质上是集合运算,所以一般不会重复元组复元组6.3 子查询子查询n关联子查询关联子查询子查询要计算多次,主要针对子查询要计算多次,主要针对ANY/ALL,每次赋给某项,每次赋给某项来自子查询外部的某个元组

29、变量的值来自子查询外部的某个元组变量的值例例6.21,查询目标是两部或两部以上电影使用过的名字,查询目标是两部或两部以上电影使用过的名字n图图6-10。其中嵌套子查询要根据外层查询过程中每一个具体的。其中嵌套子查询要根据外层查询过程中每一个具体的year属性值再计算一次属性值再计算一次n注意属性名的作用范围是当前层次,如果当前层没有该属性则注意属性名的作用范围是当前层次,如果当前层没有该属性则再向外层去找再向外层去找nFROM子句中的子查询子句中的子查询子查询也可以用来作为子查询也可以用来作为FROM子句中的关系子句中的关系n必须有别名以便必须有别名以便WHERE中使用该子查询结果中使用该子查

30、询结果n例例6.22。查询。查询Harrison Ford演过的电影的制片人演过的电影的制片人先通过子查询获取满足条件的电影制片人证书号,再找名字先通过子查询获取满足条件的电影制片人证书号,再找名字图图6-116.3 子查询子查询nSQL的连接表达式的连接表达式使用积、自然连接、使用积、自然连接、连接和外连接运算符作用于两个连接和外连接运算符作用于两个关系创建新关系,结果本身可以作为一个查询关系创建新关系,结果本身可以作为一个查询交叉连接交叉连接(即笛卡尔积即笛卡尔积):CROSS JOIN条件连接:条件连接:R JOIN S ON C 交叉连接后按条件交叉连接后按条件C选择选择n例例6.23

31、 注意结果属性个数等同于叉积而不是自然连接!注意结果属性个数等同于叉积而不是自然连接!n如果要构造结果属性数目等价于自然连接,可在外层如果要构造结果属性数目等价于自然连接,可在外层通过通过SELECT去重去重自然连接自然连接 NATURAL JOINn回顾自然连接和条件连接的区别回顾自然连接和条件连接的区别连接条件连接条件结果属性数目结果属性数目n例例6.24 查询既是影星也是制片人的人查询既是影星也是制片人的人 MoviesStar NATURAL JOIN MovieExec;6.3 子查询子查询n外连接外连接 OUTER JOIN回顾悬浮元组和回顾悬浮元组和NULL补空补空n自然外连接自

32、然外连接R NATURAL FULL OUTER JOIN SR NATURAL LEFT OUTER JOIN SR NATURAL RIGHT OUTER JOIN S例例6.25n条件外连接条件外连接R FULL OUTER JOIN S ON CR LEFT OUTER JOIN S ON C R RIGHT OUTER JOIN S ON C例例6.266.4 全关系操作全关系操作n消除重复消除重复一般情况下一般情况下SQL查询创建的关系表可以包含重复元组查询创建的关系表可以包含重复元组n希望不包含重复用希望不包含重复用distinct实现实现例例6.27 图图6-9查找查找Harr

33、ison Ford出演的电影的制片人出演的电影的制片人n文本框内容:去重的代价文本框内容:去重的代价关系必须分组或排序后才能使相同的元组相邻,再去重,而分组关系必须分组或排序后才能使相同的元组相邻,再去重,而分组或排序的代价一般会比查询时间(遍历即可)还要长或排序的代价一般会比查询时间(遍历即可)还要长n并交差中的重复元组并交差中的重复元组默认情况下并交差操作自动去重,如要阻止去重,加关默认情况下并交差操作自动去重,如要阻止去重,加关键词键词ALLUNION ALL、INTERSECT ALL、EXCEPT ALLn例例6.286.4 全关系操作全关系操作nSQL中的聚集操作中的聚集操作通过在

34、通过在SELECT子句中的聚集操作和特定的子句中的聚集操作和特定的GROUP BY子句提供了子句提供了操作的所有功能;操作的所有功能;SQL中的聚集操作符:中的聚集操作符:SUM、AVG、MIN、MAX和和COUNT;n例例6.29 SELECT AVG(netWorth) FROM MovieExec;DISTINCT可以在使用聚集操作符之前从列中消除重复可以在使用聚集操作符之前从列中消除重复元组,元组,COUNT(X)和和COUNT (DISTINCT X)例例6.30中按照包和集合规则处理后的不同中按照包和集合规则处理后的不同6.4 全关系操作全关系操作n分组分组GROUP BY分组中的

35、分组中的SELECT子句可以包含聚集和属性子句可以包含聚集和属性n例例6.31多关系查询中使用多关系查询中使用GROUP BY分组分组n例例6.32元组含有空值时的特殊规则元组含有空值时的特殊规则n空值在任何聚集操作中都被忽视,不对求和、取平均、空值在任何聚集操作中都被忽视,不对求和、取平均、计数、最大、最小做贡献;计数、最大、最小做贡献;COUNT(*)和和COUNT(A)的的区别区别n在构成分组时,在构成分组时,NULL被作为一般的值对待;被作为一般的值对待;n除了计数以外,对空包的聚集操作结果均为除了计数以外,对空包的聚集操作结果均为NULL,即,即空包的计数结果为空包的计数结果为0,空

36、包的求和、去平均等结果为,空包的求和、去平均等结果为NULL。n例例6.336.4 全关系操作全关系操作nHAVING子句子句配合配合GROUP BY使用,选择满足条件的分组使用,选择满足条件的分组HAVING子句中的聚集只应用到正在检测的分组上子句中的聚集只应用到正在检测的分组上FROM子句中关系的属性都可以在子句中关系的属性都可以在HAVING中聚集,中聚集,但只有但只有GROUP BY中的属性才能在中的属性才能在HAVING中不聚集中不聚集例例6.34 文本框提示文本框提示SQL查询中的子句顺序:查询中的子句顺序:SELECT、FROM、WHERE、GROUP BY、HAVING和和OR

37、DER BYHAVING只能跟在只能跟在GROUP BY后后n三种更新操作三种更新操作插入元组到关系中去;插入元组到关系中去;从关系中删除元组;从关系中删除元组;修改某个元组的某些字段的值;修改某个元组的某些字段的值;n插入元组插入元组 INSERT INTO 关系名关系名 (属性属性1,属性,属性2.) VALUES (常量常量1,常量,常量2.) | SELECT语句语句 例例6.35注意缺省、属性排列顺序注意缺省、属性排列顺序全属性插入可以简化表示全属性插入可以简化表示6.5 数据库更新数据库更新6.5 数据库更新数据库更新例例6.36 往往Studio中添加在关系中添加在关系Movie

38、s中出现的、但没有在中出现的、但没有在Studio中出现的所有电影公司。缺省值可用中出现的所有电影公司。缺省值可用NULL补补文本框内容:关于插入时机选择,三种方式文本框内容:关于插入时机选择,三种方式n先选择全部电影公司名再插入先选择全部电影公司名再插入n去掉去掉DISTINCT后,先全部电影公司名再插入后,先全部电影公司名再插入n去掉去掉DISTINCT后,一有电影公司名即刻插入后,一有电影公司名即刻插入n后两种方式的区别在于后两种方式的区别在于“全部全部”会导致重复而逐个会导致重复而逐个不会,分析原因不会,分析原因6.5 数据库更新数据库更新n删除删除 DELETE FROM 关系名关系

39、名 WHERE 条件条件例例6.37、6.38n修改修改 UPDATE 关系名关系名 SET 属性属性1=表达式表达式1 ,属性,属性2=表达式表达式2 WHERE 条件条件例例6.39习题习题 P158 6.2.1 (a) (d) 6.2.2 (a) (b) 6.2.4 P166 6.3.1-6.3.11P172 6.4.5 6.4.6 (a) (f) (i) 6.4.8 6.4.9P175 6.5.2 (a) (c) (d)6.6 SQL中的事务中的事务n问题的提出问题的提出像银行业务或机票预定这样的应用,每秒钟都会有上像银行业务或机票预定这样的应用,每秒钟都会有上百个操作在数据库上执行。

40、百个操作在数据库上执行。如果如果DBMS完全没有约束对数据库操作的顺序,将会完全没有约束对数据库操作的顺序,将会出现错误。出现错误。例例6.40 航空公司选择航班座位的页面航空公司选择航班座位的页面 Flights (fltNo, fltDate, seatNo, seatStatus) 关于并发引出的错误图关于并发引出的错误图6-16n可串行化可串行化将一组需要一起执行的操作将一组需要一起执行的操作(如上例的查询和更新如上例的查询和更新),组,组织成一个事务,事务的执行时可串行化的,即一个时刻织成一个事务,事务的执行时可串行化的,即一个时刻只有一个事务,相互之间没有重叠。只有一个事务,相互之

41、间没有重叠。nP177文本框给出了一种能够保证串行化行为的简单文本框给出了一种能够保证串行化行为的简单做法:锁定数据库的元素防止被两个事务同时访问,做法:锁定数据库的元素防止被两个事务同时访问,DBMS提供了相关的锁机制。事务锁定了涉及关系提供了相关的锁机制。事务锁定了涉及关系Flights的其他事务,使之以串行化的方式执行,而的其他事务,使之以串行化的方式执行,而没有访问没有访问Flights的事务可以和选择座位的事务并行的事务可以和选择座位的事务并行执行。执行。6.6 SQL中的事务中的事务n原子性原子性如果多个数据库操作同一时间执行,在一个操作执行过如果多个数据库操作同一时间执行,在一个

42、操作执行过程中出现硬件或软件程中出现硬件或软件“崩溃崩溃”,则有可能使数据库置于,则有可能使数据库置于不可接受的状态。不可接受的状态。 例例6.41 银行账目记录银行账目记录Accounts (acctNo, balance),考虑,考虑从账户从账户123向账户向账户456转账转账100美元。美元。 设想若金额转入账户设想若金额转入账户2 之后,系统故障。则数据库状态之后,系统故障。则数据库状态为:账户为:账户2 增加金额但账户增加金额但账户1未减金额,对银行造成损失。未减金额,对银行造成损失。结论:数据库操作的某些组合,需要原子地完成,即要结论:数据库操作的某些组合,需要原子地完成,即要么都

43、做要么都不做。么都做要么都不做。6.6 SQL中的事务中的事务n事务事务对以上可串行化和原子性问题的解决方案是将数据库操作对以上可串行化和原子性问题的解决方案是将数据库操作组织为事务;组织为事务;事务是必须原子地执行的一个或多个数据库操作的集合,事务是必须原子地执行的一个或多个数据库操作的集合,即要么所有操作都执行要么都不执行,即要么所有操作都执行要么都不执行,SQL要求默认事务要求默认事务以可串行化方式执行。以可串行化方式执行。事务开始事务开始 START TRANSACTION 两种事务结束方式两种事务结束方式commit和和rollbacknCommit使事务成功结束,自当前事务开始以来

44、的语句使事务成功结束,自当前事务开始以来的语句引起的任何对数据库的修改都被持久地建立在数据库中;引起的任何对数据库的修改都被持久地建立在数据库中;nRollback使事务夭折或不成功,任何由该事务的使事务夭折或不成功,任何由该事务的SQL语语句所引起的修改都被撤销,即它们被回滚。句所引起的修改都被撤销,即它们被回滚。 6.6 SQL中的事务中的事务保证事务正确执行的保证事务正确执行的ACID特性特性nA 原子性原子性 Atomicity 事务中的操作要么都执行事务中的操作要么都执行,要么都不执行。要么都不执行。nC 一致性一致性 Consistency 以保证数据库从一个一致性状态到另一个一致

45、性状态。以保证数据库从一个一致性状态到另一个一致性状态。nI 隔离性隔离性 Isolation 一个事务的执行不能被其他事务干扰。一个事务的执行不能被其他事务干扰。nD 持续性持续性 Durability 事务提交后对数据库的改变是永久性的。即使出现故事务提交后对数据库的改变是永久性的。即使出现故障障,也不受影响。也不受影响。n只读事务只读事务通常,多个访问同一数据的只读事务可以并行执行,通常,多个访问同一数据的只读事务可以并行执行,但是多个写同一数据的事务不能并行执行。但是多个写同一数据的事务不能并行执行。n例例6.43 从例从例6.40的关系的关系Flights读取数据来判断某个座位是否读

46、取数据来判断某个座位是否是空闲的程序。是空闲的程序。该程序只读数据不写数据,其并行执行不会对数据库造成该程序只读数据不写数据,其并行执行不会对数据库造成永久性伤害;永久性伤害;最坏情况是:客户可能损失掉选择最喜欢位置的机会最坏情况是:客户可能损失掉选择最喜欢位置的机会只读、读写的设置只读、读写的设置 SET TRANSACTION READ ONLY SET TRANSACTION READ WRITE6.6 SQL中的事务中的事务n读脏数据读脏数据脏数据:未提交事务所写的数据脏数据:未提交事务所写的数据脏读取:对脏数据的读取脏读取:对脏数据的读取允许明确指定一个给定的事务可以读脏数据允许明确

47、指定一个给定的事务可以读脏数据 ISOLATION LEVEL READ UNCOMMITED读脏数据的风险读脏数据的风险n写数据的事务夭折,脏数据被移走,像不曾存在。如果别的事写数据的事务夭折,脏数据被移走,像不曾存在。如果别的事务读了这个脏数据,并提交对脏数据的计算或使用。务读了这个脏数据,并提交对脏数据的计算或使用。读脏数据有时出问题,有时无关紧要,当读脏数据无关读脏数据有时出问题,有时无关紧要,当读脏数据无关紧要时,允许读脏数据可以避免紧要时,允许读脏数据可以避免nDBMS用来预防读脏数据所做的费时的工作用来预防读脏数据所做的费时的工作n因等待而未去读脏数据造成的并发性的丢失因等待而未去读脏数据造成的并发性的丢失6.6 SQL中的事务中的事务46 例例6.44:以下述步骤进行账户转移:以下述步骤进行账户转移 1. 将钱加到账户将钱加到账户2 2.检测账户检测账户1是否有足够的钱是否有足够的钱 a) 没有:从账户没有:从账户2减去此金额减去此金额 (相当于回滚)(相当于回滚) b) 有:从账户有:从账户1减去此金额减去此金额 假设有可能读脏数据,且存在两个事务在同一时刻执行假设有可能读脏数据,且存在两个事务在同一时刻执行的事务的事务T1和和T2: 账户:账户:A1($1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论