欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    数据库系统原理与设计.ppt

    • 资源ID:5985730       资源大小:617KB        全文页数:103页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数据库系统原理与设计.ppt

    第3章 SQL语言,数据库系统原理与设计,第3章 SQL语言,学习目标SQL(Structured Query Language,结构化查询语言)是关系数据库的标准语言几乎所有的关系型数据库管理系统均采用SQL语言标准教学目标主要有两个要求读者掌握对数据库的基本操作,并了解数据库管理系统的基本功能要求读者熟练掌握SQL查询语句,并运用SQL语句完成对数据库的操作,第3章 SQL语言,学习方法要求读者结合课堂讲授的知识,强化上机实训,把课堂上学过的有关概念进行实训,以便加深理解,达到学习目标。学习指南重点:3.2、3.3、3.4、3.5、3.8和3.9节难点:3.3、3.4和3.5节,第3章 SQL语言,本章导读SQL查询语句对关系代数运算做了哪些扩展?连接查询包括哪些?它们分别用于什么地方?相关子查询与非相关子查询的概念。在使用分组聚合查询时需要注意的地方。如何理解存在量词以及存在量词在SQL查询中的重要地位。如何理解查询表的概念,查询表与子查询有何异同点?在SQL的DDL语句中如何实现完整性约束?实现完整性约束的方法有哪些?如何将数据库的对象(如基本表、索引)建立在特定的物理文件上?将数据库对象建立在特定的物理文件上,其目的是什么?建立视图的目的是什么?视图主要用于什么操作?,目 录,嵌套子查询,SQL概述,简单查询,连接查询,聚合查询,集合运算,SQL查询一般格式,SQL数据定义语言,SQL数据更新语言,视图,3.1 SQL概述,SQL语言于1974年由Boyce等提出,并于19751979年在IBM公司研制的System R数据库管理系统上实现,现已成为国际标准。很多数据库厂商都对SQL语句进行了再开发和扩展标准SQL命令包括查询SELECT插入INSERT更新UPDATE删除DELETE创建CREATE对象删除DROP可被用来完成几乎所有的数据库操作,3.1 SQL概述,3.1.1 SQL发展 3.1.2 SQL特点3.1.3 SQL查询基本概念,3.1.1 SQL发展,SQL-86:第一个SQL标准,由美国国家标准局(American National Standard Institute,简称ANSI)公布,1987年国际标准化组织(International Organization for Standardization,简称ISO)通过。该标准也称为SQL-1SQL-92:在1992年,由ISO和ANSI对SQL-86进行重新修订,该标准也称为SQL-2SQL-99:在1999年,该版本在SQL-2的基础上,扩展了诸多功能,包括递归、触发、面向对象技术等。该标准也称为SQL-3 SQL-2003:该标准是最新的标准,也称SQL-4,于2003年发布,3.1.1 SQL发展,SQL语言由4部分组成数据定义语言DDL(Data Definition Language)定义数据库的逻辑结构,包括数据库、基本表、视图和索引等,扩展DDL还支持存储过程、函数、对象、触发器等的定义DDL包括3类语言,即定义、修改和删除数据操纵语言DML(Data Manipuplation Language)对数据库的数据进行检索和更新,其中更新操作包括插入、删除和修改数据数据控制语言DCL(Data Control Language)对数据库的对象进行授权、用户维护(包括创建、修改和删除)、完整性规则定义和事务定义等其它主要是嵌入式SQL语言和动态SQL语言的定义,规定了SQL语言在宿主语言中使用的规则扩展SQL还包括数据库数据的重新组织、备份与恢复等功能,3.1.2 SQL特点,综合统一 集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL的功能于一体 高度非过程化 面向集合的操作方式采用集合操作方式,其操作对象、查找结果都是元组的集合 同一种语法结构提供两种使用方式SQL语言既是自含式语言,又是嵌入式语言。在两种不同的使用方式下,其语法结构基本上是一致的 语言简洁,易学易用SQL语言的动词非常少,主要包括:数据查询 SELECT;数据定义 CREATE、DROP、ALTER;数据操纵 INSERT、UPDATE、DELETE;数据控制 GRANT、REVOKE,3.1.3 SQL查询基本概念,SQL语言支持三级模式结构,外模式对应视图和部分基本表,模式对应基本表,内模式对应存储文件,3.1.3 SQL查询基本概念,基本表数据库中独立存在的表称为基本表在SQL中一个关系对应一个基本表一个(或多个)基本表对应一个存储文件一个表可以带若干索引索引存放在存储文件中视图指从一个或几个基本表(或视图)导出的表,是虚表只存放视图的定义而不存放对应数据查询表指查询结果对应的表存储文件指数据库中存放关系的物理文件,3.7SQL查询一般格式 P106,SELECT共有6个子句,其中SELECT和FROM是必须的,其它是可选项,必须严格按照如下顺序排列:SELECT ALL|DISTINCT AS,AS,.FROM AS,AS,.WHERE GROUP BY,.HAVING ORDER BY ASC|DESC,ASC|DESC,.,3.7SQL查询一般格式,其中:(1)可以是下面的可选格式:.*,.,(2)FROM子句指定查询所涉及的表、视图或查询表。为操作方便,常给表取一个别名,称为元组变量(3)WHERE子句给出查询的条件,随后的中可以使用下面的谓词运算符:比较运算符:,=,!=;逻辑运算符:AND,OR,NOT;范围运算符:NOT BETWEEN.AND;集合运算符:NOT IN;空值运算符:IS NOT null;字符匹配运算符:NOT LIKE;存在量词运算符:NOT EXISTS。在中可以包含子查询,但不可以直接使用聚合函数,若要使用聚合函数,必须引出一个子查询,如例3.52所示。,目 录,嵌套子查询,SQL概述,简单查询,连接查询,聚合查询,集合运算,SQL查询一般格式,SQL数据定义语言,SQL数据更新语言,视图,3.2简单查询,本章所用的数据库为学生成绩管理数据库ScoreDB,其数据库模式如图3-2、3-3、3-4、3-5所示,3.2简单查询,3.2简单查询,3.2简单查询,3.2简单查询,3.2.1 投影运算3.2.2 选择运算 3.2.3 排序运算3.2.4 查询表,3.2.1 投影运算 P76,SQL基本结构包括3个子句:SELECT子句对应投影运算,指定查询结果中所需要的属性或表达式FROM子句 对应笛卡尔积,给出查询所涉及的表,表可以是基本表、视图或查询表WHERE子句 对应选择运算,指定查询结果元组所需要满足的选择条件SELECT和FROM是必须的,其他是可选的,3.2.1 投影运算,基本语法为:SELECT A1,A2,.,An FROM R1,R2,.,Rm WHERE PA1,A2,.,An代表需要查找的属性或表达式R1,R2,.,Rm代表查询所涉及的表P代表谓词(即选择条件),如果省略WHERE子句,表示P为真SQL的查询结果中允许包含重复元组SQL执行过程:首先对R1,R2,.,Rm执行笛卡尔积然后在笛卡尔积中选择使得谓词P为真的记录再在A1,A2,.,An属性列中进行投影运算,不消除重复元组如需消除重复元组,必须使用关键字DISTINCT,刚才描述的SQL查询执行过程只是逻辑上的,在具体执行时会进行优化处理,查询优化的内容详见第7章。,最简单的查询,查看全校班级的所有信息SELECT*FROM Class*表示所有属性,按照表定义时的顺序显示所有属性,3.2.1 投影运算,查询指定列选取表中的全部列或指定列,通过SELECT确定要查询的属性例3.1 查询所有班级的班级编号、班级名称和所属学院 SELECT classNo,className,institute FROM Class该查询的执行过程是:从Class表中依次取出每个元组对每个元组仅选取classNo、className和institute三个属性的值,形成一个新元组最后将这些新元组组织为一个结果关系输出该查询的结果如图3-10所示,练习,查询学生的学号、姓名、所属班级查询显示所有学生的学号,姓名,年龄,3.2.1 投影运算,消除重复元组需要消除重复元组,使用DISTINCT关键字例3.2 查询所有学院的名称。SELECT institute FROM Class上述查询不消除重复元组,其查询结果如图3-11所示消除重复元组,查询结果如图3-12所示 SELECT DISTINCT institute FROM Class,图3-11,图3-12,3.2.1 投影运算,给属性列取别名可为属性列取一个便于理解的列名,如用中文来显示列名为属性列取别名特别适合经过计算的列例3.4 查询所有班级的所属学院、班级编号和班级名称,要求用中文显示列名 SELECT institute 所属学院,classNo 班级编号,className 班级名称 FROM Class查询结果如图3-13所示。该查询可使用AS关键字取别名:SELECT institute AS 所属学院,classNo AS 班级编号,className AS 班级名称 FROM Class,3.2.1 投影运算,查询经过计算的列可使用属性、常数、函数和表达式 例3.5 查询每个班级编号、班级名称以及该班级现在为几年级,并将班级编号中大写字母改为小写字母输出 SELECT LCase(classNo)AS 班级编号,className,year(date()-grade AS 年级 FROM Class函数lcase()将大写字母改为小写字母函数date()获取当前系统的日期函数year()提取日期中的年份查询结果如图3-14所示,3.2.2 选择运算(关注WHERE子句),WHERE子句可实现关系代数中的选择运算WHERE常用的查询条件有:比较运算:、=、(或!=)范围查询:BETWEEN.AND集合查询:IN空值查询:IS null字符匹配查询:LIKE逻辑查询:AND、OR、NOT,3.2.2 选择运算,比较运算使用比较运算符、=、(或!=)例3.6 查询2007级的班级编号、班级名称和所属学院。SELECT classNo,className,institute FROM Class WHERE grade=2007其查询结果如图3-15所示,3.2.2 选择运算,该查询的执行过程可能有多种方法:全表扫描法依次取出Class表中的每个元组判断该元组的grade属性值是否等于2007若是则将该元组的班级编号、班级名称和所属学院属性取出,形成一个新元组最后将所有新元组组织为一个结果关系输出该方法适用于小表,或者该表未在grade属性列上建索引索引搜索法如果该表在grade属性列上建有索引,且满足条件的记录不多,则可使用索引搜索法来检索数据具体使用何种方法由数据库管理系统的查询优化器来选择,详见第8章内容,3.2.2 选择运算,例3.7 在学生Student表中查询年龄大于或等于19岁的同学学号、姓名和出生日期。SELECT studentNo,studentName,birthday FROM Student WHERE year(getdate()-year(birthday)=19,3.2.2 选择运算,范围查询BETWEEN.AND用于查询属性值在某一个范围内的元组NOT BETWEEN.AND用于查询属性值不在某一个范围内的元组BETWEEN后是属性的下限值,AND后是属性的上限值例3.8 在选课Score表中查询成绩在8090分之间的同学学号、课程号和相应成绩 SELECT studentNo,courseNo,score FROM Score WHERE score BETWEEN 80 AND 90该查询也可以使用逻辑运算AND实现,见例3.22,3.2.2 选择运算,例3.9 在选课Score表中查询成绩不在8090分之间的同学学号、课程号和相应成绩。SELECT studentNo,courseNo,score FROM Score WHERE score NOT BETWEEN 80 AND 90该查询也可以使用逻辑运算OR实现,见例3.23,3.2.2 选择运算,集合查询IN用于查询属性值在某个集合内的元组NOT IN用于查询属性值不在某个集合内的元组 IN后面是集合,可以是具体的集合,也可以是查询出来的元组集合(该部分内容详见3.4节的内容)。例3.10 在选课Score表中查询选修了“001”、“005”或“003”课程的同学学号、课程号和相应成绩。SELECT studentNo,courseNo,score FROM Score WHERE courseNo IN(001,005,003)该查询也可以使用逻辑运算OR实现,见例3.19,3.2.2 选择运算,例3.11 在学生 Student表中查询籍贯不是“南昌”或“上海”的同学姓名、籍贯和所属班级编号。SELECT studentName,native,classNo FROM Student WHERE native NOT IN(南昌,上海)该查询也可以使用逻辑运算AND实现,见例3.21,3.2.2 选择运算,空值查询空值表示未知或不确定的值,空值表示为nullIS null用于查询属性值为空值IS NOT null用于查询属性值不为空值IS不能用“=”替代例3.12 在课程Course表中查询先修课程为空值的课程信息。SELECT*FROM Course WHERE priorCourse IS NULL查询结果如图3-16所示,3.2.2 选择运算,例3.13 在课程Course表中查询有先修课程的课程信息。SELECT*FROM Course WHERE priorCourse IS NOT NULL,3.2.2 选择运算,字符匹配查询LIKE用于字符匹配查询,语法格式为:NOT LIKE ESCAPE 查询的含义是:如果在LIKE前没有NOT,则查询指定的属性列值与相匹配的元组;如果在LIKE前有NOT,则查询指定的属性列值不与相匹配的元组。可以是一个具体的字符串,也可以包括通配符%和_%表示任意长度的字符串Ab%,表示所有以ab开头的任意长度的字符串;Zhang%ab,表示以zhang开头,以ab结束,中间可以是任意个字符的字符串。符号_表示任意一个字符Ab_,表示所有以 ab开头的3个字符的字符串,其中第3个字符为任意字符;A_ _b表示所有以a开头,以b 结束的4个字符的字符串,且第2、3个字符为任意字符。,3.2.2 选择运算,例3.14 在班级Class表中查询班级名称中含有会计的班级信息 SELECT*FROM Class WHERE className LIKE%会计%注意:匹配字符串必须用一对引号括起来,3.2.2 选择运算,例3.15 在学生Student表中查询所有姓王且全名为3个汉字的同学学号和姓名 SELECT studentNo,studentName FROM Student WHERE studentName LIKE 王_ _例3.16 在学生Student表中查询名字中不含有“福”的同学学号和姓名。SELECT studentNo,studentName FROM Student WHERE studentName NOT LIKE%福%,3.2.2 选择运算,例3.17 在学生Student表中查询蒙古族的同学学号和姓名 SELECT studentNo,studentName FROM Student WHERE nation LIKE 蒙古族注意:如果匹配字符串中不含有%和_,则LIKE与比较运算符“=”的查询结果一样该查询等价于下面的查询:SELECT studentNo,studentName FROM Student WHERE nation=蒙古族,3.2.2 选择运算,如果查询字串中本身要包含%和_,必须使用“ESCAPE”短语,对通配符进行转义处理。例3.18 在班级Class表中查询班级名称中含有“08_”符号的班级名称 SELECT className FROM Class WHERE className LIKE%08_%ESCAPE“ESCAPE”表示为换码字符紧跟在符号后的_不是通配符,而是普通的用户要查询的符号查询结果如图3-17所示,3.2.2 选择运算,如果将#字符作为换码字符,则该查询可改写为:SELECT className FROM Class WHERE className LIKE%08#_%ESCAPE#,3.2.2 选择运算,逻辑查询SQL提供AND、OR和NOT逻辑运算符分别实现逻辑与、逻辑或和逻辑非运算例3.19 在选课Score表中查询选修了“001”、“005”或“003”课程的同学学号、课程号和相应成绩SELECT studentNo,courseNo,scoreFROM ScoreWHERE courseNo=001 OR courseNo=005 OR courseNo=003在例3.10中使用的是集合运算,本例中采用逻辑“或”运算,3.2.2 选择运算,例3.20 在Student表中查询1991年出生且籍贯为“汉族”的同学学号、姓名、出生日期。SELECT studentNo,studentName,birthday FROM Student WHERE year(birthday)=1991 AND nation=汉族注意:在逻辑运算中,不可以对同一个属性进行逻辑“与”的等值运算如在选课Score表中查询同时选修了“001”和“002”课程的同学的选课信息,如下查询是错误的,得不到结果:SELECT*FROM Score WHERE courseNo=001 AND courseNo=002要实现该查询,需要使用连接运算或嵌套子查询通过连接运算表示该查询,参见例3.29、例3.31通过嵌套子查询,参见例3.39、例3.40,3.2.2 选择运算,例3.21 在Student表中查询籍贯不是“南昌”或“上海”的同学姓名、籍贯和所属班级编号。SELECT studentName,native,classNo FROM Student WHERE native!=南昌 AND native!=上海例3.22 在选课Score表中查询成绩在8090分之间的同学学号、课程号和相应成绩。SELECT studentNo,courseNo,score FROM Score WHERE score=80 AND score=90,3.2.2 选择运算,例3.23 在选课Score表中查询成绩不在8090分之间的同学学号、课程号和相应成绩。SELECT studentNo,courseNo,score FROM Score WHERE score90,3.2.3 排序运算,使用ORDER BY 子句实现排序运算,其语法为:ORDER BY ASC|DESC,ASC|DESC,.其中:,.可以是属性、函数或表达式缺省按升序(ASC)排序按降序排序,必须指明DESC选项该运算含义是:在查询结果中首先按的值进行排序在值相等的情况下再按值排序依此类推,3.2.3 排序运算,例3.24 在学生 Student表中查询籍贯不是“南昌”或“上海”的同学姓名、籍贯和所属班级编号,并按籍贯的降序排序输出。SELECT studentName,native,classNo FROM Student WHERE native!=南昌 AND native!=上海 ORDER BY native DESC查询结果如图3-18所示,3.2.3 排序运算,例3.25 在学生Student表中查询“女”学生的学号、姓名、所属班级编号和出生日期,并按班级编号的升序、出生日期的月份降序排序输出。SELECT studentNo,studentName,classNo,birthday FROM Student WHERE sex=女 ORDER BY classNo,month(birthday)DESC其中:month()函数表示提取日期表达式的月份查询结果如图3-19所示,3.2.4 查询表,FROM子句后面可以是基本关系、视图,还可以是查询表例3.26 查询1991年出生的“女”同学基本信息。分析:可以先将学生表中的女生记录查询出来,然后再对查询表进行选择、投影操作。SELECT studentNo,studentName,birthday FROM(SELECT*FROM Student WHERE sex=女)AS a WHERE year(birthday)=1991在FROM子句后是一个子查询,表示对子查询的查询结果查询表进行查询必须为查询表取一个名称(称为元组变量),如使用AS a取名为a FROM(SELECT*FROM Student WHERE sex=女)a该查询等价于下面的查询:SELECT studentNo,studentName,birthday FROM student WHERE year(birthday)=1991 AND sex=女,目 录,嵌套子查询,SQL概述,简单查询,连接查询,聚合查询,集合运算,SQL查询一般格式,SQL数据定义语言,SQL数据更新语言,视图,3.3连接查询,在实际应用中,往往会涉及到多个关系的查询,需用到连接运算或子查询连接运算是关系数据库中使用最广泛的一种运算,包括等值连接、自然连接、非等值连接、自表连接和外连接等3.3.1 等值与非等值连接3.3.2 自表连接3.3.3 外连接,3.3.1 等值与非等值连接,该运算在WHERE子句中加入连接多个关系的连接条件格式为:WHERE.比较运算符包括:、=、(或!=)当比较运算符为=时,表示等值连接其他运算为非等值连接WHERE子句的连接谓词中的属性称为连接属性连接属性之间必须具有可比性,3.3.1 等值与非等值连接,等值连接例3.27 查找会计学院全体同学的学号、姓名、籍贯、班级编号和所在班级名称。该查询的结果为学号、姓名、籍贯、班级编号和班级名称,在SELECT子句中必须包含这些属性由于班级名称和所属学院在班级表Class中,学号、姓名、籍贯、班级编号在学生表Student中,FROM子句必须包含Class表和Student表由于班级编号classNo既是班级表的主码,也是学生表的外码,这2个表的连接条件是claaaNo相等,在WHERE子句中必须包含连接条件Student.classNo=Class.classNo本查询要查询出会计学院的学生记录,在WHERE子句中还必须包括选择条件institute=会计学院,3.3.1 等值与非等值连接,本查询语句为:SELECT studentNo,studentName,native,Student.classNo,classNameFROM Student,ClassWHERE Student.classNo=Class.classNo AND institute=会计学院在连接操作中,如果涉及到多个表的相同属性名,必须在相同的属性名前加上表名加以区分如Student.classNo、Class.classNoWHERE子句中包含两种条件Student.classNo=Class.classNo为连接条件institute=会计学院 为选择条件,3.3.1 等值与非等值连接,构造等值连接查询语句的步骤确定select子句确定from子句中的表确定连接条件(主码与外码的等值连接)确定选择条件,3.3.1 等值与非等值连接,练习 2.8(3)studentNo,studentName,sex,nation(nation!=“汉族”institute=“信息学院”(classstudent))(4)courseNo,courseName,courseHour(term=“08092”(coursescore))(5)(6)(7)studentNo,studentName(Student(score priorCourse=“CS012”course))查找同时选修了编号为“001”和“002”课程的同学学号、姓名、课程号和相应成绩,并按学号排序输出,3.3.1 等值与非等值连接,例3.28 查找选修了课程名称为“计算机原理”的同学学号、姓名。查询结果为学号、姓名,在SELECT子句中必须包含这些属性学号和姓名在学生表中,课程名称在课程表中,FROM子句必须包含学生表Student、课程表Course学生表与课程表之间是多对多联系,需通过成绩表转换为两个多对一的联系,FROM子句必须包含成绩表Score课程号既是课程表的主码,也是成绩表的外码,这2个表的连接条件是课程号相等;学号既是学生表的主码,也是成绩表的外码,这2个表的连接条件是学号相等。在WHERE子句中涉及三个关系的连接,其连接条件为:Course.courseNo=Score.courseNo AND Score.studentNo=Student.studentNo查找选修“计算机原理”课程的同学,在WHERE子句中必须包括选择条件courseName=计算机原理,3.3.1 等值与非等值连接,本查询语句为:SELECT a.studentNo,studentName FROM Student a,Course b,Score c WHERE b.courseNo=c.courseNo AND c.studentNo=a.studentNo AND b.courseName=计算机原理本例使用了元组变量,其连接条件为:b.courseNo=c.courseNo AND c.studentNo=a.studentNo,3.3.1 等值与非等值连接,自然连接SQL不直接支持自然连接,完成自然连接的方法是在等值连接的基础上消除重复列例3.30 实现成绩表Score和课程表Course的自然连接。SELECT studentNo,a.courseNo,score,courseName,creditHour,courseHour,priorCourseFROM Score a,Course bWHERE a.courseNo=b.courseNo本例课程编号在两个关系中同时出现,但在SELECT子句中仅需出现1次,因此使用a.courseNo,也可以使用b.courseNo。其他列名是唯一的,不需要加上元组变量,3.3.2 自表连接,若某个表与自己进行连接,称为自表连接 例3.31 查找同时选修了编号为“001”和“002”课程的同学学号、姓名、课程号和相应成绩,并按学号排序输出。学生姓名在学生表中,FROM子句必须包含学生表(取别名为a)可以考虑两个成绩表,分别记为b和cb表用于查询选修了编号为“001”课程的同学c表用于查询选修了编号为“002”课程的同学FROM子句还必须包含两个成绩表b和c,且在WHERE子句中包含两个选择条件:b.courseNo=001 AND c.courseNo=002,3.3.2 自表连接,一方面,成绩表b与成绩表c在学号上做等值连接(自表连接),如果连接成功,表示学生同时选修了编号为“001”和“002”的课程另一方面,学生表与成绩表b(或成绩表c)在学号上做等值连接。WHERE子句包含两个连接条件:b.studentNo=c.studentNo AND a.studentNo=b.studentNo本查询语句为:SELECT a.studentNo,studentName,b.courseNo,b.score,c.courseNo,c.scoreFROM Student a,Score b,Score cWHERE b.courseNo=001 AND c.courseNo=002 AND a.studentNo=b.studentNo AND b.studentNo=c.studentNoORDER BY a.studentNo本查询结果与例3.29相同在该查询中,FROM子句后面包含了两个参与自表连接的成绩表Score,必须定义元组变量加以区分自表连接的条件是b.studentNo=c.studentNo,3.3.2 自表连接,例3.32 在学生表Student中查找与“李宏冰”同学在同一个班的同学姓名、班级编号和出生日期。SELECT a.studentName,a.classNo,a.birthday FROM Student a,Student b WHERE b.studentName=李宏冰 AND a.classNo=b.classNo,3.3.2 练习,练习:实验(10)(13)习题3.9查询没有借书的读者姓名实验(21)查找每个人的销售记录,要求显示销售员的编号、姓名、性别、商品名称、数量、单击、金额、和销售日期(如何通过查询结果看到没有销售记录的销售员?),3.3.3 外连接,左外连接Select From a LEFT OUTER JOIN b ON a.属性=b.属性(连接条件),目 录,嵌套子查询,SQL概述,简单查询,连接查询,聚合查询,集合运算,SQL查询一般格式,SQL数据定义语言,SQL数据更新语言,视图,3.4嵌套子查询,在SQL查询中,一个SELECT-FROM-WHERE查询语句称为一个查询块将一个查询块嵌入到另一个查询块的WHERE子句或HAVING子句(见3.5节)中,称为嵌套子查询子查询的结果是集合,因此使用子查询是集合成员的检查如判断元组是否属于某个集合,集合的比较运算,以及测试是否为空集等具体表现在如下几个方面:元素与集合间的属于关系集合之间的包含和相等关系集合的存在关系元素与集合元素之间的比较关系,3.4嵌套子查询,SQL允许多层嵌套子查询,但在子查询中,不允许使用ORDER BY子句,该子句仅用于最后的输出结果排序嵌套查询分为相关子查询和非相关子查询非相关子查询指子查询的结果不依赖于上层查询相关子查询指当上层查询的元组发生变化时,其子查询必须重新执行3.4.1 使用IN的子查询3.4.2 使用比较运算符的子查询3.4.3 使用存在量词EXISTS的子查询,3.4.1 使用IN的子查询,例3.37 查询选修过课程的学生姓名。本例查询的含义是:在学生表Student中,将学号出现在成绩表Score中(表明该学生选修过课程)的学生姓名查询出来 SELECT studentName FROM Student WHERE Student.studentNo IN(SELECT Score.studentNo FROM Score)在本例中,WHERE子句用于检测元素与集合间的属于关系其中Student.studentNo为元素,IN为“属于”嵌套语句“SELECT Score.studentNo FROM Score”的查询结果为选修过课程的所有学生的学号集合该嵌套SELECT语句称为子查询,3.4.1 使用IN的子查询,该查询属于非相关子查询,其查询过程为:(1)从Score表中查询出学生的学号studentNo,构成一个中间结果关系r;(2)从Student表中取出第一个元组t;(3)如果元组t的studentNo属性的值包含在中间结果关系r中(即t.studentNor),则将元组t的studentName属性的值作为最终查询结果关系的一个元组;否则丢弃元组t;(4)如果Student表中还有元组,则取Student表的下一个元组t,并转第(3)步;否则转第(5)步;(5)将最终结果关系显示出来,3.4.1 使用IN的子查询,该查询的执行过程可以通过图3-23来表示,3.4.1 使用IN的子查询,例3.38 查找选修过课程名中包含“系统”的课程的同学学号、姓名和班级编号。SELECT studentNo,studentName,classNoFROM StudentWHERE studentNo IN(SELECT studentNo FROM Score WHERE courseNo IN(SELECT courseNo FROM Course WHERE courseName LIKE%系统%)WHERE子句中的IN可以实现多重嵌套,本例是一个三重嵌套的例子,该查询的执行过程可以通过图3-24来表示,3.4.1 使用IN的子查询,3.4.1 使用IN的子查询,该查询也属于非相关子查询使用IN的非相关子查询的查询过程归纳如下:首先执行最底层的子查询块,将该子查询块的结果作为中间关系;执行上一层(即外一层)查询块,对于得到的每个元组,判断该元组是否在它的子查询结果中间关系中:如果在,取出该元组中的相关属性作为最终输出结果(或该查询块的查询结果中间关系)的一个元组否则舍弃该元组如果已经执行完最上层查询块,则将最终结果作为一个新关系输出;否则返回第(2)步重复执行,3.4.1 使用IN的子查询,例3.39 查找同时选修过“计算机原理”和“高等数学”两门课程的同学学号、姓名以及该同学所选修的所有课程的课程名和相应成绩,按学号(升序)、成绩(降序)排序输出。分析:需查询同时选修过“计算机原理”和“高等数学”两门课程的同学学号、姓名以及该同学所选修的所有课程的课程名和相应成绩,在SELECT子句中必须包含studentNo、studentName、courseName和score四个属性学号、姓名在学生表中,课程成绩在成绩表中,课程名在课程表中,在FROM子句中必须包含学生表、课程表和成绩表,分别为这三张表取元组变量a、b、c学生表、成绩表和课程表需做连接操作,在WHERE子句中必须包含连接条件:a.studentNo=c.studentNo AND b.courseNo=c.courseNo,3.4.1 使用IN的子查询,要查询同时选修过“计算机原理”和“高等数学”两门课程的同学,在WHERE子句中必须包含如下的选择条件:对于学生表,其学号必须是选修过“计算机原理”课程的学号,使用子查询:a.studentNo IN(SELECT studentNo FROM Score WHERE courseNo IN(SELECT courseNo FROM Course WHERE courseName=计算机原理)对于学生表,其学号还必须是选修过“高等数学”课程的学号,使用子查询:a.studentNo IN(SELECT studentNo FROM Score WHERE courseNo IN(SELECT courseNo FROM Course WHERE courseName=高等数学)这两个子查询必须同时满足,使用AND逻辑运算符,3.4.1 使用IN的子查询,本查询语句为:SELECT a.studentNo,studentName,courseName,scoreFROM Student a,Course b,Score cWHERE a.studentNo=c.studentNo AND b.courseNo=c.courseNo AND a.studentNo IN(SELECT studentNo FROM Score WHERE courseNo IN(SELECT courseNo FROM Course WHERE courseName=计算机原理)AND a.studentNo IN(SELECT studentNo FROM Score WHERE courseNo IN(SELECT courseNo FROM Course WHERE courseName=高等数学)ORDER BY a.studentNo,score DESC,3.4.1 使用IN的子查询,该查询也可以表示为如下形式:SELECT a.studentNo,studentName,courseName,scoreFROM Student a

    注意事项

    本文(数据库系统原理与设计.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开