教学课件:第4章-1-关系数据库标准语言SQL.ppt

上传人:牧羊曲112 文档编号:6289587 上传时间:2023-10-14 格式:PPT 页数:239 大小:403KB
返回 下载 相关 举报
教学课件:第4章-1-关系数据库标准语言SQL.ppt_第1页
第1页 / 共239页
教学课件:第4章-1-关系数据库标准语言SQL.ppt_第2页
第2页 / 共239页
教学课件:第4章-1-关系数据库标准语言SQL.ppt_第3页
第3页 / 共239页
教学课件:第4章-1-关系数据库标准语言SQL.ppt_第4页
第4页 / 共239页
教学课件:第4章-1-关系数据库标准语言SQL.ppt_第5页
第5页 / 共239页
点击查看更多>>
资源描述

《教学课件:第4章-1-关系数据库标准语言SQL.ppt》由会员分享,可在线阅读,更多相关《教学课件:第4章-1-关系数据库标准语言SQL.ppt(239页珍藏版)》请在三一办公上搜索。

1、anliping,1,第4章 关系数据库标准语言SQL,4.1 SQL概述4.2 数据定义4.3 数据查询4.4 数据更新 4.5 视图的定义和对视图的操作4.6 数据控制4.7 嵌入式SQL,anliping,2,4.1 SQL概述,SQL的产生和发展1970年,美国IBM研究中心的E.F.Codd连续发表多篇论文,提出关系模型。1972年,IBM公司开始研制实验型关系数据库管理系统SYSTEM R,配制的查询语言称为SQUARE(Specifying Queries As Relational Expression)语言,在语言中使用了较多的数学符号。1974年,Boyce和Chamber

2、lin把SQUARE修改为SEQUEL(Structured English QUEry Language)语言。后来SEQUEL简称为SQL(Structured Query Language),即“结构式查询语言”,SQL的发音仍为“sequel”。现在SQL已经成为一个标准。,anliping,3,4.1.1 SQL的特点,SQL语言之所以能够为用户和业界所接受,成为国际标准,是因为它是一个综合的、通用的、功能极强同时又简洁易学的语言。SQL语言集数据查询(data query)、数据操纵(data manipulation)、数据定义(data definition)和数据控制(dat

3、a control)功能于一体,充分体现了关系数据语言的特点和优点。,anliping,4,1.综合统一,SQL语言则集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL的功能于一体,语言风格统一;可以独立完成数据库生命周期中的全部活动,包括定义关系模式、录入数据以建立数据库、查询、更新、维护、数据库重构、数据库安全性控制等一系列操作要求,这就为数据库应用系统开发提供了良好的环境。例如用户在数据库投入运行后,还可根据需要随时地逐步地修改模式,并不影响数据库的运行,从而使系统具有良好的可扩充性。,anliping,5,2.高度非过程化,非关系数据模型的数据操纵语言是面向过程的语言,用其完

4、成某项请求,必须指定存取路径。用SQL语言进行数据操作,用户只需提出“做什么”,而不必指明“怎么做”,因此用户无需了解存取路径,存取路径的选择以及SQL语句的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高数据独立性。,anliping,6,3.面向集合的操作方式,SQL语言采用集合操作方式,不仅查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。非关系数据模型采用的是面向记录的操作方式,任何一个操作其对象都是一条记录。例如查询所有平均成绩在80分以上的学生姓名,用户必须说明完成该请求的具体处理过程,即如何用循环结构按照某条路径一条一条地把满足条件的

5、学生记录读出来。,anliping,7,5.语言简洁,易学易用,SQL语言功能极强,但由于设计巧妙,语言十分简洁,完成数据定义、数据操纵、数据控制的核心功能只用了9个动词:CREATE、DROP、SELECT、INSERT、UPDATE、DELETE、GRANT、REVOKE。SQL语言语法简单,接近英语口语,因此容易学习,容易使用。,anliping,8,SQL语言的动词,anliping,9,4.以同一种语法结构提供两种使用方式SQL语言既是自含式语言,又是嵌入式语言。,anliping,10,4.1.2 SQL语言的基本概念,SQL语言支持关系数据库三级模式结构。,anliping,11

