CH3SQL语言知识学习1.ppt

上传人:小** 文档编号:3690723 上传时间:2020-10-16 格式:PPT 页数:105 大小:1.15MB
返回 下载 相关 举报
CH3SQL语言知识学习1.ppt_第1页
第1页 / 共105页
CH3SQL语言知识学习1.ppt_第2页
第2页 / 共105页
点击查看更多>>
资源描述

《CH3SQL语言知识学习1.ppt》由会员分享,可在线阅读,更多相关《CH3SQL语言知识学习1.ppt(105页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1,第3章 SQL语言,数据库系统原理与设计,江西财经大学信息管理学院,2010年8月,2,第3章 SQL语言,学习目标 SQL(Structured Query Language,结构化查询语言)是关系数据库的标准语言 几乎所有的关系型数据库管理系统均采用SQL语言标准 教学目标 掌握对数据库的基本操作,了解数据库管理系统的基本功能 熟练掌握SQL查询语句,并运用SQL语句完成对数据库的操作,3,第3章 SQL语言,学习方法 结合课堂讲授的知识,强化上机实训,把课堂上学过的有关概念进行实训,以便加深理解,达到学习目标。 学习指南 重点:3.2、3.3、3.4、3.5、3.8和3.9节 难点:

2、3.3、3.4和3.5节,4,第3章 SQL语言,本章导读 SQL查询语句对关系代数运算做了哪些扩展? 连接查询包括哪些?它们分别用于什么地方? 相关子查询与非相关子查询的概念。 在使用分组聚合查询时需要注意的地方。 如何理解存在量词以及存在量词在SQL查询中的重要地位。 如何理解查询表的概念,查询表与子查询有何异同点? 在SQL的DDL语句中如何实现完整性约束?实现完整性约束的方法有哪些? 如何将数据库的对象(如基本表、索引)建立在特定的物理文件上? 将数据库对象建立在特定的物理文件上,其目的是什么? 建立视图的目的是什么?视图主要用于什么操作?,5,目 录,嵌套子查询,SQL概述,简单查询

3、,连接查询,聚合查询,集合运算,SQL查询一般格式,SQL数据定义语言,SQL数据更新语言,视图,6,3.1 SQL概述,SQL语言于1974年由Boyce等提出,并于19751979年在IBM公司研制的System R数据库管理系统上实现,现已成为国际标准。 很多数据库厂商都对SQL语句进行了再开发和扩展 标准SQL命令包括 查询SELECT 插入INSERT 更新UPDATE 删除DELETE 创建CREATE 对象删除DROP 可被用来完成几乎所有的数据库操作,7,3.1 SQL概述,3.1.1 SQL发展 3.1.2 SQL特点 3.1.3 SQL查询基本概念,8,3.1.1 SQL发

4、展,SQL-86:第一个SQL标准,由美国国家标准局(American National Standard Institute,简称ANSI)公布,1987年国际标准化组织(International Organization for Standardization,简称ISO)通过。该标准也称为SQL-1 SQL-92:在1992年,由ISO和ANSI对SQL-86进行重新修订,该标准也称为SQL-2 SQL-99:在1999年,该版本在SQL-2的基础上,扩展了诸多功能,包括递归、触发、面向对象技术等。该标准也称为SQL-3 SQL-2003:该标准是最新的标准,也称SQL-4,于2003

5、年发布,9,3.1.1 SQL发展,SQL语言由4部分组成 数据定义语言DDL(Data Definition Language) 定义数据库的逻辑结构,包括数据库、基本表、视图和索引等,扩展DDL还支持存储过程、函数、对象、触发器等的定义 DDL包括3类语言,即定义、修改和删除 数据操纵语言DML(Data Manipuplation Language) 对数据库的数据进行检索和更新,其中更新操作包括插入、删除和修改数据 数据控制语言DCL(Data Control Language) 对数据库的对象进行授权、用户维护(包括创建、修改和删除)、完整性规则定义和事务定义等 其它 主要是嵌入式S

6、QL语言和动态SQL语言的定义,规定了SQL语言在宿主语言中使用的规则 扩展SQL还包括数据库数据的重新组织、备份与恢复等功能,10,3.1.2 SQL特点,综合统一 集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL的功能于一体 高度非过程化 面向集合的操作方式 采用集合操作方式,其操作对象、查找结果都是元组的集合 同一种语法结构提供两种使用方式 SQL语言既是自含式语言,又是嵌入式语言。在两种不同的使用方式下,其语法结构基本上是一致的 语言简洁,易学易用 SQL语言的动词非常少,主要包括: 数据查询 SELECT; 数据定义 CREATE、DROP、ALTER; 数据操纵 INS

7、ERT、UPDATE、DELETE; 数据控制 GRANT、REVOKE,11,3.1.3 SQL查询基本概念,SQL语言支持三级模式结构,外模式对应视图和部分基本表,模式对应基本表,内模式对应存储文件,12,3.1.3 SQL查询基本概念,基本表 数据库中独立存在的表称为基本表 在SQL中一个关系对应一个基本表 一个(或多个)基本表对应一个存储文件 一个表可以带若干索引 索引存放在存储文件中 视图 指从一个或几个基本表(或视图)导出的表,是虚表 只存放视图的定义而不存放对应数据 查询表 指查询结果对应的表 存储文件 指数据库中存放关系的物理文件,13,目 录,嵌套子查询,SQL概述,简单查询

8、,连接查询,聚合查询,集合运算,SQL查询一般格式,SQL数据定义语言,SQL数据更新语言,视图,14,3.2简单查询,本章所用的数据库为学生成绩管理数据库ScoreDB,其数据库模式如图3-2、3-3、3-4、3-5所示,15,3.2简单查询,16,3.2简单查询,17,3.2简单查询,18,3.2简单查询,3.2.1 投影运算 3.2.2 选择运算 3.2.3 排序运算 3.2.4 查询表,19,3.2.1 投影运算,SQL基本结构包括3个子句: SELECT子句 对应投影运算,指定查询结果中所需要的属性或表达式 FROM子句 对应笛卡尔积,给出查询所涉及的表,表可以是基本表、视图或查询表

9、 WHERE子句 对应选择运算,指定查询结果元组所需要满足的选择条件 SELECT和FROM是必须的,其他是可选的,20,3.2.1 投影运算,基本语法为: SELECT A1, A2, ., An FROM R1, R2, ., Rm WHERE P A1, A2, ., An代表需要查找的属性或表达式 R1, R2, ., Rm代表查询所涉及的表 P代表谓词(即选择条件),如果省略WHERE子句,表示P为真 SQL的查询结果中允许包含重复元组 SQL执行过程: 首先对R1, R2, ., Rm执行笛卡尔积 然后在笛卡尔积中选择使得谓词P为真的记录 再在A1, A2, ., An属性列中进行

10、投影运算,不消除重复元组 如需消除重复元组,必须使用关键字DISTINCT,刚才描述的SQL查询执行过程只是逻辑上的,在具体执行时会进行优化处理,查询优化的内容详见第7章。,21,3.2.1 投影运算,查询指定列 选取表中的全部列或指定列,通过SELECT确定要查询的属性 例3.1 查询所有班级的班级编号、班级名称和所属学院 SELECT classNo, className, institute FROM Class 该查询的执行过程是: 从Class表中依次取出每个元组 对每个元组仅选取classNo、className和institute三个属性的值,形成一个新元组 最后将这些新元组组织

11、为一个结果关系输出 该查询的结果如图3-10所示,22,3.2.1 投影运算,消除重复元组 需要消除重复元组,使用DISTINCT关键字 例3.2 查询所有学院的名称。 SELECT institute FROM Class 上述查询不消除重复元组,其查询结果如图3-11所示 消除重复元组,查询结果如图3-12所示 SELECT DISTINCT institute FROM Class,图3-11,图3-12,23,3.2.1 投影运算,查询所有列 可使用两种方法: 将所有的列在SELECT子句中列出(可以改变列的显示顺序); 使用*符号,*表示所有属性,按照表定义时的顺序显示所有属性 例3

12、.3 查询所有班级的全部信息。 SELECT classNo, className, classNum, grade, institute FROM Class 或 SELECT * FROM Class,24,3.2.1 投影运算,给属性列取别名 可为属性列取一个便于理解的列名,如用中文来显示列名 为属性列取别名特别适合经过计算的列 例3.4 查询所有班级的所属学院、班级编号和班级名称,要求用中文显示列名 SELECT institute 所属学院, classNo 班级编号, className 班级名称 FROM Class 查询结果如图3-13所示。该查询可使用AS关键字取别名: SE

13、LECT institute AS 所属学院, classNo AS 班级编号, className AS 班级名称 FROM Class,25,3.2.1 投影运算,查询经过计算的列 可使用属性、常数、函数和表达式 例3.5 查询每个班级编号、班级名称以及该班级现在为几年级,并将班级编号中大写字母改为小写字母输出 SELECT lower(classNo) 班级编号, className, year(getdate() - grade AS 年级 FROM Class 函数lower()将大写字母改为小写字母 函数getdate()获取当前系统的日期 函数year()提取日期中的年份 查询结

14、果如图3-14所示,26,3.2.2 选择运算,WHERE子句可实现关系代数中的选择运算 WHERE常用的查询条件有: 比较运算:、=、(或!=) 范围查询:BETWEEN.AND 集合查询:IN 空值查询:IS null 字符匹配查询:LIKE 逻辑查询:AND、OR、NOT,27,3.2.2 选择运算,比较运算 使用比较运算符、=、(或!=) 例3.6 查询2007级的班级编号、班级名称和所属学院。 SELECT classNo, className, institute FROM Class WHERE grade=2007 其查询结果如图3-15所示,28,3.2.2 选择运算,该查询

15、的执行过程可能有多种方法: 全表扫描法 依次取出Class表中的每个元组 判断该元组的grade属性值是否等于2007 若是则将该元组的班级编号、班级名称和所属学院属性取出,形成一个新元组 最后将所有新元组组织为一个结果关系输出 该方法适用于小表,或者该表未在grade属性列上建索引 索引搜索法 如果该表在grade属性列上建有索引,且满足条件的记录不多,则可使用索引搜索法来检索数据 具体使用何种方法由数据库管理系统的查询优化器来选择,详见第8章内容,29,3.2.2 选择运算,例3.7 在学生Student表中查询年龄大于或等于19岁的同学学号、姓名和出生日期。 SELECT student

16、No, studentName, birthday FROM Student WHERE year(getdate() - year(birthday)=19,30,3.2.2 选择运算,范围查询 BETWEEN.AND用于查询属性值在某一个范围内的元组 NOT BETWEEN.AND用于查询属性值不在某一个范围内的元组 BETWEEN后是属性的下限值,AND后是属性的上限值 例3.8 在选课Score表中查询成绩在8090分之间的同学学号、课程号和相应成绩 SELECT studentNo, courseNo, score FROM Score WHERE score BETWEEN 80

17、AND 90 该查询也可以使用逻辑运算AND实现,见例3.22,31,3.2.2 选择运算,例3.9 在选课Score表中查询成绩不在8090分之间的同学学号、课程号和相应成绩。 SELECT studentNo, courseNo, score FROM Score WHERE score NOT BETWEEN 80 AND 90 该查询也可以使用逻辑运算OR实现,见例3.23,32,3.2.2 选择运算,集合查询 IN用于查询属性值在某个集合内的元组 NOT IN用于查询属性值不在某个集合内的元组 IN后面是集合,可以是具体的集合,也可以是查询出来的元组集合(该部分内容详见3.4节的内容

18、)。 例3.10 在选课Score表中查询选修了“001”、“005”或“003”课程的同学学号、课程号和相应成绩。 SELECT studentNo, courseNo, score FROM Score WHERE courseNo IN (001, 005, 003) 该查询也可以使用逻辑运算OR实现,见例3.19,33,3.2.2 选择运算,例3.11 在学生 Student表中查询籍贯不是“南昌”或“上海”的同学姓名、籍贯和所属班级编号。 SELECT studentName, native, classNo FROM Student WHERE native NOT IN (南昌,

19、 上海) 该查询也可以使用逻辑运算AND实现,见例3.21,34,3.2.2 选择运算,空值查询 空值表示未知或不确定的值,空值表示为null IS null用于查询属性值为空值 IS NOT null用于查询属性值不为空值 IS不能用“=”替代 例3.12 在课程Course表中查询先修课程为空值的课程信息。 SELECT * FROM Course WHERE priorCourse IS NULL 查询结果如图3-16所示,35,3.2.2 选择运算,例3.13 在课程Course表中查询有先修课程的课程信息。 SELECT * FROM Course WHERE priorCourse

20、 IS NOT NULL,36,3.2.2 选择运算,字符匹配查询 LIKE用于字符匹配查询,语法格式为: NOT LIKE ESCAPE 查询的含义是: 如果在LIKE前没有NOT,则查询指定的属性列值与相匹配的元组; 如果在LIKE前有NOT,则查询指定的属性列值不与相匹配的元组。 可以是一个具体的字符串,也可以包括通配符%和_ %表示任意长度的字符串 ab%,表示所有以ab开头的任意长度的字符串; zhang%ab,表示以zhang开头,以ab结束,中间可以是任意个字符的字符串。 符号_(下划线)表示任意一个字符 ab:所有以 ab开头的3个字符的字符串,其中第3个字符为任意字符; a_

21、b:所有以a开头,以b 结束的4个字符的字符串,且第2、3个字符为任意字符。,37,3.2.2 选择运算,例3.14 在班级Class表中查询班级名称中含有会计的班级信息 SELECT * FROM Class WHERE className LIKE %会计% 注意:匹配字符串必须用一对引号括起来 例3.15 在学生Student表中查询所有姓王且全名为3个汉字的同学学号和姓名 SELECT studentNo, studentName FROM Student WHERE studentName LIKE 王_ 注意:在中文SQL-Server中,如果匹配字符串为汉字,则一个下划线代表一个

22、汉字;如果是西文,则一个下划线代表一个字符。,38,3.2.2 选择运算,例3.16 在学生Student表中查询名字中不含有“福”的同学学号和姓名。 SELECT studentNo, studentName FROM Student WHERE studentName NOT LIKE %福%,39,3.2.2 选择运算,例3.17 在学生Student表中查询蒙古族的同学学号和姓名 SELECT studentNo, studentName FROM Student WHERE nation LIKE 蒙古族 注意:如果匹配字符串中不含有%和_,则LIKE与比较运算符“=”的查询结果一样

23、 该查询等价于下面的查询: SELECT studentNo, studentName FROM Student WHERE nation=蒙古族,40,3.2.2 选择运算,如果查询字串中本身要包含%和_,必须使用“ESCAPE ”短语,对通配符进行转义处理。 例3.18 在班级Class表中查询班级名称中含有“08_”符号的班级名称 SELECT className FROM Class WHERE className LIKE %08_% ESCAPE “ESCAPE ”表示为换码字符 紧跟在符号后的_不是通配符,而是普通的用户要查询的符号 查询结果如图3-17所示,41,3.2.2 选

24、择运算,如果将#字符作为换码字符,则该查询可改写为: SELECT className FROM Class WHERE className LIKE %08#_% ESCAPE #,42,3.2.2 选择运算,逻辑查询 SQL提供AND、OR和NOT逻辑运算符分别实现逻辑与、逻辑或和逻辑非运算 例3.19 在选课Score表中查询选修了“001”、“005”或“003”课程的同学学号、课程号和相应成绩 SELECT studentNo, courseNo, score FROM Score WHERE courseNo=001 OR courseNo=005 OR courseNo=003

25、在例3.10中使用的是集合运算,本例中采用逻辑“或”运算,43,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 co

26、urseNo=001 AND courseNo=002 要实现该查询,需要使用连接运算或嵌套子查询 通过连接运算表示该查询,参见例3.29、例3.31 通过嵌套子查询,参见例3.39、例3.40,44,3.2.2 选择运算,例3.21 在Student表中查询籍贯不是“南昌”或“上海”的同学姓名、籍贯和所属班级编号。 SELECT studentName, native, classNo FROM Student WHERE native!=南昌 AND native!=上海 例3.22 在选课Score表中查询成绩在8090分之间的同学学号、课程号和相应成绩。 SELECT studentN

27、o, courseNo, score FROM Score WHERE score= 80 AND score=90,45,3.2.2 选择运算,例3.23 在选课Score表中查询成绩不在8090分之间的同学学号、课程号和相应成绩。 SELECT studentNo, courseNo, score FROM Score WHERE score90,46,3.2.3 排序运算,使用ORDER BY 子句实现排序运算,其语法为: ORDER BY ASC | DESC , ASC | DESC, . 其中: , , .可以是属性、函数或表达式 缺省按升序(ASC)排序 按降序排序,必须指明DE

28、SC选项 该运算含义是: 在查询结果中首先按的值进行排序 在值相等的情况下再按值排序 依此类推,47,3.2.3 排序运算,例3.24 在学生 Student表中查询籍贯不是“南昌”或“上海”的同学姓名、籍贯和所属班级编号,并按籍贯的降序排序输出。 SELECT studentName, native, classNo FROM Student WHERE native!=南昌 AND native!=上海 ORDER BY native DESC 查询结果如图3-18所示,48,3.2.3 排序运算,例3.25 在学生Student表中查询“女”学生的学号、姓名、所属班级编号和出生日期,并按

29、班级编号的升序、出生日期的月份降序排序输出。 SELECT studentNo, studentName, classNo, birthday FROM Student WHERE sex=女 ORDER BY classNo, month(birthday) DESC 其中:month()函数表示提取日期表达式的月份 查询结果如图3-19所示,49,3.2.4 查询表,FROM子句后面可以是基本关系、视图,还可以是查询表 例3.26 查询1991年出生的“女”同学基本信息。 分析:可以先将学生表中的女生记录查询出来,然后再对查询表进行选择、投影操作。 SELECT studentNo, st

30、udentName, 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

31、=女,50,目 录,嵌套子查询,SQL概述,简单查询,连接查询,聚合查询,集合运算,SQL查询一般格式,SQL数据定义语言,SQL数据更新语言,视图,51,3.3连接查询,在实际应用中,往往会涉及到多个关系的查询,需用到连接运算或子查询 连接运算是关系数据库中使用最广泛的一种运算,包括等值连接、自然连接、非等值连接、自表连接和外连接等 3.3.1 等值与非等值连接 3.3.2 自表连接 3.3.3 外连接,52,3.3.1 等值与非等值连接,该运算在WHERE子句中加入连接多个关系的连接条件 格式为: WHERE . . . . . 比较运算符包括: 、=、(或!=) 当比较运算符为=时,表示

32、等值连接 其他运算为非等值连接 WHERE子句的连接谓词中的属性称为连接属性 连接属性之间必须具有可比性,53,3.3.1 等值与非等值连接,等值连接 例3.27 查找会计学院全体同学的学号、姓名、籍贯、班级编号和所在班级名称。 该查询的结果为学号、姓名、籍贯、班级编号和班级名称,在SELECT子句中必须包含这些属性 由于班级名称和所属学院在班级表Class中,学号、姓名、籍贯、班级编号在学生表Student中,FROM子句必须包含Class表和Student表 由于班级编号classNo既是班级表的主码,也是学生表的外码,这2个表的连接条件是claaaNo相等,在WHERE子句中必须包含连接

33、条件Student.classNo=Class.classNo 本查询要查询出会计学院的学生记录,在WHERE子句中还必须包括选择条件institute=会计学院,54,3.3.1 等值与非等值连接,本查询语句为: SELECT studentNo, studentName, native, Student.classNo, className FROM Student, Class WHERE Student.classNo=Class.classNo AND institute=会计学院 在连接操作中,如果涉及到多个表的相同属性名,必须在相同的属性名前加上表名加以区分 如Student.c

34、lassNo、Class.classNo WHERE子句中 Student.classNo=Class.classNo为连接条件 institute=会计学院 为选择条件,55,可为参与连接的表取别名(称为元组变量),在相同的属性名前加上表的别名。 将Student表取别名为a,Class表取别名为b,班级编号分别用a.classNo和b.classNo表示。本例可以改写为: SELECT studentNo, studentName, native, b.classNo, className FROM Student AS a, Class AS b WHERE a.classNo=b.cl

35、assNo AND institute=会计学院 或者 SELECT studentNo, studentName, native, b.classNo, className FROM Student a, Class b WHERE a.classNo=b.classNo AND institute=会计学院 对于不同的属性名,可以不在属性名前加上表名(别名)。,3.3.1 等值与非等值连接,56,3.3.1 等值与非等值连接,例3.28 查找选修了课程名称为“计算机原理”的同学学号、姓名。 查询结果为学号、姓名,在SELECT子句中必须包含这些属性 学号和姓名在学生表中,课程名称在课程表中

36、,FROM子句必须包含学生表Student、课程表Course 学生表与课程表之间是多对多联系,需通过成绩表转换为两个多对一的联系,FROM子句必须包含成绩表Score 课程号既是课程表的主码,也是成绩表的外码,这2个表的连接条件是课程号相等;学号既是学生表的主码,也是成绩表的外码,这2个表的连接条件是学号相等。在WHERE子句中涉及三个关系的连接,其连接条件为: Course.courseNo=Score.courseNo AND Score.studentNo=Student.studentNo 查找选修“计算机原理”课程的同学,在WHERE子句中必须包括选择条件courseName=计算

37、机原理,57,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,58,3.3.1 等值与非等值连接,例3.29 查找同时选修了编号为“001”和“002”课程的同学学号、姓名、课

38、程号和相应成绩,并按学号排序输出。 查询结果为学号、姓名、课程号和相应成绩,在SELECT子句中必须包含这些属性 学号和姓名在学生表中,课程号和成绩在成绩表中,FROM子句必须包含学生表Student和成绩表Score 学号既是学生表的主码,也是成绩表的外码,这2个表的连接条件是学号相等,WHERE子句必须包含这个连接条件 SELECT a.studentNo, studentName, b.courseNo, b.score FROM Student a, Score b WHERE a.studentNo=b.studentNo,59,3.3.1 等值与非等值连接,为表示同时选修“001”

39、和“002”课程的选择条件 首先在WHERE子句中直接包含选择条件courseNo=001以查找出所有选修了“001”课程的同学 其次,基于成绩表Score构造一个查询表c,查找出选修了编号为“002”课程的所有同学 (SELECT * FROM Score WHERE courseNo=002) c,SELECT a.studentNo, studentName, b.courseNo, b.score FROM Student a, Score b WHERE a.studentNo=b.studentNo AND b.courseNo=001,60,3.3.1 等值与非等值连接,为表示同

40、时选修“001”和“002”课程的选择条件,最后,将选修了编号为“001”课程的元组与查询表c的元组关于学号进行等值连接 SELECT a.studentNo, studentName, b.courseNo, b.score, c.courseNo, c.score FROM Student a, Score b, (SELECT * FROM Score WHERE courseNo=002) c WHERE b.courseNo=001 AND a.studentNo=b.studentNo AND a.studentNo=c.studentNo 如果连接成功,表示该同学同时选修了这两门

41、课程,61,3.3.1 等值与非等值连接,要求按学号排序输出,需要排序语句ORDER BY 本查询语句为: SELECT a.studentNo, studentName, b.courseNo, b.score, c.courseNo, c.score FROM Student a, Score b, (SELECT * FROM Score WHERE courseNo=002) c WHERE b.courseNo=001 AND a.studentNo=b.studentNo AND a.studentNo=c.studentNo ORDER BY a.studentNo,62,3.3

42、.1 等值与非等值连接,该查询也可以表示为: SELECT a.studentNo, studentName, b.courseNo, b.score, c.courseNo, c.score FROM Student a, (SELECT * FROM Score WHERE courseNo=001) b, (SELECT * FROM Score WHERE courseNo=002) c WHERE a.studentNo=b.studentNo AND a.studentNo=c.studentNo ORDER BY a.studentNo,63,3.3.1 等值与非等值连接,该查询

43、还可以表示为: SELECT a.studentNo, studentName, b.courseNo, b.score, c.courseNo, c.score FROM Student a, Score b, Score c WHERE a.studentNo=b.studentNo AND a.studentNo=c.studentNo AND b.courseNo=001 AND c.courseNo=002 ORDER BY a.studentNo,64,3.3.1 等值与非等值连接,自然连接 SQL不直接支持自然连接,完成自然连接的方法是在等值连接的基础上消除重复列 例3.30 实

44、现成绩表Score和课程表Course的自然连接。 SELECT studentNo, a.courseNo, score, courseName, creditHour, courseHour, priorCourse FROM Score a, Course b WHERE a.courseNo=b.courseNo 本例课程编号在两个关系中同时出现,但在SELECT子句中仅需出现1次,因此使用a.courseNo,也可以使用b.courseNo。其他列名是唯一的,不需要加上元组变量,65,3.3.1 等值与非等值连接,非等值连接 非等值连接使用的比较少。 在关系代数部分已经举过了一个非等

45、值连接的例子(P61-63,例2.16),这里就不再举例了。 在数据库ScoreDB中,查找课程号为“AC001”课程的考试中比学号为“0703045”的学生考得更好的所有学生的姓名和成绩。,66,3.3.2 自表连接,若某个表与自己进行连接,称为自表连接 例3.31 查找同时选修了编号为“001”和“002”课程的同学学号、姓名、课程号和相应成绩,并按学号排序输出。 学生姓名在学生表中,FROM子句必须包含学生表(取别名为a) 可以考虑两个成绩表,分别记为b和c b表用于查询选修了编号为“001”课程的同学 c表用于查询选修了编号为“002”课程的同学 FROM子句还必须包含两个成绩表b和c

46、,且在WHERE子句中包含两个选择条件: b.courseNo=001 AND c.courseNo=002,67,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.s

47、core FROM Student a, Score b, Score c WHERE b.courseNo=001 AND c.courseNo=002 AND a.studentNo=b.studentNo AND b.studentNo=c.studentNo ORDER BY a.studentNo 本查询结果与例3.29相同 在该查询中,FROM后包含了两个参与自表连接的成绩表Score,必须定义元组变量加以区分 自表连接的条件是b.studentNo=c.studentNo,68,3.3.2 自表连接,例3.32 在学生表Student中查找与“李宏冰”同学在同一个班的同学姓名、班

48、级编号和出生日期。 SELECT a.studentName, a.classNo, a.birthday FROM Student a, Student b WHERE b.studentName=李宏冰 AND a.classNo=b.classNo,69,3.3.3 外连接,在一般的连接中,只有满足连接条件的元组才被检索出来,对于没有满足连接条件的元组是不作为结果被检索出来的。 例3.33 查询每个班级的班级名称、所属学院、学生学号、学生姓名,按班级名称排序输出。 SELECT className, institute, studentNo, studentName FROM Class

49、 a, Student b WHERE a.classNo=b.classNo ORDER BY className,70,3.3.3 外连接,从查询结果中可以看出: 班级表中的“注册会计08_01班”、“注册会计08_03班”以及“金融管理07_01班”这3个班没有出现在查询结果中,原因是这3个班没有学生 在实际应用中,往往需要将不满足连接条件的元组也检索出来,只是在相应的位置用空值替代,这种查询称为外连接查询 外连接分为左外连接、右外连接和全外连接 在FROM子句中,写在左边的表称为左关系,写在右边的表称为右关系,71,3.3.3 外连接,左外连接 连接结果中包含左关系中的所有元组,对于左关系中没有连接上的元组,其右关系中的相应属性用空值替代 例3.34 使用左外连接查询每个班级的班级名称、所属学院、学生学号、学生姓名,按班级名称排序输出。 SELECT className, institute, studentNo, studentName FROM Class a LEFT OUTER JOIN

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