1 / 103

第 5 章 关系数据库的结构化查询语言 SQL

第 5 章 关系数据库的结构化查询语言 SQL. 本章主要内容.   本章介绍关系数据库标准语言 SQL 。主要内容包括:数据定义、数据操纵、数据控制和数据约束等。 (1)SQL 数据库的体系结构 , SQL 的组成。 (2)SQL 的数据定义: SQL 模式、基本表和索引的创建和撤销。 (3)SQL 的数据查询 : SELECT 语句的句法, SELECT 语句的几种形式及各种限定,基本表的联接操作。 (4)SQL 的数据更新: 插入、删除和修改语句。 (5) 视图的创建和撤消 ,对视图更新操作的限制。 (6) 嵌入式 SQL:

yovela
Download Presentation

第 5 章 关系数据库的结构化查询语言 SQL

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第5章 关系数据库的结构化查询语言SQL

  2. 本章主要内容   本章介绍关系数据库标准语言SQL。主要内容包括:数据定义、数据操纵、数据控制和数据约束等。 (1)SQL数据库的体系结构,SQL的组成。 (2)SQL的数据定义:SQL模式、基本表和索引的创建和撤销。 (3)SQL的数据查询: SELECT语句的句法,SELECT语句的几种形式及各种限定,基本表的联接操作。 (4)SQL的数据更新:插入、删除和修改语句。 (5)视图的创建和撤消,对视图更新操作的限制。 (6)嵌入式SQL: 预处理方式,使用规定,使用技术,卷游标,动态SQL语句。

  3. 关系数据库的结构化查询语言SQL 5.1 SQL概述 5.2 SQL的数据定义语言 5.3 SQL数据查询 5.4 SQL聚集函数(Aggregation) 5.5 SQL数据更新 5.6 SQL中的视图 5.7 嵌入式SQL 本章小结

  4. 5.1 SQL概述 1)SQL的发展历程 • SQL语言1974年由Boyce和Chamberlin提出,并首先在IBM公司研制的关系数据库系统System R上实现。 • 1986年10月,经美国国家标准局(ANSI)的数据库委员会批准了SQL作为关系数据库语言的美国标准,并公布了标准SQL文本。 • 1987年6月国际标准化组织(ISO)将其采纳为国际标准,称为“SQL86”。 • 相继出现了“SQL89”、“SQL2(SQL92)”、“SQL3”。

  5. SQL已成为关系数据库领域中的一个主流语言: • 首先,各个数据库产品厂家纷纷推出了自己的支持SQL的软件或与SQL接口的软件。 • 其次,SQL在数据库以外的其他领域也受到了重视。 不少软件产品将SQL的数据检索功能与面向对象技术、图形技术、软件工程工具、软件开发工具、人工智能语言等相结合,开发出功能更强的软件产品。

  6. 2)SQL数据库的体系结构 用户1 用户2 用户3 用户4 SQL用户 外模式 视图V2 视图V1 基本表B1 基本表B4 基本表B2 基本表B3 模式 存储文件S2 存储文件S3 存储文件S4 存储文件S1 内模式

  7. SQL数据库的体系结构的特征: • 一个SQL模式是表和约束的集合。 • 一个表(TABLE)是行的集合。每行是列的序列,每列对应一个数据项。 • 一个表可以是一个基本表,也可以是一个视图。 • 一个基本表可以跨一个或多个存储文件,一个存储文件也可存储一个或多个基本表。 • 用户可以用SQL语句对视图和基本表进行查询等操作。 • SQL用户可以是应用程序,也可以是终端用户。

  8. 3)SQL的组成 (1)数据定义语言(Data Definition Language,简称DDL) 用于定义SQL模式、基本表、视图和索引。 (2)查询语言(Query Language,简称QL) 用于数据查询。 (3)数据操纵语言(Data Manipulation Language,简称DML) 用于数据的增、删、修改。 (4)数据控制语言(Data Control Language,简称DCL) 用于数据访问权限的控制。

  9. 5.2SQL的数据定义语言 5.2.1 数据类型 5.2.2 基本表模式的定义 5.2.3 基本表的修改和删除 5.2.4 域 5.2.5 索引的建立和删除

  10. 数据类型 说明符 备注 5.2.1 数据类型 定长字符串 CHAR(n) 按固定长度n存储字符串,如果实际字符串长度长小于n,后面填空格符;如果实际字符串长大于n,则报错。 变长字符串 VARCHAR(n) 按实际字符串长度存储,但字符长度不得超过n,则报错。 整数 INT 常见的长整数,字长32位 短整数 SMALLINT 字长16位 十进制数 DECIMAL(n,d) n为十进制数总位数(不包括小数点),d为小数据点后的十进制位数 浮点数 FLOAT 一般指双精度浮点数,即字长64位 定长位串 BIT(n) 二进制位串,长度为n,n的缺省值为1 变长位串 BITVARING(n) 按实际二进制位串存储,但最长不得超过n位,否则报错 日期 DATE 格式为“yyyymmdd”, yyyy表示年份,范围为0001~9999;mm表示月份,范围为1~12;dd表示日,范围为1~31。 时间 TIME 格式为“hhmmss”,hh表示小时,范围为0~24;mm为分钟,ss表示秒,范围都是0~59。 时标 TIMESTAMP 格式为“yyyymmddhhmmssnnnnnn”,其中“nnnnnn”表示微秒,范围为0~99999,其他符号的意义同上。

  11. 5.2.2 数据表模式的定义 1)定义数据库的语句格式为: CREATE DATABASE database_name [ ON ( NAME =file_name , FILENAME ='os_file_name ' [ , SIZE =size ]      [ , MAXSIZE = { max_size | UNLIMITED } ] [ , FILEGROWTH =growth_increment ] )] [LOG ON ( NAME = logical_file_name ,     FILENAME ='os_file_name ' [ , SIZE =size ] [ , MAXSIZE = { max_size | UNLIMITED } ]     [ , FILEGROWTH =growth_increment ] )]

  12. 事例 CREATE DATABASE studb ON ( NAME = 'studb_dat', FILENAME = 'd:\studb.mdf' , SIZE = 4, MAXSIZE = 10, FILEGROWTH = 1) LOG ON ( NAME = 'studb_log', FILENAME = 'd:\studb_log.LDF' , SIZE = 1, FILEGROWTH = 10%);

  13. 2)基本表SQL定义语句格式 定义基本表的语句格式为: CREATE TABLE<表名>( <属性名1 > <类型1>[NOT NULL] [UNIQUE] [,<属性名2><类型2] [NOT NULL] [UNIQUE] ]…) [其他参数]; 例5-1:学生成绩数据库含有三张表: 学生关系:S(SNO,SNAME,SEX, AGE, DNAME) 课程关系:C(CNO, CNAME, CREDIT, PRE_CNO) 选课关系:SC(SNO, CNO, SCORE) 可用下列SQL语句来实现:

  14. SQL事例 CREATE TABLE S ( SNO CHAR(6) PRIMARY KEY, SNAME CHAR(8) NOT NULL, AGE SMALLINT, SEX CHAR(1), DNAME VARCHAR(12)); CREATE TABLE C ( CNO CHAR(2) NOT NULL, CNAME VARCHAR(24) NOT NULL, CREDIT SMALLINT, PRE_CNO CHAR(2), PRIMARY KEY(CNO)); CREATE TABLE SC ( SNO CHAR(6) NOT NULL, CNO CHAR(2) NOT NULL, SCORE SMALLINT, PRIMARY KEY(SNO,CNO), FOREIGN KEY(SNO) REFERENCES S ON DELETE CASCADE, FOREIGN KEY(CNO) REFERENCES C ON DELETE NO ACTION);

  15. 3)主关键字定义 方法1:一个关系的主关键字由一个或几个属性构成,在CREATE TABLE中使用保留字PRIMARY KEY声明主关键字: (1)在列出关系模式的属性时,在属性及其类型后加上保留字PRIMARY KEY,表示该属性是主关键字; (2)在列出关系模式的所有属性后,再附加一个声明: PRIMARY KEY(<属性1>[,<属性2>…]) 如果关键字由多个属性构成,则必须使用方法(2)。

  16. SQL事例 CREATE TABLE S ( SNO CHAR(6) PRIMARY KEY, /*第一种方式*/ SNAME CHAR(8) NOT NULL, AGE SMALLINT, SEX CHAR(1), DNAME VARCHAR(12)); CREATE TABLE C ( CNO CHAR(2) NOT NULL, CNAME VARCHAR(24) NOT NULL, CREDIT SMALLINT, PRE_CNO CHAR(2), PRIMARY KEY(CNO)); /*第二种方式*/ CREATE TABLE SC ( SNO CHAR(6) NOT NULL, CNO CHAR(2) NOT NULL, SCORE SMALLINT, PRIMARY KEY(SNO,CNO),/*第二种方式*/ FOREIGN KEY(SNO) REFERENCES S ON DELETE CASCADE, FOREIGN KEY(CNO) REFERENCES C ON DELETE RESTRICT);

  17. 主关键字定义 方法2:使用保留字UNIQUE来说明关键字。 它可以出现在PRIMARY KEY出现的任何地方,可以在同一个关系模式中出现多次。 例如,在不出现同名同姓的情况下也可以将上面的定义改写为: CREATE TABLE S ( SNO CHAR(6) UNIQUE, SNAME CHAR(8) UNIQUE, SEX CHAR(1), AGE SMALLINT, DNAME VARCHAR(12));

  18. 4)外部关键字的定义 在SQL中,有两种方法用于说明一个外部关键字:   方法1:在表的属性名和类型后面直接用"REFERENCES"说明它参照了某个表的某些属性(必须是主关键字),其格式为: REFERENCES <表名>(<属性>) 这种方法主要在外部关键字只有一个属性时可以使用。 方法2:在CREATE TABLE语句的属性列表后面增加一个或几个外部关键字说明,其格式为: FOREIGN KEY <属性> REFERENCES <表名>(<属性>) 其中,第一个“属性”是外部关键字,第二个“属性”是被参照的属性。 CREATE TABLE SC ( SNO CHAR(6) NOT NULL, CNO CHAR(2) NOT NULL, SCORE SMALLINT, PRIMARY KEY(SNO,CNO), FOREIGN KEY(SNO) REFERENCES S ON DELETE CASCADE, FOREIGN KEY(CNO) REFERENCES C ON DELETE RESTRICT);

  19. 基本表定义格式图示

  20. 5.2.3 基本表的修改和删除 1)增加新的属性 ALTER TABLE [<表的创建者名.>] <表名> ADD<属性名><类型>; 例如:在表S中增加属性“BIRTHDATE”, “HOSTADDR”和“COMMADDR”: ALTER TABLE S ADD BIRTFIDATE DATETIME; ALTER TABLE S ADD HOSTADDR VARCHAR(32); ALTER TABLE S ADD COMMADDR VARCHAR(32);

  21. 2)删除原有属性的语句为 ALTER TABLE <表名> DROP <属性名> [CASCADE| RESTRICT]; 例如:在表S中删除“AGE”: ALTER TABLE S DROP AGE; SQL SERVER 2000: ALTER TABLE S DROP column AGE; 3)基本表的删除 在SQL中删除一个无用表的操作是非常简单的,其语句格式为: DROP TABLE <表名>;

  22. 主键修改 4)补充定义主键 由于SQL并不要求每个表都定义主键,在需要时可以通过补充定义主键命令来定义主键。 ALTER TABLE <表名> ADD PRIMARY KEY(<属性名表>); SQL SERVER 2000: ALTER TABLE <表名> ADD CONSTRAINT constraint_name PRIMARY KEY(<属性名表>); 5)撤销主键定义 利用下列的主键撤销命令可以暂时撤销主键定义: ALTER TABLE <表名> DROP PRIMARY KEY; SQL SERVER 2000: ALTER TABLE <表名> DROP CONSTRAINT constraint_name

  23. 外键修改 6)补充定义外键 ALTER TABLE <表名> ADD FOREIGN KEY <属性> REFERENCES <表名>(<属性>) [ON DELETE { RESTRICT | CASCADE | SET NULL}]; 7)撤消外键定义 ALTER TABLE <表名> DROP FOREIGN KEY <外键名>

  24. 5.2.4 域 • 定义一个域的方法是: CREATE DOMAIN<域名> AS <数据类型> ; • 通过已定义域名来说明一个属性类型,其格式是: <属性名1>[,<属性名2>,…]<域名>; 例如:为表S的HOSTADDR和COMMADDR定义一个域ADDRDOMAIN: CREATE DOMAIN ADDRDOMAIN AS VARCHAR(36) DEFAULT 'unknow'; 用域“ADDRDOMAIN”来说明属性“HOSTADDR”和“COMMADDR”的类型。 HOSTADDR,COMMADDR ADDRDOMAIN; • 删除一个域定义的语句是: DROP DOMAIN <域名>;

  25. 5.2.5 索引的建立和删除 • 建立索引的语句格式为: CREATE [UNIQUE] INDEX <索引名> ON 基本表名(<属性名1>[ASC|DESC] [,<属性名2>[ ASC|DESC]…]); 例如,对表S建立以下索引 CREATE UNIQUE INDEX SNO_INDEX ON S (SNO); CREATE UNIQUE INDEX SNAME_ADDR_INDEX ON S (SNAME ASC,HOSTADDR DESC); • 删除索引的语句格式: DROP INDEX <索引名>;

  26. 5.3 SQL数据查询 5.3.1 ALPHA关系演算语言 5.3.2 SQL查询语句格式 5.3.3 简单查询 5.3.4 复杂查询

  27. 5.3.1 ALPHA关系演算语言 语名的基本格式是: 操作语句 工作空间名(表达式):操作条件 (1)简单检索 例 查询所有被选修课程的课程号。 GETW(SC.SNO) 例 查询所有学生的数据。 GETW(STUDENT) (2)限定的检索 例 查询计算机系中年龄小于20岁的学生的学号和年龄。 GETW(STUDENT.SNO,STUDENT.AGE): STUDENT.DNAME='计算机' ∧ STUDENT.AGE<20

  28. ALPHA关系演算语言 (3)带排序的检索 例 查询计算机系学生的学号、年龄,并按降序排序。 GET W(STUDENT.SNO,STUDENT.AGE): STUDENT.DNAME='计算机' DOWN STUDENT.AGE (4)带定额的检索 例 取出一个计算机系学生的学号。 GET W(1)(STUDENT.SNO):STUDENT.DNAME='计算机' 所谓带定额的检索是指检索出指定个数的元组,方法是在W后括号中加上定额数量。 排序和定额可以一起使用。 例 查询计算机系年龄最大的3个学生的学号及年龄。 GETW(3)(STUDENT.SNO,STUDENT.AGE): STUDENT.DNAME='计算机' DOWN STUDENT.AGE

  29. ALPHA关系演算语言 (5)用元组变量的检索 因为元组变量是在某一关系范围内变化的,所以元组变量又称为范围变量。 元组变量主要有两个方面的用途: ① 简化关系名。 ②操作条件中使用量词时必须用元组变量。 例 查询计算机系学生的姓名。 RANGEStudentX GET W(X.SNAME):X.DNAME='计算机' 这里元组变量X的作用是简化关系名Student。

  30. (6)用存在量词的检索 例 查询选修C2课程的学生姓名。 RANGESCX GET W(STUDENT.SNAME): 存在X(X.SNO=Student.SNO ∧X.CNO='C2') 例 查询选修了其直接先行课程为C2课程的学生学号。 RANGECourseCX GET W(SC.SNO): 存在CX(CX.SNO=SC.SNO ∧CX.PRE_CNO='C2') 例 查询至少选修一门其先行课程为C1课程的学生姓名。 RANGECourseCX SCSCX GET W(Student.SNAME):存在SCX(SCX.SNO=Student.SNO∧ 存在CX(CX.CNO=SC.CNO∧CX.PRE_CNO='C1')) 本例中的元组关系演算公式可以变换为前束范式的形式: GET W(Student.SNAME):存在SCX存在CX(SCX.SNO=Student.SNO∧ CX.CNO=SC.CNO∧CX.PRE_CNO='C1')

  31. (7)带有多个关系的表达式的检索 上面所举的各个例子中,虽然查询时可能会涉及多个关系,即公式中可以涉及多个关系,但查询都只在一个关系中,即表达式中只有一个关系。表达式中可以有多个关系的。 例 查询成绩为90分以上的学生姓名和课程名。 本查询所要求的结果学生姓名和课程名分别在Student和Course两个关系中。 RANGESCSCX GET W(Student.SNAME,Course.CNAME): 存在SCX(SCX.SCORE≥90∧ SCX.SNO= Student.SNO∧Course.CNO= SCX.CNO)

  32. (8)用全称量词的检索 例 查询没有选修C1课程的学生姓名。 本查询所要求的结果学生姓名和课程名分别在Student和Course两个关系中。 RANGECourseCX GET W(Student.SNAME): 任意SCX(SCX.SNO≠Student.SNO∨SCX.CNO≠'C1') 本例实际上可以用存在量词来表示: GET W(Student.SNAME): →存在SCX(SCX.SNO=Student.SNO∧SCX.CNO='C1')

  33. (9)用两种量词的检索 例 查询了选修全部课程的学生姓名。 RANGECourseCX SC SCX GET W(Student.SNAME):任意 CX 存在 SCX( SCX.SNO=Student.SNO∧SCX.CNO=CX.CNO) (10)用蕴函的检索 例 查询至少选修了学生S1所选课程的学生的学号。 RANGECourseCX SC SCX SC SCY GET W(Student.SNO): 任意 CX(存在 SCX(SCX.SNO='S1'∧SCX.CNO=CX.CNO) =>存在 SCY(SCY.SNO=Student.SNO∧SCY.CNO=CX.CNO))

  34. (11)集函数 提供了COUNT、TOTAL、MAX、MIN、AVG等集函数。 例 查询学生所在系的数目 GETW(COUNT(Student.DNAME)) 例 查询计算机系学生的平均年龄 GETW(AVG(Student.AGE):Student.DNAME='计算机')

  35. 5.3.2 SQL查询语句格式 关系代数 查询语句的基本部分: SELECT <属性列表> FROM <基本表>(或视图) [WHERE <条件表达式>]; 其SQL语句为: SELECT A1,…,An FROM R1,…,Rm WHERE F

  36. 条件表达式F 条件表达式F中可使用下列运算符: • 算术比较运算符:<、<=、>、>=、=、<>或!=。 • 逻辑运算符:AND、OR、NOT。 • 集合运算符:IN、NOT IN。 • 谓词:EXISTS(存在量词)、ALL、SOME、UNIQUE。 • 聚合函数:AVG、MIN、MAX、SUM、COUNT。 • F中运算对象还可以是另一个SELECT语句,即SELECT语句可以嵌套。

  37. 5.3.3简单查询 最简单的SQL查询只涉及到一个关系,类似于关系代数中的选择运算。 例如:关系代数中的选择运算σDNAME=‘计算机’(S)的SQL查询语句如下例5.5。 例5.5:在表S中找出计算机系学生的学号、姓名等信息。 SELECT SNO,SNAME, AGE, SEX,DNAME FROM S WHERE DNAME='计算机';

  38. 例5.5 查询结果 SNO SNO SNAME SNAME AGE AGE SEX SEX DNAME DNAME S1 S1 程宏 程宏 19 19 M M 计算机 计算机 (a)学生关系表 (b)例5-5查询结果 S9 S3 刘莎莎 王敏 20 18 F F 电子 计算机 S4 李刚 20 M 自动化 S6 蒋天峰 19 M 电气 S9 王敏 20 F 计算机 用通配符“*”简化表示所有属性名 : 例5.6:求计算机系学生的详细信息。 SELECT * FROM S WHERE DNAME='计算机';

  39. 1)SQL中的投影 利用SELECT子句指定属性的功能完成关系代数中的投影运算。 例5.7:在表S中找出计算机系学生的学号和姓名。 SELECT SNO,SNAME FROM S WHERE DNAME=‘计算机’; • 在SELECT子句中增加保留字“AS”和相应的别名,使结果表中的某些属性名不同于基本表中的属性名,如: 例5.8:将例5-7结果表中的SNO换名为学号,将SNAME改为姓名: SELECT SNO AS 学号,SNAME AS 姓名 FROM S WHERE DNAME='计算机';

  40. SELECT子句中可以出现计算表达式,从而可以查询经过计算的值。SELECT子句中可以出现计算表达式,从而可以查询经过计算的值。 例5.9:求学生的学号和出生年份。 SELECT SNO,2009-AGE FROM S; • SELECT后面可以是属性名,也可以是属性名与常数组成的算术表达式,还可以是字符串。 例5.10:将例5.9改为: SELECT SNO, 'BIRTH_ YEAR:',2009-AGE FROM S;

  41. 2) SQL中的选择运算 通过在WHERE子句中指定相应的条件表达式,完成关系代数中的选择运算。 例5.11:列出表S中计算机系年龄小于20岁的学生的情况。 SELECT * FROM S WHERE DNAME='计算机' AND AGE<20;

  42. 3)字符串的比较 SQL还提供了根据模式匹配原理比较字符串的能力,其格式是: s LIKE p 当且仅当字符串s与模式p相匹配时,表达式s LIKE p的值才为真。 • 当p中含有%时,它可以与s中任何序列的0个或多个字符进行匹配; • 而当p中出现符号“_”时,它可以与s中任何一个字符匹配。 • p中的字符只与s中相应位置上的字符匹配 。 例5.12:在表S中找出其姓名中含有“李”的学生。 SELECT * FROM S WHERE SNAME LIKE‘%李%‘; 在我们MIS/ERP系统中大都是采用这种模式匹配功能来实现模糊查询的。

  43. SQL查询语句格式图示

  44. SQL中SELECT语句的格式 SELECT [DISTINCT] <属性列表> FROM <基本表>(或视图) [ WHERE <条件表达式>]; [ GROUP BY <分组属性列表> [HAVING <组合条件表达式>]] [ ORDER BY 排序属性列1[ASC|DESC],…] 整个SELECT语句的执行过程如下: (1) 读取FROM子句中基本表、视图的数据,执行笛卡儿积操作。 (2) 选取满足WHERE子句中给出的条件表达式的元组。 (3) 按GROUP子句中指定的属性列的值分组,同时提取满足HAVING子句中组条件表达式的那些元组。 (4)按SELECT子句中给出的属性列或列表达式求值输出。 (5) ORDER子句对输出的结果进行排序,按ASC升序排列或DESC降序排列。

  45. 5.3.4 复杂查询 1)SQL中的笛卡儿积和连接运算 例5.13:查询所有学生的情况以及他们选修课程的课程号和得分。 SELECT S.*,SC.CNO,SC.SCORE FROM S,SC WHERE S.SNO=SC.SNO; 其中,WHERE后面的条件称为连接条件或连接谓词。 例5.14:自然连接查询 SELECT S.SNO,S. SNAME,C.CNAME,SC.SCORE FROM S,C,SC WHERE S.SNO=SC.SNO AND C.CNO=SC.CNO;

  46.  (b)课程关系C (a)学生关系S S.SNO CNO SNO SNO CNAME CNO SNAME S.SNAME SCORE AGE C.CNAME CREDIT SEX PRE_CNO DNAME SC.SCORE S1 S1 C1 计算机基础 程宏 程宏 19 计算机基础 3 M 计算机 78 S1 C1 78 S3 S1 刘莎莎 程宏 18 C语言 F 电子 88 C2 C语言 3 C1 S1 C2 88 (c)选课关系SC S4 S1 李刚 程宏 20 电子学 M 自动化 76 C3 电子学 4 C1 S1 C3 76 S6 S1 蒋天峰 程宏 19 数据结构 M 电气 86 C4 数据结构 4 C2 (d)自然连接查询的结果表 S1 C4 86 S3 S9 王敏 刘莎莎 20 C语言 F 计算机 64 S3 C2 64 S3 刘莎莎 电子学 87 S3 C3 87 S4 李刚 电子学 79 S4 C3 79 S6 蒋天峰 计算机基础 88 S6 C1 88 S6 蒋天峰 电子学 68 S6 C3 68 S9 王敏 C语言 78 S9 C2 78 S9 王敏 数据结构 83 S9 C4 83

  47. 2)元组变量   表存在自身连接,即查询涉及同一个关系R的两个甚至更多个元组。 SQL采用的方法是在FROM子句中为R的每一个出现值指定一个别名(Alias),称之为元组变量(Tuple Variable),其格式是: FROM <表名> AS <别名>  然后在SELECT和WHERE子句中使用该别名指定属性。 例5.15:在表C中求每一门课程的间接先行课。 SELECT FIRST.CNO,SECOND.PRE_CNO FROM C AS FIRST,C AS SECOND WHERE FIRST. PRE_CNO=SECOND.CNO;

  48. 元组变量查询事例 CNO CNO CNO PRE_CNO PRE_CNO PRE_CNO C4 C1 C1 - C1 - (a)FIRST (b)SECOND (c)结果表 C2 C2 C1 C1 C3 C3 C1 C1 C4 C4 C2 C2  本例中的查询实际上是一种推理,即,若用谓词PC(x,y)表示y是x的先行课程,谓词PPC(x,z)表示z是x的间接先行课,则上述查询完成的推理可表示为:

  49. 3)SQL查询中的并、交、差运算 SQL提供了相应的运算符:UNION, INTERSECT, EXCEPT,分别对应于集合运算的∪、∩、-(并、交、差)。 (1)并运算的SQL查询语句 例5.16:求选修了课程C2或C4的学生的学号和姓名。 ( SELECT S.SNO,S.SNAME FROM S,SC WHERE S.SNO = SC.SNO AND CNO='C2') UNION ( SELECT S.SNO,S.SNAME FROM S,SC WHERE S.SNO = SC.SNO AND CNO='C4');

  50. 交、差运算SQL (2)交运算的SQL查询语句 例5.17:求选修了课程C2和C4的学生的学号和姓名。 ( SELECT S.SNO,S.SNAME FROM S,SC WHERE S.SNO=SC.SNO AND CNO='C2') INTERSECT ( SELECT S.SNO,S.SNAME FROM S,SC WHERE S.SNO=SC.SNO AND CNO='C4'); (3)差运算的SQL查询语句 例5.18:求选修了课程C2但没有选修课程C4的学生的学号和姓名。 ( SELECT S.SNO,S.SNAME FROM S,SC WHERE S.SNO=SC.SNO AND CNO='C2') EXCEPT ( SELECT S.SNO,S.SNAME FROM S,SC WHERE S.SNO=SC.SNO AND CNO='C4');

More Related