6、,模式对应于基本表基本表是本身独立存在的表,在SQL中一个关系就对应一个表。一些基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中。内模式对应于存储文件存储文件的逻辑结构组成了关系数据库的内模式。存储文件的物理文件结构是任意的。,anliping,12,外模式对应于视图和部分基本表视图是从基本表或其他视图中导出的表,它本身不独立存储在数据库中,也就是说数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中,因此视图是一个虚表。用户可以用SQL语言对视图和基本表进行查询。在用户眼中,视图和基本表都是关系。,anliping,13,4.2 数据定义,定

7、义表 CREATE TABLE删除表 DROP TABLE修改表 ALTER TABLE定义视图 CREATE VIEW(4.4节)删除视图 DROP VIEW定义索引 CREATE INDEX删除索引 DROP INDEX,anliping,14,4.2.1 定义、删除与修改基本表,一、定义基本表一般格式如下:CREATE TABLE(列级完整性约束条件,列级完整性约束条件.,);,anliping,15,其中:是所要定义的基本表的名字,它可以由一个或多个属性(列)组成。完整性约束条件建表的同时通常还可以定义与该表有关的完整性约束条件,这些完整性约束条件被存入系统的数据字典中,当用户操作表中

8、数据时由DBMS自动检查该操作是否违背这些完整性约束条件。如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。,anliping,16,下面以一个“学生-课程”数据库为例说明各种语句的用法。“学生-课程”数据库中包括三个表:(1)“学生”表Student由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所在系(Sdept)五个属性组成,可记为:Student(Sno,Sname,Ssex,Sage,Sdept)(2)“课程”表Course由课程号(Cno)、课程名(Cname)、先修课号(Cpno)、学分(Ccredit)

