《【教学课件】第3章关系数据库标准语言-SQL.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第3章关系数据库标准语言-SQL.ppt(138页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、周口师范学院计算机科学系02级教育专业第3章 关系数据库标准语言SQL1/9/20231周口师范学院计算机科学系02级教育专业在数据库系统中,数据查询是最常用的操作。SQL是目前使用最广泛的数据库语言。利用SQL可以通过功能强大而又简捷的查询语言与数据库打交道,从数据库中得到想要的数据。SQL语句主要被用于进行数据库的查询、定义、操纵和控制几个方面,是一种功能齐全的数据库语言。SQL的数据定义是指对关系模式一级的定义。数据操纵是指对关系中的具体数据进行增、删、改等更新操作。数据控制是指对数据访问权限的授予与取消。1/9/20232周口师范学院计算机科学系02级教育专业3.1 SQL语言基本知识
2、3.1.1 SQL的发展史1974年 IBM圣 约 瑟 实 验 室 的 Boyce和Chamberlin为 关 系 数 据 库 管 理 系 统System-R设计的一种查询语言,当时称为SEQUEL语言(Structured English Query Language),后简称为SQL。1981年IBM推出关系数据库系统SQL/DS后,SQL得到了广泛应用。1986年美国国家标准协会(ANSI)公布了第一个SQL标准SQL86。1987年,ISO通过SQL86标准。1/9/20233周口师范学院计算机科学系02级教育专业1989年,ISO制定SQL89标准,SQL89标准在SQL86基础上增
3、补了完整性描述。1990年,我国制定等同SQL89的国家标准。1992年,ISO制定SQL92标准,即SQL2。1999年,ANSI制定SQL3标准。SQL成为国际标准后,对数据库以外的领域产生了很大的影响,有不少软件产品将SQL语言的数据查询功能与图形功能、软件工程工具、软件开发工具、人工智能程序结合起来。SQL已成为数据库领域中一个主流语言。1/9/20234周口师范学院计算机科学系02级教育专业在许多软件产品中,软件厂商都对SQL的基本命令集进行了扩充,将其扩展成嵌入式SQL语言。SQL Server 2000中使用Transact-SQL语言与数据库服务器打交道。1/9/20235周口
4、师范学院计算机科学系02级教育专业3.1.2 SQL的特点SQL具有如下特点:1综合统一。2高度非过程化。3面向集合的操作方式。4以同一种语法结构提供两种使用方式5.语言简捷、易学易用。SQL语言功能极强,但由于设计巧妙,语言十分简捷,完成核心功能只用了9个动词,如下表示,SQL语言接近英语口语,因此容易学习,容易使用。1/9/20236周口师范学院计算机科学系02级教育专业SQL的功能动词数据查询SELECT数据定义CREATE,DROP,ALTER数据操纵INSERT,UPDATE,DELETE数据控制GRANT,REVOKESQL语言的动词语言的动词1/9/20237周口师范学院计算机科
5、学系02级教育专业SQL语言支持关系数据库三级模式结构,如下图示。其中外模式对应于视图和部分基本表,模式对应于基本表,内模式对应于存储文件。基本表是本身独立存在的表,在SQL中一个关系就对应一个表。一个(或多个)基本表对应一个存储文件。一个表可以带若干个索引,索引也存放在存储文件中。存储文件的逻辑结构组成了关系数据库的内模式,存储文件的物理结构是任意的,对用户是透明的。视图是从一个或几个基本表导出的表。它本身不独立存储在数据库中,是一个虚表。即数据库中只存放视图的定义而不存放视图对应的数据。1/9/20238周口师范学院计算机科学系02级教育专业外模式外模式内模式内模式模式模式1/9/2023
6、9周口师范学院计算机科学系02级教育专业3.1.3 SQL的分类1、数据定义语言(DDL:Data Definition Language)创建、修改或删除数据库中各种对象,包括表、视图、索引等。2、查询语言(QL:Query Language)按照指定的组合、条件表达式或排序检索已存在的数据库中的数据,但并不改变数据库中数据。3、数据操纵语言(DML:Data Manipulation Language)对已经存在的数据库进行记录的插入、删除、修改等操作1/9/202310周口师范学院计算机科学系02级教育专业4、数 据 控 制 语 言(DCL:Data Control Language)用
7、来授予或收回访问数据库的某种特权、控制数据操纵事务的发生时间及效果、对数据库进行监视注意:在书写各种SQL 命令时,命令中所涉及的标点符号,如括号、逗号、分号、圆点(英文句号)等都应是英文半角,如果写成中文全角符号,则会在执行命令时出错。1/9/202311周口师范学院计算机科学系02级教育专业3.2 数据定义数据定义命令用于建立数据库和建立、修改、删除基本表。表CREATE TABLEDROP TABLEALTER TABLE视图CREATE VIEWDROP VIEW索引CREATE INDEXDROP INDEX操作对象操作方式 创建 删除 修改SQL的数据定义语句的数据定义语句1/9/
8、202312周口师范学院计算机科学系02级教育专业3.2.1 定义、删除与修改基本表一、定义基本表 建立数据库最重要的一步就是定义一些基本表。SQL语言使用CREATE TABLE 语句定义基本表,其一般格式如下:CREATE TABLE (列级完整性约束条件 列级完整性约束条件表级完整性约束条件);其中是所要定义的基本表的名字,它可以由一个或多个属性(列)组成。1/9/202313周口师范学院计算机科学系02级教育专业建表的同时通常还可以定义与该表有关的完整性约束条件。这些完整性约束条件被存入系统的数据字典中,当用户操作表中数据时由DBMS自动检查该操作是否违背这些完整性约束条件。如果完整性
9、约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级上也可以定义在表级上1/9/202314周口师范学院计算机科学系02级教育专业例1 建立一个“学生”表Student,它由学号Sno,姓名Sname,性别Ssex,年龄Sdept、所在系Sdept五个属性组成。其中学号不能为空,值是唯一的,并且姓名取值也唯一。CREATE TABLE Student (Sno CHAR(5)NOT NULL UNIQUE,Sname CHAR(20)UNIQUE,Ssex CHAR(1),Sage INT,Sdept CHAR(15);其中:NOT NULL指的是该列的值不能为空值,UNI
10、QUE指的是该列的值唯一。1/9/202315周口师范学院计算机科学系02级教育专业SnoSnameSsexSageSdeptStudent1/9/202316周口师范学院计算机科学系02级教育专业例2:建立如下表所示学生基本情况表的命令是:create table jbqk(number char(8)not null,name char(8)not null,sex char(2)not null,Birthday datetime,department char(12);numbernamesexBirthday departmentjbqk1/9/202317周口师范学院计算机科学系0
11、2级教育专业数据类型说明符备注整数INT字长32位短整数SMALLINT字长16位十进制数DEC(m,n)m为总十进制位数,n为小数位数浮点数FLOAT一般指双精度浮点数 64位定长字符串 CHAR(n)变长字符串 VARCHAR(n)位串BIT(n)二进制位串,长度为n.变长位串BIT ARYINT(n)日期DATE日期加时间 DATESTAMP1/9/202318周口师范学院计算机科学系02级教育专业建立课程表的命令是:create table course(c_number char(4)not null,c_name char(20)not null,period decimal(3,
12、0),t_number char(4)not null);建立教师表(teacher)的命令是::create table teacher(t_number char(4)not null,t_name char(8),title char(10);建立选课表(sle_course)的命令是::Create table sle_course(s_number char(8)not null,c_number char(4),score decimal(3,0);1/9/202319周口师范学院计算机科学系02级教育专业二、修改基本表随着应用环境和应用需求的变化,有时需要修改已建立好的基本表,S
13、QL语言使用ALTER TABLE 语句定义基本表,其一般格式如下:ALTERTABLE ADD 列级完整 性约束条件 DROP MODIFY ;1/9/202320周口师范学院计算机科学系02级教育专业例1:向Student表中增加“入学时间”列,其数据类型为日期型。ALTER TABLE Student ADD Scome DATE;不论基本表中原来是否已有数据,新增加的列一律为空值。例2:将Student表中年龄的数据类型改为短整型 ALTER TABLE Student MODIFY Sage SMALLINT;1/9/202321周口师范学院计算机科学系02级教育专业例3 将Stud
14、ent表中学生姓名必须取唯一值的约束删除 ALTER TABLE Student DROP UNIQUE(Sname);SQL没有提供删除属性列的语句,用户只能间接实现这一功能,即先把表中要保留的列及其内容复制到一个新表中,然后删除原表,再将新表重命名为原表名。1/9/202322周口师范学院计算机科学系02级教育专业三、数据表的删除 DROP TABLE;例4:删除Student表,使用如下命令格式:DROP TABLE Student;注意注意:基本表定义一旦删除,表中的数据、此表上建立的索引和视图都将自动被删除掉。因此执行删除基本表的操作一定要格外小心。1/9/202323周口师范学院计
15、算机科学系02级教育专业3.2.2 索引的建立与删除索引是对数据库表中一个或多个列的值进行排序的结构。可以利用索引快速访问数据库表中的特定信息。一、建立索引语句CREATE UNIQUECLUSTER INDEX ON(列名次序,列名次序);说说明明:索引可以建立在一列和多列之上,索引顺序可以是ASC(升序)或DESC(降序),缺省值是ASC(升序)。UNIQUE表示每一个索引值对应唯一的数据记录。1/9/202324周口师范学院计算机科学系02级教育专业UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。CLUSTER表示要建立的索引是聚簇索引。所谓聚簇索引是指索引项的顺序与表中记录的
16、物理顺序一致的索引组织。例如,执行下面的索引语句:CREATE CLUSTER INDEX Stusname ON Student(Sname);将会在Student表的Sname列上建立一个聚簇索引,而且Student表中的记录将按照Sname值的升序存放。1/9/202325周口师范学院计算机科学系02级教育专业用户可以在最常查询的列上建立聚簇索引以提高查询效率。显然在一个基本表上最多只能建立一个聚簇索引。建立聚簇索引后,更新索引列数据时,往往导致表中记录的物理顺序的变更,代价较大,因此对于经常更新的列不宜建立聚簇索引。1/9/202326周口师范学院计算机科学系02级教育专业例1:为学生
17、数据库中的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);1/9/202327周口师范学院计算机科学系02级教育专业学号Sno姓名Sname性别Ssex年龄Sage系别Sdept95001李勇男20CS950
18、02刘晨女19IS95003王敏女18MA95004张立男19ISStudent(a)设有一个学生设有一个学生-课程数据库,包括学生关系课程数据库,包括学生关系Student课程关系课程关系Course和选修关系和选修关系SC。如下图示。如下图示68681/9/202328周口师范学院计算机科学系02级教育专业课程号Cno课程名Cname先行课Cpno学分Ccredit1数据库542数学23信息系统144操作系统635数据结构746数据处理27PASCAL语言64Course(b)1/9/202329周口师范学院计算机科学系02级教育专业学号Sno课程号Cno成绩Grade9500119295
19、001285950013889500229095002380(c)SC1/9/202330周口师范学院计算机科学系02级教育专业二、删除索引索引一经建立,就由系统使用和维护它,不需用户干预。建立索引是为了减少查询操作时间,但如果数据增、删、改频繁,系统会花费许多时间来维护索引,这时,可以删除一些不必要的索引DROP INDEX;注意:该命令不能删除由CREATE TABLE或者ALTER TABLE命令创建的主键和唯一性约束索引,也不能删除系统表中的索引。例2、删除例1中建立的索引Stusno DROP INDEX Stusno;1/9/202331周口师范学院计算机科学系02级教育专业3.3
20、 数据查询语言数据库查询是数据库的核心操作。SQL语言提供了SELECT语句进行数据库的查询,该语句具有灵活的使用方式和丰富的功能。1/9/202332周口师范学院计算机科学系02级教育专业SQL语言的查询语句一般格式是:SELECT ALL|DISTINCT ,FROM,WHERE GROUP BY HAVING ORDER BY ASC|DESC;下面对该命令进行一些说明:1/9/202333周口师范学院计算机科学系02级教育专业1命令含义 从FROM子句指定的基本表或视图中,根据WHERE子句的条件表达式查找出满足该条件的元组(记录),再按照SELECT子句指定的目标列表达式,选出元组中
21、的属性值形成结果表。如果有GROUP BY子句,则将结果按“列名1”的值进行分组,该属性列值相等的元组为一个组;如果GROUP BY子句带有短语HAVING,则只有满足短语指定条件的分组才会输出。如果有ORDER BY子句,则结果表要按照的值进行升序和降序排列。1/9/202334周口师范学院计算机科学系02级教育专业SELECT ALL|DISTINCT实现的是对表的投影操作,WHERE 中实现的是选择操作。FROM,实现的是对指定表的广义笛卡尔积 1/9/202335周口师范学院计算机科学系02级教育专业2目标列表达式列表达式可以是“列名1,列名2”的形式;如果FROM子句指定了多个表,则
22、列名应是“表名.列名”的形式。列表达式可以使用SQL提供的库函数形成表达式,常用的函数如下:COUNT(*):统计记录条数。COUNT(列名):统计一列值得个数。SUM(列名):计算某一数值型列的值的总和。AVG(列名):计算某一数值型列的值的平均值MAX(列名):计算某一数值型列的值的最大值DISTINCT参数:表示在结果集中,查询出的内容相同的记录只留下一条。MIN(列名):计算某一数值型列的值的最小值1/9/202336周口师范学院计算机科学系02级教育专业3.3.1 单表查询单表查询是指仅涉及一个表的查询。一、选择表中的若干列选择表中的全部列和部分列,就是投影运算。1、查询指定列 在很
23、多情况下,用户只对表中的一部分属性列感兴趣,这时可以通过在SELECT子句的中指定要查询的属性。1/9/202337周口师范学院计算机科学系02级教育专业例1:查询全体学生的学号和姓名。SELECT Sno,Sname FROM Student;例2:查询全体学生的姓名、学号、所在系。SELECT Sname,Sno,Sdept FROM Student;1/9/202338周口师范学院计算机科学系02级教育专业2、查询全部列将表中所有属性列都选出来,可以有两种方法。一种方法是在SELECT关键字后列出所有的列名。如果列的显示顺序与其在基表中的顺序相同,也可以简单地将指定为*。例3:查询全体学
24、生的详细记录。SELECT*SELECT Sno,Sname,FROM Student FROM Student1/9/202339周口师范学院计算机科学系02级教育专业3、查询经过计算的值SELECT子句的不仅可以是表中的属性列,也可以是表达式。例4:查全体学生的姓名及其出生年份SELECT Sname,2004-SageFROM Student;输出的结果为:不仅可以是算术表达式,还可以是字符串常量、函数等。1/9/202340周口师范学院计算机科学系02级教育专业例5:查询全体学生的姓名,出生年份和所在系,要求用小写字母表示所在系名。SELECT Sname,Year of Birth,
25、2004-Sage,ISLOWER(Sdept)FROM Student;输出结果为:用户可以通过指定别名来改变查询结果的列标题。这对于含算术表达式、常量、函数名的目标列表达式尤为有用。例如,对上例,可定义如下:1/9/202341周口师范学院计算机科学系02级教育专业SELECT Sname NAME,Year of Birth;BIRTH,2004-Sage BIRTHDAY,ISLOWER(Sdept)DEPARTMENTFROM Student;结果为:NAME BIRTHBIRTHDAY DEPARTMENT李勇Year of Birth:1976cs刘晨Year of Birth:
26、1977is王敏Year of Birth:1978ma(c)(c)1/9/202342周口师范学院计算机科学系02级教育专业SnameYear of Birth:2004-SageISLOWER(Sdept)李勇Year of Birth:1976cs刘晨Year of Birth:1977is王敏Year of Birth:1978maSname2004-Sage李勇1976刘晨1977王敏1978(a)(a)(b)(b)1/9/202343周口师范学院计算机科学系02级教育专业二、选择表中的若干元组1、消除取值重复的行 两个本来并不完全相同的元组,投影到指定的某些列上后,可能变成相同的行
27、。如果想去掉表中的重复行,必须在SELECT子句中指定DISTINCET短语。如果没有指定DISTINCET短语,则缺省为ALL,即保留结果表中取值重复的行。例 6:查询选修了课程的学生学号。SELECT Sno FROM SC;1/9/202344周口师范学院计算机科学系02级教育专业Sno9500195001950019500295002(a)(a)该查询结果里包含了许多重复行该查询结果里包含了许多重复行如果想去掉表中的重复行,则:SELECT DISTINCT SnoFROM SC;执行结果为:Sno9500195002(b)(b)1/9/202345周口师范学院计算机科学系02级教育专
28、业2、查询满足条件的元组查询满足条件的元组可以通过WHERE子句来实现,WHERE子句常用的查询条件如下表示:1/9/202346周口师范学院计算机科学系02级教育专业查询查询条件条件运运 算算 符符说说 明明比比 较较=,=,=,!=!=,(!)NOT+(!)NOT+字符串比较从左向右字符串比较从左向右进行进行确定确定范围范围BETWEEN ANDBETWEEN AND,NOT NOT BETWEEN ANDBETWEEN ANDBETWEENBETWEEN后是下限后是下限(低低),ANDAND后是上限后是上限确定确定集合集合ININ,NOT INNOT IN检查一个某属性值是检查一个某属性
29、值是否属于指定集合的元组否属于指定集合的元组字符字符匹配匹配LIKELIKE,NOT LIKENOT LIKE用于构造条件表达式用于构造条件表达式中的字符匹配中的字符匹配空空 值值IS NULLIS NULL,IS NOT NULLIS NOT NULL当属性值内容为空时,当属性值内容为空时,要用此运算符要用此运算符逻辑逻辑运算运算ANDAND,OROR,NOTNOT用于构造复合表达式用于构造复合表达式常用的查询条件常用的查询条件1/9/202347周口师范学院计算机科学系02级教育专业例7:查询考试成绩不及格学生的学号。SELECT DISTINCT Sno FROM SC WHERE Gr
30、ade 60;例8:查询年龄在2023之间的学生的姓名,系别和年龄。SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23例9:查询年龄不在2023之间的学生的姓名,系别和年龄。SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 231/9/202348周口师范学院计算机科学系02级教育专业例10:查询计算机系、信息系学生的姓名、系别和年龄。SELECT Sname,Sdept,Sage FROM Student WHERE Sdept
31、IN(CS,IS);例11:查询不是计算机系、也不是信息系的学生的姓名、系别和年龄。SELECT Sname,Sdept,Sage FROM Student WHERE Sdept NOTIN(CS,IS);1/9/202349周口师范学院计算机科学系02级教育专业谓词LIKE可以用来进行字符串的匹配。其一般语法格式如下:NOT LIKE ESCAPE 其含义是查找指定的属性列值与相匹配的元组。可以是一个完整的字符串,也可以含有通配符和。其中:(百分号)代表任意长度(可以为)的字符串,如:a%b表示以a开头,以b结尾的任意长度的字符串。_(下划线)代表任意单个字符。a_b表示以a开头,以b结尾
32、长度为的任意字符串。1/9/202350周口师范学院计算机科学系02级教育专业例12:查询所有姓“王”的学生信息。SELECT*FROM Student WHERE Sname like 王%;例13:查询名字中第二个字为“阳”的学生姓名和学号。SELECT Sname,Sno FROM Student WHERE Sname like _ _阳%;如果用户要查询的字符串本身就含有%或_就要使用ESCAPE 对通配符进行转义1/9/202351周口师范学院计算机科学系02级教育专业例14:查询DB_Design课程的课程号和学分SELECT Cno,Ccredit FROM CourseWHE
33、RE Cname like DB_Design ESCAPE;其中:ESCAPE 短语表示为换码字符,这样匹配串中紧跟在后面的字符“_”不再具有通配符的含义,转义为普通的“_”字符。例15:查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况SELECT FROM CourseWHERE Cname like DB_%i_ _ ESCAPE;1/9/202352周口师范学院计算机科学系02级教育专业例16 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。SELECT Sno,Cno FROM SCWHERE Grade IS NUL
34、L例17查询所有有成绩的学生的学号和相应的课程号。SELECT Sno,Cno FROM SCWHERE Grade IS NOT NULL1/9/202353周口师范学院计算机科学系02级教育专业多重条件查询逻辑运算符AND和OR可用来联结多个查询条件,AND优先级高于OR,但用户可用括号改变优先级。例18 查询计算机系年龄在20岁以下的学生姓名SELECT SnameFROM Student WHERE Sdept=CSAND Sage20;例19:查询计算机系、信息系学生的姓名、系别和年龄。SELECT Sname,Sdept,Sage FROM Student WHERE Sdept=
35、CS OR Sdept=IS;1/9/202354周口师范学院计算机科学系02级教育专业三、对查询结果排序用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,缺省值为升序。例19 查询选修了号课程的学号及其成绩,查询结果按分数的降序排列。SELECT Sno,GradeFROM SC WHERE Cno=3 ORDER BY Grade DESC;对于空值,若按升序,含空值的元组将最后显示,若按降序排,空值的元组将最先显示。1/9/202355周口师范学院计算机科学系02级教育专业例19 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中
36、的学生按年龄降序排列。SELECT FROM Student ORDER BY Sdept,Sage DESC;1/9/202356周口师范学院计算机科学系02级教育专业四、查询中集函数的使用说明:DISTINCT:取消列中的重复值ALL:为默认状态,表示不取消重复值。函数名称函数名称函数功能函数功能COUNT(DISTINCT|ALL*)COUNT(DISTINCT|ALL*)统计元组个数统计元组个数COUNT(DISTINCT|ALLCOUNT(DISTINCT|ALL)统计一列重值的个数统计一列重值的个数SUM(DISTINCT|ALLSUM(DISTINCT|ALL)计算数值型一列值的
37、总和计算数值型一列值的总和AVG(DISTINCT|ALLAVG(DISTINCT|ALL)求一列值的平均值求一列值的平均值MAX(DISTINCT|ALLMAX(DISTINCT|ALL)求一列值的最大值求一列值的最大值MIN(DISTINCT|ALLMIN(DISTINCT|ALL)求一列值的最小值求一列值的最小值1/9/202357周口师范学院计算机科学系02级教育专业例2 20:查询学生总人数。SELECT COUNT(*)FROM Student;例21:计算95001学生的平均成绩。SELECT AVG(Grade)FROM SC WHERE Sno=95001;1/9/20235
38、8周口师范学院计算机科学系02级教育专业 5查询结果的分组与排序GROUP BY子句将查询结果表按某一列或多列值分组,值相等的为一组。分组的目的是为了细化集函数的作用对象,如果未对查询结果分组,集函数将作用于整个查询结果。分组后集函数将作用在每一个组上,即每一组都有一个函数值。1/9/202359周口师范学院计算机科学系02级教育专业例22:查询选修了2门以上课程的学生学号,并且查询结果按照升序排列。SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)2 ORDER BY Sno ASC;WHERE与HAVING的区别在于作用的对象不同。WHERE子句
39、作用于基本表或视图,从中选择满足条件的记录;HAVING短语作用于分组,从中选出满足条件的组。1/9/202360周口师范学院计算机科学系02级教育专业3.3.2 连接查询 前面的查询都是针对一个表进行的。若一个查询同时涉及两个以上的表,则称之为连接查询,连接查询是关系数据库中最主要的查询,包括等值连接、自然连接、非等值连接查询、自身连接查询、外连接查询和复合条件连接查询。1/9/202361周口师范学院计算机科学系02级教育专业从概念上讲,DBMS执行连接操作的过程是:首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,
40、形成结果表中一个元组。表2全部查找完后,再找表1中第2个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第2个元组与该元组拼接起来,形成结果表中一个元组。重复上述操作,直到表1中的全部元组都处理完毕为止。1/9/202362周口师范学院计算机科学系02级教育专业一、等值与非等值连接。连接查询中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为:.其中主要有:=,=,=,!=。当连接运算符为 =时,称为等值连接,使用其它运算符称为非等值连接。连接谓词中的称为连接字段,连接条件中的各个连接字段类型必须是可比的,但不必是相同的。Eg.1/9/202363周口师范学院
41、计算机科学系02级教育专业在本例中,SELECT子句与WHERE子句中的属性名前都加上了表名前缀,这是为了避免混淆。如果属性名在参加连接的各表中是唯一的,则可以省略表名前缀。连接运算中有两种特殊情况,一种为自然连接,另一种为广义笛卡尔积(连接)。广义笛卡尔积是不带连接谓词的连接。两个表的广义笛卡尔积即是两表中元组的交叉乘积,其连接的结果会产生一些没有意义的元组,所以这种运算实际很少使用。若在等值连接中把目标列中重复的属性列去掉则为自然连接。1/9/202364周口师范学院计算机科学系02级教育专业二、自身连接 连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。
42、在通常的连接操作中,只有满足连接条件的元组才能作为结果输出。1/9/202365周口师范学院计算机科学系02级教育专业三、外连接 外连接的表示方法为,在连接谓词的某一边加符号*(有的数据库系统中用+)。外连接就好象为符号*所在边的表增加一个“万能的”行,这个行全部由空值组成。它可以和另一边的表中所有不满足条件的元组进行连接(从而使得另一个表在连接的过程中不会有元组丢失)。如果外连接符出现在连接条件的右边,称其为右外连接,如果外连接符出现在连接条件的左边,则称其为左外连接。1/9/202366周口师范学院计算机科学系02级教育专业四、复合条件的连接 上面各个连接查询中,WHERE子句中只有一个条
43、件,即连接谓词。WHERE子句中可以有多个连接条件,称为复合条件连接。连接操作除了可以是两表连接,一个表与其自身连接外,还可以是两个以上的表进行连接,后者称为多表连接。1/9/202367周口师范学院计算机科学系02级教育专业例23 查询每个学生及其所选课程的情况 Select Student.*,SC.*From Student,SC Where Student.Sno =SC.Sno;例24 查询每个学生及其所选课程的情况(用自然连接)Select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade From Student,SC Where Stude
44、nt.Sno =SC.Sno;例25 查询所有比李勇年龄大的学生姓名、年龄 Select X.Sname,X.Sage From Student X,Student Y Where X.Sage Y.Sage And Y.Sname=李勇结果结果结果结果1/9/202368周口师范学院计算机科学系02级教育专业Student.SnoSnameSsexSageSdept95001李勇男20CS95001李勇男20CS95001李勇男20CS95002刘晨女19IS95002刘晨女19ISSC.SnoCnoGrade9500119295001285950013889500229095002380该
45、查询的执行结果:该查询的执行结果:1/9/202369周口师范学院计算机科学系02级教育专业Student.SnoSnameSsexSageSdept95001李勇男20CS95001李勇男20CS95001李勇男20CS95002刘晨女19IS95002刘晨女19ISCnoGrade192285388290380该查询的执行结果:该查询的执行结果:1/9/202370周口师范学院计算机科学系02级教育专业例26 查询每一门课的间接先修课(即先修课的先修课)。Select FIRST.Cno,SECOND.Cpno From Course FIRST,Course SECOND Where F
46、IRST.Cpno=SECOND.Cno;例27 查询所有学生的学号、姓名、选修的课程和成绩Select Student.Sno,Sname,Cname,Grade From Student,SC,Course Where Student.Sno=SC.Sno(+)And SC.Cno=Course.Cno(+)1/9/202371周口师范学院计算机科学系02级教育专业例28 查询选修2号课程且成绩在90分以上的所有学生。SELECT Student.Sno,Sname FROM Student,SC WHERE Student.Sno=SC.Sno AND SC.Cno=2 AND SC.G
47、rade90;1/9/202372周口师范学院计算机科学系02级教育专业例29 查询每个学生的学号、姓名、选修的课程名及成绩。SELECT Student.Sno,Sname,Cname,Grade FROM Student,SC,Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;1/9/202373周口师范学院计算机科学系02级教育专业Student.SnoSnameSsexSageSdept95001李勇男20CS95001李勇男20CS95001李勇男20CS95002刘晨女19IS95002刘晨女19ISSC.SnoCnoGra
48、de9500119295001285950013889500229095002380该查询的执行结果:该查询的执行结果:95003王敏女18MA95004张立男19IS1/9/202374周口师范学院计算机科学系02级教育专业1/9/202375周口师范学院计算机科学系02级教育专业3.3.3嵌套查询在SQL语言中,一个SELECT-FROM-WHERE 称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。上层的查询块称为外层查询或父查询外层查询或父查询,下层查询称为内层查询或子查询内层查询或子查询。外层查询利用子查询来获取检索条件的条件
49、值,并根据这个条件值确定外层查询的结果集合。SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询,通过子查询,可以利用一系列简单查询来构造一个复杂查询。子查询中的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序。1/9/202376周口师范学院计算机科学系02级教育专业嵌套查询一般的求解方法是由里向外处理,即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。嵌套查询使我们可以用多个简单查询构成复杂的查询,从而增强SQL的查询能力。以层层嵌套的方式来构造程序正是SQL(Structured Query Language
50、)中“结构化”的含义所在。1/9/202377周口师范学院计算机科学系02级教育专业一、带有IN谓词的子查询在嵌套查询中,子查询的结果往往是一个集合,所以谓词IN是嵌套查询中最经常使用的谓词。例30 查询与刘晨在同一个系学习的学生。Select Sno,Sname,Sdept From Student Where Sdept IN (Select Sdept From Student Where Sname=刘晨);1/9/202378周口师范学院计算机科学系02级教育专业本例中的查询也可以用自身连接来完成:SELECT S1.Sno,S1.Sname,S1.SdeptFROM Student