9、四个属性组成,可记为:Course(Cno,Cname,Cpno,Ccredit)(3)“学生选课”表SC由学号(Sno)、课程号(Cno)、成绩(Grade)三个属性组成,可记为:SC(Sno,Cno,Grade),anliping,17,例1 建立一个“学生”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成,其中学号属性不能为空,并且其值是唯一的。CREATE TABLE Student(Sno CHAR(5)NOT NULL UNIQUE,Sname CHAR(20),Ssex CHAR(1),Sage INT,Sdept CHA

10、R(15);,anliping,18,数据类型说明定义表的各个属性时需要指明其数据类型及长度。不同的数据库系统支持的数据类型不完全相同,例如IBM DB2 SQL主要支持以下数据类型:SMALLINT 半字长二进制整数。INTEGER或INT 全字长二进制整数。DECIMAL(p,q)或DEC(p,q)压缩十进制数,共p位,其中小数点后有q位。0qp15,q=0时可以省略。FLOAT 双字长浮点数。CHARTER(n)或CHAR(n)长度为n的定长字符串。VARCHAR(n)最大长度为n的变长字符串。GRAPHIC(n)长度为n的定长图形字符串。VARGRAPHIC(n)最大长度为n的变长图形

11、字符串。DATE 日期型,格式为YYYY-MM-DD。TIME 时间型,格式为。TIMESTAMP 日期加时间。,anliping,19,二、修改基本表,一般格式为:ALTER TABLE ADD 完整性约束DROP MODIFY;其中:指定需要修改的基本表,ADD子句用于增加新列和新的完整性约束条件,DROP子句用于删除指定的完整性约束条件,MODIFY子句用于修改原有的列定义。,anliping,20,例2 向Student表增加“入学时间”列,其数据类型为日期型 ALTER TABLE Student ADD Scome DATE;不论基本表中原来是否已有数据,新增加的列一律为空值。例3

12、 将年龄的数据类型改为半字长整数 ALTER TABLE Student MODIFY Sage SMALLINT;修改原有的列定义有可能会破坏已有数据。例4 删除关于学号必须取唯一值的约束 ALTER TABLE Student DROP UNIQUE(Sno);,anliping,21,说明:SQL没有提供删除属性列的语句,用户只能间接实现这一功能,即:先把原表中要保留的列及其内容复制到一个新表中;然后删除原表;将新表重命名为原表名。,anliping,22,三、删除基本表,一般格式为:DROP TABLE 例5 删除Student表DROP TABLE Student 基本表定义一旦删除

13、,表中的数据、在此表上建立的索引都将自动被删除掉,而建立在此表上的视图虽仍然保留,但已无法引用。因此执行删除操作一定要格外小心。,anliping,23,4.2.2 建立与删除索引一、建立索引,一般格式为:CREATE UNIQUE CLUSTER INDEX ON(,.);其中:指定要建索引的基本表的名字。索引可以建在该表的一列或多列上,各列名之间用逗号分隔。每个后面还可以用指定索引值的排列次序,包括ASC(升序)和DESC(降序)两种,缺省值为ASC。UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。CLUSTER表示要建立的索引是聚簇索引。,anliping,24,所谓聚簇索引是

14、指索引项的顺序与表中记录的物理顺序一致的索引组织。例如,执行下面的CREATE INDEX语句:CREATE CLUSTER INDEX Stusname ON Student(Sname);将会在Student表的Sname(姓名)列上建立一个聚簇索引,而且Student表中的记录将按照Sname值的升序存放。,anliping,25,用户可以在最常查询的列上建立聚簇索引以提高查询效率。显然在一个基本表上最多只能建立一个聚簇索引。建立聚簇索引后,更新索引列数据时,往往导致表中记录的物理顺序的变更,代价较大,因此对于经常更新的列不宜建立聚簇索引。,anliping,26,例6 为学生-课程数据

15、库中的Student、Course、SC三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。CREATE UNIQUE INDEX Stusno ON Student(Sno);CREATE UNIQUE INDEX Coucno ON Course(Cno);CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);,anliping,27,二、删除索引,一般格式为:DROP INDEX;例7 删除Student表的Stusname索引 DROP INDEX Stusn

16、ame;说明:索引一经建立,就由系统使用和维护它,不需用户干预。建立索引是为了减少查询操作的时间,但如果数据增删改频繁,系统会花费许多时间来维护索引。这时,可以删除一些不必要的索引。删除索引时,系统会同时从数据字典中删去有关该索引的描述。,anliping,28,4.3 查询,是数据库的核心操作,一般格式为:SELECT ALL|DISTINCT,FROM,.WHERE GROUP BY HAVING ORDER BY ASC|DESC;,anliping,29,整个SELECT语句的含义是:根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组;(选择)再按SE

17、LECT子句中的目标列表达式,选出元组中的属性值形成结果表;(投影)如果有GROUP子句,则将结果按的值进行分组,该属性列值相等的元组为一个组,通常会在每组中作用集函数;如果GROUP子句带HAVING短语,则只有满足指定条件的组才予输出;如果有ORDER 子句,则结果表还要按的值的升序或降序排序。,anliping,30,4.3.1 单表查询一、选择表中的若干列,1.查询指定列 例1 查询全体学生的学号与姓名 SELECT Sno,Sname FROM Student;中各个列的先后顺序可以与表中的顺序不一致。也就是说,用户在查询时可以根据应用的需要改变列的显示顺序。,anliping,31

18、,例2 查询全体学生的姓名、学号、所在系 SELECT Sname,Sno,Sdept FROM Student;这时结果表中的列的顺序与基表中不同,是按查询要求,先列出姓名属性,然后再列学号属性和所在系属性。,anliping,32,2.查询全部列,例3 查询全体学生的详细记录 SELECT*FROM Student;该SELECT语句实际上是无条件地把Student表的全部信息都查询出来,所以也称为全表查询,这是最简单的一种查询。,anliping,33,3.查询经过计算的值,SELECT子句的不仅可以是表中的属性列,也可以是有关表达式,即可以将查询出来的属性列经过一定的计算后列出结果。例

19、4 查全体学生的姓名及其出生年份 SELECT Sname,2006-Sage FROM Student;本例中,中第二项不是通常的列名,而是一个计算表达式,是用当前的年份(假设为2006年)减去学生的年龄,这样,所得的即是学生的出生年份。,anliping,34,输出的结果为:,anliping,35,不仅可以是算术表达式,还可以是字符串常量、函数等。例5 查全体学生的姓名、出生年份和所在系,要求用小写字母表示所有系名。SELECT Sname,Year of Birth:,2006-Sage,LOWER(Sdept)FROM Student;,anliping,36,结果为:,anlipi

20、ng,37,用户可以通过指定别名来改变查询结果的列标题,这对于含算术表达式、常量、函数名的目标列表达式尤为有用。例如对于上例,可以如下定义列别名:SELECT Sname NAME,Year of Birth:BIRTH,2006-Sage BIRTHDAY,LOWER(Sdept)DEPARTMENT FROM Student;,anliping,38,结果为:,anliping,39,说明:ISLOWER()Function:Determines whether the leftmost character of the specified character expression is

21、a lowercase alphabetic character.Syntax:ISLOWER(cExpression)Returns:LogicalLOWER()Function:Returns a specified character expression in lowercase letters.Syntax:LOWER(cExpression)Returns:Character,anliping,40,二、选择表中的若干元组,1.消除取值重复的行 例6 查所有选修过课的学生的学号 SELECT Sno FROM SC;,anliping,41,假设SC表中有下列数据,anliping

22、,42,执行上面的SELECT语句后,结果为:Sno-95001 95001 95001 95002 95002,anliping,43,该查询结果里包含了许多重复的行。如果想去掉结果表中的重复行,必须指定DISTINCT短语:SELECT DISTINCT SnoFROM SC;执行结果为:Sno-95001 95002,anliping,44,2.查询满足条件的元组,查询满足指定条件的元组可以通过WHERE子句实现。WHERE子句常用的查询条件如表4-3所示。表4-3 常用的查询条件,anliping,45,(1)比较大小 例7 查计算机系全体学生的名单 SELECT SnameFROM

23、StudentWHERE Sdept=CS;例8 查所有年龄在20岁以下的学生姓名及其年龄 SELECT Sname,SageFROM StudentWHERE Sage 20;,anliping,46,或:SELECT Sname,SageFROM Student WHERE NOT Sage=20;例9 查询考试成绩有不及格的学生的学号。SELECT DISTINCT Sno FROM SC WHERE Grade 60;这里使用了DISTINCT短语,当一个学生有多门课程不及格,他的学号也只列一次。,anliping,47,(2)确定范围 BETWEENAND 和 NOT BETWEEN

24、 AND 例10 查询年龄在20至23岁之间的学生的姓名、系别和年龄.SELECT Sname,Sdept,SageFROM Student WHERE BETWEEN(Sage,20,23);教材:WHERE Sage BETWEEN 20 AND 23;,anliping,48,与BETWEEN().相对的谓词是NOT BETWEEN()。例11 查询年龄不在20至23岁之间的学生姓名、系别和年龄。SELECT Sname,Sdept,Sage FROM StudentWHERE NOT BETWEEN(Sage,20,23)教材:WHERE Sage NOT BETWEEN 20 AND

25、 23;,anliping,49,(3)确定集合 IN,NOT IN 查找属性值是否属于指定集合的元组.例12 查信息系(IS)、数学系(MA)和计算机科学系(CS)的学生的姓名和性别.SELECT Sname,Ssex FROM Student WHERE Sdept IN(IS,MA,CS);,anliping,50,与IN相对的谓词是NOT IN,用于查找属性值不属于指定集合的元组。例13 查既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别.SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN(IS,MA,CS),anliping,

26、51,(4)字符匹配 谓词LIKE可以用来进行字符串的匹配。其一般语法格式如下:NOT LIKE ESCAPE 其含义是查找指定的属性列值与相匹配的元组。可以是一个完整的字符串,也可以含有通配符%和_。%(百分号)代表任意长度(长度可以为0)的字符串。_(下横线)代表任意单个字符。,anliping,52,例14 查所有姓刘的学生的姓名、学号和性别。SELECT Sname,Sno,SsexFROM Student WHERE Sname LIKE 刘%;例15 查姓“欧阳”且全名为三个汉字的学生的姓名。SELECT Sname FROM Student WHERE Sname LIKE 欧阳

27、_;注意,由于一个汉字占两个字符的位置,所以匹配串欧阳后面需要跟个_。,anliping,53,例16 查名字中第二字为“阳”字的学生的姓名和学号。SELECT Sname,Sno FROM Student WHERE Sname LIKE _阳%;例17 查所有不姓刘的学生姓名。SELECT Sname,Sno,Ssex FROM Student WHERE Sname NOT LIKE 刘%;,anliping,54,如果用户要查询的匹配字符串本身就含有%或_,比如要查名字为DB_Design的课程的学分,应如何实现呢?这时就要使用ESCAPE 短语对通配符进行转义了。例18 查DB_De

28、sign课程的课程号和学分 SELECT Cno,Ccredit FROM Course WHERE Cname LIKE DB_Design ESCAPE;ESCAPE 短语表示为换码字符,这样匹配串中紧跟在后面的字符”_”不再具有通配符的含义,而是取其本身含义,被转义为普通的”_”字符。,anliping,55,例19 查以”DB_”开头,且倒数第三个字符为i的课程的详细情况 SELECT*FROM Course WHERE Cname LIKE DB_%i_ ESCAPE;注意这里的匹配字符串DB_%i_。第一个_前面有换码字符,所以它被转义为普通的_字符。而%、第二个_和第三个_前面均

29、没有换码字符,所以它们仍作为通配符。,anliping,56,其执行结果为:,anliping,57,(5)涉及空值的查询 NULL:选定此项时,指定该字段可接受 NULL 值。例20 某些学生选修某门课程后没有参加考试,所以有选课记录,但没有考试成绩,下面我们来查一下缺少成绩的学生的学号和相应的课程号.SELECT Sno,Cno FROM SCWHERE Grade IS NULL;注意这里的IS不能用等号=代替。,anliping,58,例21 查所有有成绩的记录的学生学号和课程号。SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;,anlip

30、ing,59,(6)多重条件查询 逻辑运算符AND和OR可用来联结多个查询条件。如果这两个运算符同时出现在同一个WHERE条件子句中,则AND的优先级高于OR,但用户可以用括号改变优先级。例22 查CS系年龄在20岁以下的学生姓名。SELECT Sname FROM Student WHERE Sdept=CS AND Sage20;,anliping,60,回顾例12:查信息系(IS)、数学系(MA)和计算机科学系(CS)的学生的姓名和性别.SELECT Sname,Ssex FROM Student WHERE Sdept IN(IS,MA,CS);例12 中的IN谓词实际上是多个OR运算

31、符的缩写,因此例12中的查询也可以用OR运算符写成如下等价形式:SELECT Sname,Ssex FROM Student WHERE Sdept=IS OR Sdept=MA OR Sdept=CS;,anliping,61,三、对查询结果排序,如果没有指定查询结果的显示顺序,DBMS将按其最方便的顺序(通常是元组在表中的先后顺序)输出查询结果。用户也可以用ORDER BY子句指定按照一个或多个属性列的升序(ASC)或降序(DESC)重新排列查询结果,其中升序ASC为缺省值。,anliping,62,例23 查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。SELECT S

32、no,Grade FROM SC WHERE Cno=3 ORDER BY Grade DESC;,anliping,63,前面已经提到,可能有些学生选修了3号课程后没有参加考试,即成绩列为空值。用ORDER BY子句对查询结果按成绩排序时,若按升序排,成绩为空值的元组将最先显示,若按降序排,成绩为空值的元组将最后显示。例24 查询全体学生情况,查询结果按所在系升序排列,对同一系中的学生按年龄降序排列。SELECT*FROM Student ORDER BY Sdept,Sage DESC;,anliping,64,四、使用集函数,为了进一步方便用户,增强检索功能,SQL提供了许多集函数,主要

33、包括:COUNT(DISTINCT|ALL*)统计元组个数 COUNT(DISTINCT|ALL)统计一列中值的个数(.NULL.值除外)SUM(DISTINCT|ALL)计算一列值的总和(此列必须是数值型)AVG(DISTINCT|ALL)计算一列值的平均值(此列必须是数值型)MAX(DISTINCT|ALL)求一列值中的最大值 MIN(DISTINCT|ALL)求一列值中的最小值,anliping,65,如果指定DISTINCT短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT短语或指定ALL短语(ALL为缺省值),则表示不取消重复值。例25 查询学生总人数 SELEC

34、T COUNT(*)FROM Student;,anliping,66,例26 查询选修了课程的学生人数 SELECT COUNT(DISTINCT Sno)FROM SC;学生每选修一门课,在SC中都有一条相应的记录,而一个学生一般都要选修多门课程,为避免重复计算学生人数,必须在COUNT函数中用DISTINCT短语。,anliping,67,例27 计算1号课程的学生平均成绩 SELECT AVG(Grade)FROM SC WHERE Cno=1;例28 查询学习1号课程的学生最高分数 SELECT MAX(Grade)FROM SC WHERE Cno=1;,anliping,68,五

35、、对查询结果分组,GROUP BY子句可以将查询结果表的各行按一列或多列取值相等的原则进行分组。对查询结果分组的目的是为了细化集函数的作用对象。如果未对查询结果分组,集函数将作用于整个查询结果,即整个查询结果只有一个函数值。否则,集函数将作用于每一个组,即每一组都有一个函数值。,anliping,69,例29 查询各个课程号与相应的选课人数 SELECT Cno,COUNT(Sno)FROM SC GROUP BY Cno;该SELECT语句对SC表按Cno的取值进行分组,所有具有相同Cno值的元组为一组,然后对每一组作用集函数COUNT以求得该组的学生人数。,anliping,70,查询结果

36、为:,anliping,71,如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING短语指定筛选条件。例30 查询选修了3门以上课程的学生学号.SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)3;,anliping,72,HAVING短语指定选择组的条件,只有满足条件(即元组个数3)的组才会被选出来。WHERE子句与HAVING短语的根本区别在于作用对象不同。WHERE子句作用于基本表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。,anliping,73,例:供应商数据库中

37、的S、P、J、SPJ关系,查询某工程至少用了3家供应商(包含3家)供应的零件的平均数量,并按工程号的降序排列。SELECT JNO,AVG(QTY)FROM SPJ GROUP BY JNO HAVING COUNT(DISTINCT(SNO)2 ORDER BY JNO DESC;根据题意“某工程至少用了3家供应商(含3家)供应的零件”,应该按照工程号分组,且应加上条件供应商的数目。但需要注意的是,一个工程项目可能用了同一个供应商的多种零件,因此,在统计供应商数的时候需要加上DISTINCT,以避免重复统计所导致的错误结果。工程号:JNO,供应商号:SNO,零件号:PNO.,anliping

38、,74,假如按工程号JNO=J1分组,结果如表3-4所示。从表中可以看出如果不加DISTINCT,统计的数为7,而加了DISTINCT,统计的数是5。,anliping,75,4.3.2 连结查询,一个数据库中的多个表之间一般都存在某种内在联系,它们共同提供有用的信息。前面的查询都是针对一个表进行的。若一个查询同时涉及两个以上的表,则称之为连接查询。连接查询主要包括等值连接、自然连接、非等值连接查询、自身连接查询、外连接查询和复合条件连接查询。,anliping,76,一、等值与非等值连接查询,用来连接两个表的条件称为连接条件或连接谓词,其一般格式为:.其中比较运算符主要有:=、=、.BETW

39、EEN.AND.当连接运算符为=时,称为等值连接。使用其它运算符称为非等值连接。,anliping,77,连接谓词中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的,但不必是相同的。例如,可以都是字符型,或都是日期型;也可以一个是整型,另一个是实型,整型和实型都是数值型,因此是可比的。但若一个是字符型,另一个是整数型就不允许了,因为它们是不可比的类型。,anliping,78,从概念上讲,DBMS执行连接操作的过程是:首先在表1中找到第一个元组,然后从头开始顺序扫描或按索引扫描表2,查找满足连接条件的元组,每找到一个元组,就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。

40、表2全部扫描完毕后,再到表1中找第二个元组,然后再从头开始顺序扫描或按索引扫描表2,查找满足连接条件的元组,每找到一个元组,就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。重复上述操作,直到表1全部元组都处理完毕为止。,anliping,79,例32 查询每个学生及其选修课程的情况 学生情况存放在Student表中,学生选课情况存放在SC表中,所以本查询实际上同时涉及Student与SC两个表中的数据。这两个表之间的联系是通过两个表都具有的属性Sno实现的。要查询学生及其选修课程的情况,就必须将这两个表中学号相同的元组连接起来。这是一个等值连接。完成本查询的SQL语句为:SELE

41、CT Student.*,SC.*FROM Student,SC WHERE Student.Sno=SC.Sno;,anliping,80,连接运算中有两种特殊情况,一种称为卡氏积连接,另一种称为自然连接。卡氏积是不带连接谓词的连接。两个表的卡氏积即是两表中元组的交叉乘积,也即其中一表中的每一元组都要与另一表中的每一元组组合拼接,因此结果表往往很大。没有意义,很少使用。如果是按照两个表中的相同属性进行等值连接,且目标列中去掉了重复的属性列,但保留了所有不重复的属性列,则称之为自然连接。,anliping,81,例33 自然连接Student和SC表 SELECT Student.Sno,Sn

42、ame,Ssex,Sage,Sdept,Cno,Grade FROM Student,SC WHERE Student.Sno=SC.Sno;在本查询中,由于Sname、Ssex、Sage、Sdept、Cno和Grade属性列在Student与SC表中是唯一的,因此引用时可以去掉表名前缀。而Sno在两个表都出现了,因此引用时必须加上表名前缀。该查询的执行结果不再出现SC.Sno列。,anliping,82,二、自身连接,连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,这种连接称为表的自身连接。例34 查询每一门课的间接先修课(即先修课的先修课),anliping,83,我们先

43、来分析一下,题目要求查询每一门课程的先修课的先修课,在“课程”表即Course关系中,只有每门课的直接先修课信息,而没有先修课的先修课,要得到这个信息,必须先对一门课找到其先修课,再按此先修课的课程号,查找它的先修课程,这相当于将Course表与其自身连接后,取第一个副本的课程号与第二个副本的先修课号做为目标列中的属性。具体写SQL语句时,为清楚起见,我们可以为Course表取两个别名,一个是FIRST,另一个是SECOND,也可以在考虑问题时就把Course表想成是两个完全一样表,一个是FIRST表,另一个是SECOND表。,anliping,84,FIRST SECOND,Cno Cpno

44、 Cno Cpno-1 5 1 5 2 2 3 1 3 1 4 6 4 6 5 7 5 7 6 6 7 6 7 6,anliping,85,完成该查询的SQL语句为:SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND WHERE FIRST.Cpno=SECOND.Cno;我们在FROM子句中为Course表定义了两个不同的别名,这样就可以在SELECT子句和WHERE子句中的属性名前分别用这两个别名加以区分。,anliping,86,结果表如下:Cno Pcno-1 7 3 5 5 6,anliping,87,三、外连接,

45、在通常的连接操作中,只有满足连接条件的元组才能作为结果输出,如在例32和例33的结果表中没有关于95003和95004两个学生的信息,原因在于他们没有选课,在SC表中没有相应的元组。(例32 查询每个学生及其选修课程的情况)但是有时我们想以Student表为主体列出每个学生的基本情况及其选课情况,若某个学生没有选课,则只输出其基本情况信息,其选课信息为空值即可,这时就需要使用外连接(Outer Join)。外连接的运算符通常为*。有的关系数据库中也用+。,anliping,88,例33:查询每个学生及其选修课程的情况 SELECT Student.Sno,Sname,Ssex,Sage,Sde

46、pt,Cno,Grade FROM Student,SC WHERE Student.Sno=SC.Sno(*)右外连接:外连接符出现在连接条件的右边。左外连接:外连接符出现在连接条件的左边。,anliping,89,结果:Student.Sno Sname Ssex Sage Sdept Cno Grade 95001 李勇 男 20 CS 1 92 95001 李勇 男 20 CS 2 85 95001 李勇 男 20 CS 3 88 95002 刘晨 女 19 IS 2 90 95002 刘晨 女 19 IS 3 80 95003 王敏 女 18 MA 95004 张立 男 19 IS,

47、anliping,90,在表名后面加外连接操作符(*)或(+)指定非主体表;非主体表有一“万能”的虚行,该行全部由空值组成;虚行可以和主体表中所有不满足连接条件的元组进行连接;由于虚行各列全部是空值,因此与虚行连接的结果中,来自非主体表的属性值全部是空值。,anliping,91,四、复合条件连接,上面各个连接查询中,WHERE子句中只有一个条件,即用于连接两个表的谓词。WHERE子句中有多个条件的连接操作,称为复合条件连接。例35 查询选修2号课程且成绩在90分以上的所有学生 SELECT Student.Sno,Sname FROM Student,SC WHERE Student.Sno

48、=SC.Sno AND SC.Cno=2 AND SC.Grade90;,anliping,92,连接操作除了可以是两表连接,一个表与其自身连接外,还可以是两个以上的表进行连接,后者通常称为多表连接。例36 查询每个学生的学号、姓名及其选修的课程名其及成绩。SELECT Student.Sno,Sname,Course.Cname,SC.Grade FROM Student,SC,Course WHERE Student.Sno=SC.Sno and SC.Cno=Course.Cno;,anliping,93,结果:Student.Sno Sname Cname Grade 95001 李勇

49、 数据库 92 95001 李勇 数学 85 95001 李勇 信息系统 88 95002 刘晨 数学 90 95002 刘晨 信息系统 80,anliping,94,4.3.3 嵌套查询,在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询或子查询。例如:查询选修了2号课程的学生的姓名 SELECT Sname 外层查询/父查询FROM StudentWHERE Sno IN(SELECT Sno 内层查询/子查询 FROM SC WHERE Cno=2);,anliping,95

50、,说明:在这个例子中,下层查询块 SELECT Sno FROM SC WHERE Cno=2 是嵌套在上层查询块 SELECT Sname FROM Student WHERE Sno IN 的WHERE条件中的。上层的查询块又称为外层查询或父查询或主查询,下层查询块又称为内层查询或子查询。,anliping,96,SQL语言允许多层嵌套查询。即一个子查询中还可以嵌套其它子查询。需要特别指出的是,子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句永远只能对最终查询结果排序。嵌套查询使得可以用一系列简单查询构成复杂的查询,从而明显地增强了SQL的查询能力。以层层嵌套的

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号