Download presentation
Presentation is loading. Please wait.
1
第三章 关系数据库标准语言SQL 3.1 SQL的特征 3.2 SQL的数据定义 3.3 SQL的数据查询 3.4 SQL的数据更新
本章小结
2
第三章 关系数据库标准语言SQL 3.5 SQL的数据控制 3.6 嵌入式 SQL 3.7 动态 SQL 3.8 ODBC与JDBC
本章小结
3
第三章 关系数据库语言SQL 3.1 SQL的特征 1. SQL的主要标准 SQL-86 SQL-89 SQL-92(SQL2)
4
SQL-86。SQL的第一个标准是1986年10月由美国国家标准化组织(ANSI)公布的。
SQL-89。ANSI以后通过对SQL-86的不断修改和完善,于1989年第二次公布了SQL标准,即SQL-89,该标准增强了完整性的语言特征。 SQL-92(SQL2)。1992年又公布了SQL-92标准,该标准增加了支持对远程数据库的访问,扩充了数据类型、操作类型、动态SQL等许多新的特征。 SQL-99(SQL3)。完成于1999年的SQL-99修订本具有更高级的特征。引入了支持对象-关系DBMS模型的SQL,扩展了对象、递归、触发等许多新的特征,支持用户自定义函数、自定义数据类型。
5
2. SQL的功能特点 功能: 数据定义 数据查询 数据操纵 数据控制
6
第三章 关系数据库语言SQL 综合统一 特点:
7
第三章 关系数据库语言SQL 高度非过程化 非关系数据模型的数据操纵语言是面向过程的语言,用其完成某项请求,必须指定存取路径。而用SQL语言进行数据操作,用户只需提出“做什么”,而不必指明“怎么做”,因此用户无需了解存取路径,存取路径的选择以及SQL语句的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高数据独立性。
8
第三章 关系数据库语言SQL 灵活的使用方式 SQL语言既是自含式语言,又是嵌入式语言。
作为自含式语言,它能够独立地用于联机交互的使用方式,用户可以在终端键盘上直接键入SQL命令对数据库进行操作。作为嵌入式语言,SQL语句能够嵌入到高级语言(例如C、COBOL、FORTRAN、PL/1)程序中,供程序员设计程序时使用。而在两种不同的使用方式下,SQL语言的语法结构基本上是一致的。这种以统一的语法结构提供两种不同的使用方式的作法,为用户提供了极大的灵活性与方便性。
9
第三章 关系数据库语言SQL 简洁、通用、功能强
SQL语言功能极强,设计巧妙,语言简洁,完成数据定义、数据操纵、数据控制的核心功能只用了9个动词,如表3-1所示。而且SQL语言语法简单,接近英语口语,因此容易学习,容易使用。 SQL功能 核心动词 数据查询 SELECT 数据定义 CREATE, DROP, ALTER 数据控制 INSERT, UPDATE, DELETE 数据操纵 GRANT, REVOKE
10
3.1 SQL的特征 3. SQL的基本组成 (1)SQL数据库层次结构 术语对照: 一般关系模型 SQL 外模式-----视图(VIEW)
模式-----基本表(TABLE) 内模式-----存储文件(索引) 元组 行(ROW) 属性 列(COLUMN) SQL 视图1 视图2 基本表1 基本表2 基本表3 存储文件1 存储文件2
11
3.1 SQL的特征 基本表是本身独立存在的表,在SQL中一个关系就对应一个表。一些基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中。 存储文件的逻辑结构组成了关系数据库的内模式。存储文件的物理文件结构是任意的。 视图是从基本表或其他视图中导出的表,它本身不独立存储在数据库中,也就是说数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中,因此视图是一个虚表。 用户可以用SQL语言对视图和基本表进行查询。在用户眼中,视图和基本表都是关系,而存储文件对用户是透明的。
12
3.1 SQL的特征 4. SQL的数据类型 预定义数据类型 构造数据类型 用户定义数据类型(UDT,User Defined Type)
数据定义语言(DDL) 数据操纵语言(DML) 数据控制语言(DCL) 嵌入与会话规则 (3)SQL的语句类型 SQL模式语句 SQL数据语句 SQL事务与控制语句 SQL连接、会话及诊断语句 4. SQL的数据类型 预定义数据类型 构造数据类型 用户定义数据类型(UDT,User Defined Type)
13
3.1 SQL的特征 5.SQL环境 (1)SQL模式与目录 SQL模式:基本表的集合。
定位基表的方式: <目录名>.<模式名>.<表名> (2)SQL环境 设置默认的目录和模式 设置用户身份
14
3.1 SQL的特征 (3)存储过程 存储过程是存储在SQL服务器上的预编译好的一组为了完成特定功能的SQL语句集。
通过指定存储过程的名字并给出参数来执行它。可分为两类: ◆ 系统存储过程:由系统自动创建,完成的功能主要是从系统表中获取信息。 ◆ 用户定义的存储过程:由用户为完成某一特定功能而编写的存储过程。 使用存储过程的好处: ◆ 可减少网络流量。 ◆ 增强代码的重用性和共享性。 ◆ 加快系统运行速度。 ◆ 保证数据安全性。
15
3.2 SQL的数据定义 1. SQL模式的定义与撤销 (1)SQL模式的定义
CREATE SCHEMA <模式名> AUTHRIZATION <用户名> [<CREATE DOMAIN子句>|<CREATE TABLE子句>|<CREATE VIEW >|…… ] 例;CREATE SCHEMA Teaching_db AUTHRIZATION Hang; (2)数据库模式的删除 DROP SCHEMA <模式名> {CASCADE | RESTRICT} CASCADE(级联式) : RESTRICT(约束式):
16
3.2 SQL的数据定义 2. 表的建立和删除 命令格式: ( sno CHAR(5) NOT NULL UNIQUE,
(1)表的建立 命令格式: CREATE TABLE <表名>(<列名><数据类型> [列级完整性约束条件] [,<列名> <数据类型> [列级完整性约束条件]...) [,<表级完整性约束条件>]; 例:CREATE TABLE Student ( sno CHAR(5) NOT NULL UNIQUE, sname CHAR(20) NOT NULL , sex CHAR(1), age INT , dept CHAR(15) ); 主码
17
3.2 SQL的数据定义 完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可定义在列级,也可以定义在表级。 注意:
例:定义P.76的三个表结构,并指定相应的数据完整性约束条件。 分析 Student表: 主码:sno 姓名:非空 性别:男、女两值 Course表: 主码:cno 课程名:非空 外码:pcno SC表: 主码:(sno,cno) 成绩:0—100 外码:sno,cno
18
3.2 SQL的数据定义 sname CHAR (8) NOT NULL, sex CHAR (2), age SMALLINT,
CREATE TABLE Student ( sno CHAR (5), sname CHAR (8) NOT NULL, sex CHAR (2), age SMALLINT, dept CHAR (20), PRIMARY KEY(sno), CHECK sex IN (‘男’,‘女’) ); 列级完整性约束条件 实体完整性约束条件 用户自定义完整性约束条件
19
3.2 SQL的数据定义 cname CHAR (10) NOT NULL, pcno CHAR (4), credit SMALLINT,
CREATE TABLE Course ( cno CHAR (4), cname CHAR (10) NOT NULL, pcno CHAR (4), credit SMALLINT, PRIMARY KEY (cno), FOREIGN KEY (pcno) REFERENCES Course(cno) ); 参照完整性约束条件
20
3.2 SQL的数据定义 cno CHAR (4) , grade SMALLINT, PRIMARY KEY (sno,cno),
CREATE TABLE SC ( sno CHAR (5), cno CHAR (4) , grade SMALLINT, PRIMARY KEY (sno,cno), FOREIGN KEY (sno)REFERENCES Student(sno), FOREIGN KEY (cno)REFERENCES Course(cno), CHECK ((grade IS NULL) OR (grade BETWEEN 0 AND 100)) );
21
3.2 SQL的数据定义 (2)表的删除 格式:DROP TABLE <表名> [CASCADE | RESTRICT]
例:DROP TABLE Student CASCADE;
22
3.2 SQL的数据定义 3.基本表的扩充和修改 一般格式为: ALTER TABLE <表名>[ADD <新列名><数据类型>[完整性约束]][DROP<完整性约束名><完整性约束名>] [MODIFY<列名> <数据类型><数据类型>]; 其中<表名>指定需要修改的基本表,ADD子句用于增加新列和新的完整性约束条件,DROP子句用于删除指定的完整性约束条件,MODIFY子句用于修改原有的列定义。 (1)在现存表中增加新列 格式:ALTER TABLE <表名> ADD (<列名> <数据类型>,… )
23
3.2 SQL的数据定义 (2)删除已存在的某个列 格式:ALTER TABLE <表名>
DROP <列名> [CASCADE | RESTRICT] 例:ALTER TABLE Student DROP addr; (3)修改原有列的类型 MODIFY <列名> <类型>; MODIFY place CHAR(8);
24
3.2 SQL的数据定义 (4)补充定义主码 格式:ALTER TABLE <表名>
ADD PRIMARY KEY (<列名表> ) (5)删除主码 格式:ALTER TABLE <表名> DROP PRIMARY KEY
25
3.2 SQL的数据定义 修改基本表实例 例 向Student表增加“入学时间”列,其数据类型为日期型
ALTER TABLE Student ADD Scome DATE; 例 将年龄的数据类型改为半字长整数 ALTER TABLE Student MODIFY Sage SMALLINT; 例 删除关于学号必须取唯一值的约束 ALTER TABLE Student DROP UNIQUE(Sno);
26
3.2 SQL的数据定义 4.索引的建立与删除 建立索引的目的:基本表上建立一个或多个索引,以提供多种存取路径,加快查找速度。 命令格式:
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名> (<列名><次序>[ [,<列名><次序>]]…); 次序: 升序(ASC,缺省) 降序 (DESC) UNIQUE: 每一个索引值只对应惟一的数据记录。 CLUSTER: 建立聚簇索引,即索引项的顺序与表中记录的物理顺序一致。
27
3.2 SQL的数据定义 注意:在一个基本表上最多只能建立一个聚簇索引。 经常更新的列不宜建立聚簇索引。 所建索引放何处?
例: ① 为Student表按学号升序建惟一聚簇索引。 ② 为SC表按学号升序和课程号降序建惟一索引。 ① CREATE UNIQUE CLUSTER INDEX Stno ON Student(Sno); ② CREATE UNIQUE INDEX Scno ON SC(Sno ,Cno DESC); 删除索引一般格式为: DROP INDEX<索引名>; 例: DROP INDEX Stno ; 删除索引时,系统会同时从数据字典中 删去有关该索引的描述。
28
将结果按<列名1>的值进行分组
3.3 SQL的数据查询 一般形式: SELECT <A> FROM <R> WHERE <F> GROUP BY <列名1> HAVING <条件表达式> ORDER BY <列名2> [ASC|DESC]; 查询目标 数据来源 选择元组的条件 将结果按<列名1>的值进行分组 满足条件的组才予输出 按<列名2>排序查询结果 基本语句含义: 根据WHERE中的F,从基表或视图R中找出满足条件的元组,再从中选出目标属性值形成结果表。
29
3.3 SQL的数据查询 如果有GROUP子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组为一个组,每个组产生结果表中的一条记录。通常在成组后再使用集函数。 如果GROUP子句带HAVING短语,则只有满足指定条件的组才予输出。 如果有ORDER子句,则结果表还要按<列名2>的值的升序或降序排序。
30
3.3 SQL的数据查询 其中:[…]:表示其中的成分为任选项。 <…>:表示其中的成分由用户具体给定。
|: 表示其中并列的成分只能择一。 查询目标: ALL:表示保留满足条件的所有元组(缺省)。 DISTINCT:表示去掉重复元组。 目标列:可以为属性名、表达式、通配符‘*’(表示所有属性列)。
31
3.3 SQL的数据查询-单表查询 学生-课程数据库: Student(sno,sname,sex,age,dept)
Course(cno,cname,pcno,credit) SC(sno,cno,grade) 单表查询 一、选择表中的列 例 :查询所有学生的姓名、学号、所在系。 目标A 来源R 条件F SELECT sname,sno,dept FROM Student (次序不同 ); sname sno dept ——————————— 王萧虎 信息院 ……
32
3.3 SQL的数据查询-单表查询 查询经过计算的值
SELECT子句的<目标列表达式>不仅可以是表中的属性列,也可以是有关表达式,即可以将查询出来的属性列经过一定的计算后列出结果。 例4 查全体学生的姓名及其出生年份 SELECT Sname, 2006-Sage FROM Student; 例5 查全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名 SELECT Sname, 'Year of Birth:', 1996-Sage, ISLOWER(Sdept) FROM Student;
33
3.3 SQL的数据查询-单表查询 别名 sname 2005-age Birthday ——————————— …… SELECT sno
例:查全体学生的姓名及其出生年份。 SELECT sname,2007-age AS FROM Student ; Birthday 条件F 别名 二、选择表中的行 1 消除取值重复的行 例:查考试成绩不及格的学号。 sname age ——————————— 王萧虎 …… Birthday SELECT sno FROM SC WHERE grade<60 ; DISTINCT
34
3.3 SQL的数据查询-单表查询 2. 查询满足条件的元组
查询满足指定条件的元组可以通过WHERE子句实现。WHERE子句常用的查询条件如下所示。 常用的查询条件: 查询条件 谓 词 比较 比较运算符 确定范围 BETWEEN AND, NOT BETWEEN AND 确定集合 IN, NOT IN 字符匹配 LIKE, NOT LIKE 空值 IS NULL, IS NOT NULL 多重条件 AND, OR
35
3.3 SQL的数据查询-单表查询 (1) 比较(=, <, >… ) 例 查计算机系全体学生的姓名
(1) 比较(=, <, >… ) 例 查计算机系全体学生的姓名 SELECT Sname FROM Student WHERE Sdept = 'CS'; 例 查所有年龄在20岁以下的学生姓名及其年龄 SELECT Sname, Sage FROM Student WHERE Sage <20; 或 WHERE NOT Sage>= 20;
36
3.3 SQL的数据查询-单表查询 (2)确定范围 (BETWEEN … AND … )
例: 查询选002号课程且成绩在80--90的学生号。 SELECT sno FROM SC WHERE sno=‘002’ AND grade BETWEEN 80 AND 90; 关系运算? (3)确定集合(IN) 例:查询信息院、数学系和计算机学院学生的姓名和性别。 SELECT sname,sex FROM Student WHERE dept IN ('信息院','数学系','计算机学院') ? 查询不是这三个系的学生的姓名和性别。 其他表示? NOT
37
3.3 SQL的数据查询-单表查询 (4)字符匹配---近似查询,模糊查询 NOT NOT
格式:[NOT] LIKE ’<匹配串>’ 含义:是查找指定的属性列值与<匹配串>相匹配的元组。 其中匹配串可含: %:代表任意长度(可为0)的字符串。 _:代表任意单个字符。 例: 查所有姓刘或姓王的学生姓名、学号和性别。 SELECT sname,sno,sex FROM Student WHERE sname LIKE ‘刘%’ OR sname LIKE ‘王%’ ; ? 查询所有非姓刘或非姓王的学生姓名、学号和性别。 NOT NOT
38
3.3 SQL的数据查询-单表查询 例 查姓“欧阳”且全名为三个汉字的学生的姓名
例 查姓“欧阳”且全名为三个汉字的学生的姓名 SELECT Sname FROM Student WHERE Sname LIKE ‘欧阳__'; 注意,由于一个汉字占两个字符的位置,所以匹配串欧阳后面需要跟2个_。 例 查名字中第二字为“阳”字的学生的姓名和学号 SELECT Sname, Sno FROM Student WHERE Sname LIKE '__阳%'; 注意:一个汉字要占两个字符的位置
39
3.3 SQL的数据查询-单表查询 格式2: LIKE ’<匹配串>’ ESCAPE ’<换码字符>’
若要查的串本身就含有%或_ ,则用ESCAPE ‘<换码字符>’对通配符进行转义。ESCAPE ’\’短语表示\为换码字符,这样匹配串中紧跟在\后面的字符”_”不再具有通配符的含义,而是取其本身含义,被转义为普通的”_”字符。 例:查“DB_”开头且倒数第2个字符为 i 的课程情况。 SELECT * FROM Course WHERE cname LIKE ‘DB\ _ %i_’ ESCAPE ’ \’;
40
3.3 SQL的数据查询-单表查询 & 查以”DB_”开头,且倒数第三个字符为i的课程的详细情况
SELECT * FROM Course WHERE Cname LIKE ’DB_%i__’ ESCAPE ’&’; 注意这里的匹配字符串’DB\_%i__’。第一个_前面有换码字符\,所以它被转义为普通的_字符。而%、第二个_和第三个_前面均没有换码字符\,所以它们仍作为通配符。 执行结果为: Cno Cname Ccredit DB_Design DB_Programming 2 13 DB_DBMS Design 4 &
41
3.3 SQL的数据查询-单表查询 (5) 涉及空值的查询
(5) 涉及空值的查询 例 某些学生选修某门课程后没有参加考试,所以有选课记录,但没有考试成绩,下面我们来查一下缺少成绩的学生的学号和相应的课程号 SELECT Sno, Cno FROM SC WHERE Grade IS NULL; 注意这里的‘IS’不能用等号(‘=’) 代替。 例 查所有有成绩的记录的学生学号和课程号 SELECT Sno, Cno FROM SC WHERE Grade IS NOT NULL;
42
3.3 SQL的数据查询-单表查询 Student表 SELECT sno, dept, age 三、对查询结果排序
例: 查询全体男学生的学号、系、年龄 结果按所在的系升序排列, 同一系中的学生按年龄降序排列。 Student表 条件 F 目标 A 来源 R 排序一 排序二 SELECT sno, dept, age FROM Student WHERE sex=‘男’ ORDER BY dept,age DESC; Orderby的排序键应该是 查询清单中的列名
43
3.3 SQL的数据查询-单表查询 四、使用集函数 无重复值 缺省值 COUNT([DISTINCT | ALL] * ) 统计元组个数
SUM([DISTINCT | ALL]<列名> ) 计算一数值型列值的总和 AVG([DISTINCT | ALL]<列名> ) 计算一数值型列值的平均值 MAX([DISTINCT | ALL]<列名> ) 求一列值的最大值 MIN([DISTINCT | ALL]<列名> ) 求一列值的最小值 无重复值 缺省值
44
3.3 SQL的数据查询-单表查询 例: 查询女学生的总人数和平均年龄。 SELECT COUNT(sno),AVG(age)
例: 查询女学生的总人数和平均年龄。 SELECT COUNT(sno),AVG(age) FROM Student WHERE sex=‘女’ 例: 查询选修001号课程并及格的学生的最高分数、最低分及总分。 SELECT MAX(grade),MIN(grade),SUM(grade) FROM SC WHERE cno=‘001’ and grade>=60
45
3.3 SQL的数据查询-单表查询 五、对查询结果分组: GROUP BY 子句 将查询结果表按某一(多)列值分组,值相等的为一组。
目的:细化集函数的作用对象。如果未对查询结果分组,集函数将作用于整个查询结果,即整个查询结果只有一个函数值。否则,集函数将作用于每一个组,即每一组都有一个函数值。 例 查询各个课程号与相应的选课人数 SELECT Cno, COUNT(Sno) FROM SC GROUP BY Cno;
46
3.3 SQL的数据查询-单表查询 该SELECT语句对SC表按Cno的取值进行分组,所有具有相同Cno值的元组为一组,然后对每一组作用集函数COUNT以求得该组的学生人数。 查询结果为: Cno COUNT(Sno) 1 22 2 34 3 44 4 33 5 48
47
3.3 SQL的数据查询-单表查询 SELECT sno,AVG( grade)
如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING短语指定筛选条件。 例:求每个学生(号)的平均成绩,并将其超过88分的输出。 SELECT sno,AVG( grade) FROM SC GROUP BY sno; WHERE ? HAVING AVG( grade) >88; HAVING短语:在各组中选择满足条件的小组。 WHERE子句 :在表中选择满足条件的元组。
48
3.3 SQL的数据查询-单表查询 HAVING子句的条件运算数之一 是一个集函数。 集函数在成组之前不计算,因此
不能用于WHERE子句, 一般将简单条件写入WHERE。 若HAVING子句无前导GROUPBY, 选择清单中不能含有非集函数列。
49
3.3 SQL的数据查询-单表查询 练习:查询至少选修4门课程的学生学号。 例:找出选课学生超过30人的课程的平均成绩及选课人数。
SELECT cno,AVG(grade),COUNT(*) AS st_number FROM SC GROUP BY sno HAVING st_number>=30
50
3.3 SQL的数据查询-单表查询 例:求学生关系中女生的每一年龄组(超过20人)有多少,要求查询结果按人数升序排列,人数相同时按年龄降序排列。 SELECT age,COUNT(sno) AS number FROM Student WHERE sex=‘女’ GROUP BY age HAVING number>20 ORDER BY number,age DESC
51
3.3 SQL的数据查询 3.3.3 嵌套查询 1. 子查询(嵌套查询) 查询块: SELECT <A>
嵌套查询 1. 子查询(嵌套查询) 查询块: SELECT <A> FROM <R> WHERE <F> 子查询(嵌套查询): 一个查询块嵌套在另一查询块的条件之中。 上层的查询块又称为外层查询或父查询或主查询,下层查询块又称为内层查询或子查询。
52
3.3 SQL的数据查询 子查询一般跟在IN、SOME(ANY)、ALL和EXIST等谓词后面。 SQL语言允许多层嵌套查询。
嵌套查询的求解方法是由里向外处理。即每个子查询在其上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。 嵌套查询使得可以用一系列简单查询构成复杂的查询,从而明显地增强了SQL的查询能力。以层层嵌套的方式来构造程序正是 SQL(Structurred Query Language)中“结构化”的含义所在。
53
3.3 SQL的数据查询 (1) 带有IN谓词的子查询
带有IN谓词的子查询是指父查询与子查询之间用IN进行连接,判断某个属性列值是否在子查询的结果中。 例:查询与“刘晨”在同一个系学习的学生的学号、姓名、系 ①确定“刘晨”所在系名 SELECT Sdept FROM Student WHERE Sname=‘刘晨’; ②查找所有在IS系学习的学生。 SELECT Sno, Sname, Sdept FROM Student WHERE Sdept='IS'; 子查询实现:将第一步查询嵌入到第二步查询中,用以构造第二步查询的条件。 WHERE Sdept IN (SELECT…)
54
3.3 SQL的数据查询 例:查询选修了数据库课程的学生号、成绩。 SELECT sno, grade FROM SC
WHERE cno IN ( SELECT cno FROM Course WHERE cname=‘数据库’); (2)带有比较运算符的子查询 例:找出年龄超过平均年龄的学生姓名。 SELECT sname FROM Student WHERE age > (SELECT AVG(age) FROM Student);
55
3.3 SQL的数据查询 例:查询有一门课程成绩在90分以上的学生的姓名。 (3)带SOME ( ANY)、ALL谓词的子查询
SELECT sname FROM Student WHERE sno = SOME ( SELECT DISTINCT sno FROM SC WHERE grade > 90); (3)带SOME ( ANY)、ALL谓词的子查询 >SOME 大于子查询结果中的某个值 <ALL 小于子查询结果中的所有值 注意:SOME、ALL必须与关系比较符同时使用。
56
3.3 SQL的数据查询 例:找出(平均)成绩最高的学生号。 SELECT sno FROM SC GROUP BY sno
HAVING AVG(grade) >= ALL (SELECT AVG(grade) FROM SC GROUP BY sno); SELECT sno FROM SC WHERE AVG(grade) >=ALL ( SELECT AVG(grade) FROM SC GROUP BY sno) ???
57
3.3 SQL的数据查询 例:查询其他系中比IS系任一学生年龄大的学生名单
SELECT Sname, Sage FROM Student WHERE Sage > (SELECT MAX(Sage) FROM Student WHERE Sdept='IS') AND Sdept <> 'IS'
58
3.3 SQL的数据查询 2. 条件连接查询 SELECT Student. sno,sname,sex,age, 连接条件的一般格式为:
[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2> 当连接运算符为=时,称为等值连接。 例: 查询每个学生的情况及其选课成绩。 SELECT Student. sno,sname,sex,age, dept,cno,grade FROM Student,SC WHERE Student. sno=SC. sno ;
59
3.3 SQL的数据查询 例:找出系为信息系,选课成绩为90分以上的学生的姓名、课号和成绩。 SELECT sname,cno,grade
FROM Student,SC WHERE Student.sno = SC.sno AND dept =‘信息系’ AND grade>=90;
60
3.3 SQL的数据查询 例:查询选修了数据库的学生号、成绩 学分 ? SELECT sno, grade FROM SC
WHERE cno IN ( SELECT cno FROM Course WHERE cname=‘数据库’); 学分 ? 子查询 = 连接 查询 SELECT sno, grade FROM SC,Course WHERE SC. cno = Course . cno AND cname=‘数据库’ ; , Ccredit
61
3.3 SQL的数据查询 例:按平均成绩的降序给出所有课程都及格的学生(号、名)及其平均成绩,其中成绩统计时不包括008号考查课。
SELECT Student.sno,sname,AVG(grade) AS avg_g FROM Student,SC WHERE Student.sno=SC.sno AND cno<>’008’ GROUP BY sno HAVING MIN(grade)>=60 ORDER BY avg_g DESC ;
62
3.3 SQL的数据查询 3.自身连接查询 其他方法? 例:找出年龄比“王迎”同学大的同学的姓名及年龄。
SELECT s1.sname,s1.age FROM S AS s1,S AS s2 WHERE s1.age > s2.age AND s2.sname =‘王迎’; 练习:查询每一门课的间接先修课(即先修课的先修课)。 SELECT FIRST.cno,SECOND.pcno FROM Course FIRST,Course SECOND WHERE FIRST.pcno=SECOND.cno;
63
3.3 SQL的数据查询 4. FROM子句中的子查询 在FROM子句中可以使用子查询,其查询的结果表称为导出关系(Derived Relation)。 例:查出选课成绩在80分以上的女学生的姓名、课程名和成绩。 SELECT sname,cname, grade FROM (SELECT sname, cname, grade FROM Student,SC,Course WHERE Student.sno=SC.sno AND SC.cno=Course.cno AND sex='女') AS Temp (sname, cname,grade) WHERE grade >= 80 ; 导出关系
64
3.3 SQL的数据查询 5. 相关子查询 当一个子查询的判断条件涉及到一个来自外部查询的列时,称为相关子查询。
带存在谓词的子查询:只产生逻辑值 存在谓词EXISTS作用: 若内层查询结果非空,则外层的WHERE子句返回真值,否则返回假值。 求解相关子查询不能象求解不相关子查询那样,一次将子查询求解出来,然后求解父查询。相关子查询的内层查询由于与外层查询有关,因此必须反复求值。
65
3.3 SQL的数据查询 例:查询所有选修了1号课程的学生姓名。 SELECT sname FROM Student
WHERE EXISTS ( SELECT * FROM SC WHERE Sno=Student.Sno AND cno=’1’); 分析: 查询所有选修了1号课程的学生姓名涉及Student关系和SC关系,在Student关系中依次取每个元组的Sno值,用此Student.Sno值去检查SC关系,若SC中存在这样的元组:其SC.Sno值等于用来检查的Student.Sno值,并且其SC.Cno=‘1’,则取此Student.Sname送入结果关系。
66
3.3 SQL的数据查询 相关子查询的一般处理过程是: 首先取外层查询中Student表的第一个元组,根据它与内层查询相关的属性值(即Sno值)处理内层查询,若WHERE子句返回值为真(即内层查询结果非空),则取此元组放入结果表;然后再检查Student表的下一个元组;重复这一过程,直至Student表全部检查完毕为止。 其它方法?优点?
67
3.3 SQL的数据查询 SQL语言中没有全称量词∨(For all)。因此对于求所有的操作,必须利用谓词演算将一个带有全称量词的谓词转换为等价的带有存在量词的谓词。 SQL语言中也没有蕴涵(Implication)逻辑运算。因此也必须利用谓词演算将一个逻辑蕴函的谓词转换为等价的带有存在量词的谓词。
68
3.3 SQL的数据查询 SELECT sname 例: 查询选修了全部课程的学生姓名。 转换成:查询这样的学生,没有一门课程是他不选修的。
例: 查询选修了全部课程的学生姓名。 转换成:查询这样的学生,没有一门课程是他不选修的。 (x)P ≡ (x(P)) SELECT sname FROM Student WHERE NOT EXISTS ( SELECT * FROM Course FROM SC WHERE sno=Student. sno AND cno=Course. cno)); 每门课都没选 某学生选某课
69
3.3 SQL的数据查询 练习:查询至少选修了学号为200101的学生选修的全部课程的学生学号。
分析:查询这样的学生,凡是200101选修的课,他都选修了。换句话说,若有一个学号为x的学生,对所有的课程y,只要学号为200101的学生选修了课程y,则x也选修了y;那么就将他的学号选出来。它所表达的语义为:不存在这样的课程y,学生200101选修了y,而学生x没有选。
70
3.3 SQL的数据查询 SELECT sno FROM Student X WHERE NOT EXISTS (SELECT *
FROM SC Y WHERE Y.sno=‘200101’ AND NOT EXISTS FROM SC Z WHERE X.sno=Z.sno AND Y.cno=Z.cno))
71
3.3 SQL的数据查询 6.集合运算 (1)UNION (并) (2)INTERSECT (交) (3)EXCEPT (差)
例:求选修了001或002号而没有选003号课程的学生号。 (SELECT sno FROM SC WHERE cno =’001’ OR cno =’002’) EXCEPT FROM SC WHERE cno =‘003’);
72
3.3 SQL的数据查询 自然连接的定义? 3.3.4 自然连接与外连接 1.自然连接(NATURAL JOIN)
例:查系别为信息、课程成绩在90分以上的学生档案及其成绩情况。 SELECT * FROM Student NATURAL JOIN SC WHERE dept=‘信息’ AND grade >=90; 2. 外连接 左外连接。LEFT [OUTER] JOIN,保留左关系的所有元组。 右外连接。RIGHT [OUTER] JOIN,保留右关系的所有元组。 全外连接。FULL [OUTER] JOIN,保留左右两关系的所有元组。 FROM SC, Student?
73
3.3 SQL的数据查询 教师表:Teacher(教师号,姓名,所属大学,职称) 任职表:Post(编号,姓名,职务) 例:SELECT *
FROM Teacher FULL OUTER JOIN Post; FROM Techer LEFT OUTER JOIN Post; FROM Techer RIGHT OUTER JOIN Post;
74
3.3 SQL的数据查询 3.3.5 SQL中的空值处理 1.空值的含义 值暂未知。 值不适用。 值需隐瞒。 2.空值的若干规则
(1)空值与数值型数据进行算术运算,结果为空值。 (2)空值和任何值(包括空值)进行比较运算,结果为UNKNOWN。
75
3.3 SQL的数据查询 (3)空值的布尔运算 U AND T = U ; U AND F =F ; U AND U = U ;
U OR T = T ; U OR F =U ; U OR U = U ; NOT U = U 。 空值的测试:IS NULL和IS NOT NULL。 例:查询缺少选课成绩的学生号和相应的课程号。 SELECT Sno,Cno FROM SC WHERE grade IS NULL;
76
3.3 SQL的数据查询 3.3.6 递归合并查询 递归合并语句格式: WITH RECURSIVE <临时表R> AS
UNION <涉及到R的查询> <递归结果查询> 例:对表3.6所示的航班表Flight(airline,from,to,depart,arrive) ,求出:能从一个城市飞到另一个城市的城市对集合(含直接到达和间接中转到达)。
77
3.3 SQL的数据查询 直接到达: Reach(f,t)=Flight(a,f,t,d,r) f,t在表的同一个元组中。
间接到达:Reach(f,t)=Flight(a,f,t1,d,r) AND Reach(t1,t) SQL语句:WITH RECURSIVE Reach(from,to) AS (SELECT from,to //选出直接到达城市对 FROM Flight) UNION (SELECT Flight.from,Reach.to //选出间接到达城市对 FROM Flight,Reach //递归 WHERE Flight.to=Reach.from) SELECT * FROM Reach;
78
3.3 SQL的数据查询 例:有下列所示的一棵二叉树: a b e c f d 1 6 2 4 5 3 id pid name 1 NULL
求出:该子树中除子树根结点k以外的所有子孙结点的集合。
79
3.3 SQL的数据查询 分析:定义结果集为Tsub(id,name):
结点k的所有子女:Tsub(id,name)=Tree(id,pid,name) AND pid=k 结点k的所有子女的孩子(k的子孙): Tsub(id,name)=Tsub(id1,name1) AND Tree(id,id1,name) SQL:WITH RECURSIVE Tsub(id,name) AS (SELECT id,name FROM Tree //结点k的所有子女 WHERE pid=k ) UNION (SELECT Tree.id,Tree.name FROM Tsub,Tree //结点k的所有子孙 WHERE Tsub.id=Tree.pid) SELECT * FROM Tsub;
80
3.3 SQL的数据查询 视图的概念及作用 虚表 实表 是从一个或几个基本表(或视图)导出的表,是虚表。 与表一样可被查询。
对视图的更新操作有一定的限制。 对视图的一切操作最终将转换为对基本表的操作。 视图的作用: (1)简化结构及复杂操作。 (2)多角度地、更灵活地共享。 (3)提高逻辑独立性。 (4)提供安全保护。 S# SN SUM 虚表 S# SN AVG … 实表 S# SUM
81
说明:(1)若插入全部属性,则属性列可省略。 (2)表定义中说明为NOT NULL的列不能取空值。
3.4 SQL的数据更新 一. 插入数据 1. 插入单个元组 格式:INSERT INTO <表名> [(<属性列1> [,<属性列2>…)] VALUES (<常量1>[,<常量2>]…); 说明:(1)若插入全部属性,则属性列可省略。 (2)表定义中说明为NOT NULL的列不能取空值。 (3)属性值与相对应的属性列的数据类型要匹配。 (4)向参照表中插入元组,关系系统自动支持: · 实体完整性 · 参照完整性
82
3.4 SQL的数据更新 2. 插入子查询结果 格式:INSERT
INTO <表名> [(<属性列1>[,<属性列2>…)] 子查询; 二. 修改数据 格式:UPDATE <表名> SET <列名>=<表达式>[,<列名>=<表达式>]… [WHERE <条件>]; 三. 删除数据 格式:DELETE FROM <表名>
83
3.4 SQL的数据更新 四. 构造数据类型 1.聚合类型 <数据类型> ARRAY [<无符号整数> ]
例:CREATE TABLE mailout ( name CHAR (8), address CHAR(20) ARRAY [3]); INSERT INTO TABLE mailout (name, address) VALUES ('Wang',ARRAY ['20 Hongsang Road','Wuhan','430079']);
84
3.4 SQL的数据更新 2.行类型 格式: ROW (<列名><数据类型> [{,<列名><数据类型>}…] 例:CREATE TABLE lineage ( name CHAR (8), status CHAR (10), lastone ROW ( baby CHAR(8), birth DATE)); …… //插入数据操作 SELECT name, status, lastone FROM lineage WHERE lastone.baby='Liming'; 作为一个整体
85
3.5 SQL的视图 创建与使用视图 1. 创建视图 一般格式:
CREATE VIEW <视图名> [(<视图列名>[,<视图列名>]…)] AS <子查询> [WITH CHECK OPTION]; 其中:子查询可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY子句和DISTINCT短语。 WITH CHECK OPTION表示对视图进行UPDATE、 INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。 作用: 命名一个视图,AS子句定义每次查看视图时将看到的数据,在任何时刻,视图的数据由对其查询定义求值的结果行构成。
86
3.5 SQL的视图 例1:建立信息院学生的视图, CREATE VIEW D_ Student AS
SELECT sno,sname,age FROM Student WHERE dept=‘信息院’; 例2:建立信息院学生的视图, 要求进行更新时仍保证该视图只有信息院的学生。 CREATE VIEW D_ Student AS SELECT sno,sname,age FROM Student WHERE dept=‘信息院’; WITH CHECK OPTION
87
3.5 SQL的视图 视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已定义好的视图上,或同时建立在基本表与视图上。
例3 建立信息系选修了1号课程的学生的视图 CREATE VIEW IS_S1(Sno, Sname, Grade) AS SELECT Student.Sno, Sname, Grade FROM Student, SC WHERE Sdept='IS' AND Student.Sno=SC.Sno AND SC.Cno='1';
88
3.5 SQL的视图 例4 建立信息系选修了1号课程且成绩在90分以上的学生的视图
例4 建立信息系选修了1号课程且成绩在90分以上的学生的视图 CREATE VIEW IS_S2 AS SELECT Sno, Sname, Grade FROM IS_S1 WHERE Grade>=90; 这里的视图IS_S2就是建立在视图IS_S1之上的。
89
3.5 SQL的视图 带虚拟列的视图:是指设置了一些基本表中并不存在的派生列(虚拟列)的视图。
定义基本表时,为了减少数据库中的冗余数据,表中只存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的。但由于视图中的数据并不实际存储,所以定义视图时可以根据应用的需要,设置一些派生属性列。这些派生属性由于在基本表中并不实际存在,所以有时也称他们为虚拟列,带虚拟列的视图也称为带表达式的视图。 例5 定义一个反映学生出生年份的视图 CREATE VIEW BT_S(Sno, Sname, Sbirth) AS SELECT Sno, Sname, 1996-Sage FROM Student;
90
3.5 SQL的视图 分组视图:带有集函数和GROUP BY子句查询所定义的视图。 例6 将学生的学号及他的平均成绩定义为一个视图
例6 将学生的学号及他的平均成绩定义为一个视图 假设SC表中“成绩”列Grade为数字型,否则无法求平均值。 CREAT VIEW S_G(Sno, Gavg) AS SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno; 例7 将Student表中所有女生记录定义为一个视图 CREATE VIEW F_Student(stdnum,name,sex,age,dept) AS SELECT * FROM Student WHERE Ssex='女';
91
3.5 SQL的视图 删除视图 作用: DROP VIEW <视图名> 撤销一个视图,但不消除数据,在基础表中的数据仍然保留。
[CASCADE | RESTRICT] 注意: 视图删除后,视图的定义将从数据字典中自动删除。但要删除该视图导出的其他视图应用CASCADE 。 作用: 撤销一个视图,但不消除数据,在基础表中的数据仍然保留。 RESTRICT 确保只有不具有相关对象的视图(不涉及任何的约束、断言、触发器)才能被撤消。
92
3.5 SQL的视图 查询视图 视图定义后,用户就可以象对基本表进行查询一样对视图进行查询了。 DBMS执行对视图的查询时,首先进行有效性检查,检查查询涉及的表、视图等是否在数据库中存在,如果存在,则从数据字典中取出查询涉及的视图的定义,把定义中的子查询和用户对视图的查询结合起来,转换成对基本表的查询,然后再执行这个经过修正的查询。将对视图的查询转换为对基本表的查询的过程称为视图的消解(View Resolution)。
93
3.5 SQL的视图 例1 在信息系学生的视图中找出年龄小于20岁的学生
例1 在信息系学生的视图中找出年龄小于20岁的学生 SELECT Sno, Sage FROM IS_Student WHERE Sage<20; 视图是定义在基本上的虚表,它可以和其他基本表一起使用,实现连接查询或嵌套查询。 例2 查询信息系选修了1号课程的学生 SELECT Sno, Sname FROM IS_Student, SC WHERE IS_Student.Sno=SC.Sno AND SC.Cno='1'; 本查询涉及虚表IS_Student和基本表SC,通过这两个表的连接来完成用户请求。
94
3.5 SQL的视图 更新视图 最终要转换为对基本表的更新。 注意:并不是所有的视图都可以更新的。 P.133—P.134 视图更新规定
95
3.5 SQL的数据控制 由DBMS提供统一的数据控制功能是数据库系统的特点之一。数据控制亦称为数据保护,包括数据的安全性控制(连接第九章 数据库安全性)、完整性控制(连接第十章 数据库完整性)、并发控制和恢复(连接第八章 并发控制)。这里主要介绍SQL的数据控制功能。 SQL语言提供了数据控制功能,能够在一定程度上保证数据库中数据的安全性、完整性,并提供了一定的并发控制及恢复能力。
96
3.5 SQL的数据控制 数据库的完整性是指数据库中数据的正确性与相容性。SQL语言定义完整性约束条件的功能主要体现在CREATE TABLE语句中,可以在该语句中定义码、取值唯一的列、参照完整性及其他一些约束条件。 并发控制指的是当多个用户并发地对数据库进行操作时,对他们加以控制、协调,以保证并发操作正确执行,并保持数据库的一致性。恢复指的是当发生各种类型的故障,使数据库处于不一致状态时,将数据库恢复到一致状态的功能。SQL语言也提供了并发控制及恢复的功能,支持事务、提交、回滚等概念。 数据库的安全性是指保护数据库,防止不合法的使用所造成的数据泄露和破坏。数据库系统中保证数据安全性的主要措施是进行存取控制,即规定不同用户对于不同数据对象所允许执行的操作,并控制各用户只能存取他有权存取的数据。不同的用户对不同的数据应具有何种操作权力,是由DBA和表的建立者(即表的属主)根据具体情况决定的,SQL语言则为DBA和表的属主定义与回收这种权力提供了手段。
97
3.5 SQL的数据控制 1. 授权语句 SQL语言用GRANT语句向用户授予操作权限,GRANT语句的一般格式为: GRANT <权限>[,<权限>]... [ON <对象类型> <对象名>] TO <用户>[,<用户>]... [WITH GRANT OPTION]; 其语义为:将对指定操作对象的指定操作权限授予指定的用户。 接受权限的用户可以是一个或多个具体用户,也可以是PUBLIC即全体用户。 如果指定了WITH GRANT OPTION子句,则获得某种权限的用户还可以把这种权限再授予别的用户。如果没有指定WITH GRANT OPTION子句,则获得某种权限的用户只能使用该权限,但不能传播该权限。
98
3.5 SQL的数据控制 例1 把查询Student表权限授给用户U1
GRANT SELECT ON TABLE Student TO U1; 例2 把对Student表和Course表的全部权限授予用户U2和U3 GRANT ALL PRIVILIGES ON TABLE Student, Course TO U2, U3; 例3 把对表SC的查询权限授予所有用户 GRANT SELECT ON TABLE SC TO PUBLIC; 例4 把查询Student表和修改学生学号的权限授给用户U4 GRANT UPDATE(Sno), SELECT ON TABLE Student TO U4; 这里实际上要授予U4用户的是对基本表Student的SELECT权限和对属性列Sno的UPDATE权限。授予关于属性列的权限时必须明确指出相应属性列名。
99
3.5 SQL的数据控制 例5 把对表SC的INSERT权限授予U5用户,并允许他再将此权限授予其他用户
GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION; 执行此SQL语句后,U5不仅拥有了对表SC的INSERT权限,还可以传播此权限,即由U5用户发上述GRANT命令给其他用户。 例如U5可以将此权限授予U6: GRANT INSERT ON TABLE SC TO U6; 因为U5未给U6传播的权限,因此U6不能再传播此权限。 例6 DBA把在数据库S_C中建立表的权限授予用户U8 GRANT CREATETAB ON DATABASE S_C TO U8; 授予关于DATABASE的权限必须与授予关于TABLE的权限分开,因为它们使用不同的对象类型关键字。
100
3.5 SQL的数据控制 2. 回收权限语句 授予的权限可以由DBA或其他授权者用REVOKE语句收回,REVOKE语句的一般格式为:
REVOKE <权限>[,<权限>]... [ON <对象类型> <对象名>] FROM <用户>[,<用户>]...; 例7 把用户U4修改学生学号的权限收回 REVOKE UPDATE(Sno) ON TABLE Student FROM U4;
101
3.5 SQL的数据控制 例8 收回所有用户对表SC的查询权限 REVOKE SELECT ON TABLE SC FROM PUBLIC;
例9 把用户U5对SC表的INSERT权限收回 REVOKE INSERT ON TABLE SC FROM U5;
102
3.6 嵌入式SQL 一、概述 嵌入式 SQL: 作用:负责操纵DB。 主语言: 作用:负责控制流程及处理操纵结果。 两种实现方法: 预编译
可执行语句 (数据定义、控制、操纵) 说明性语句 (说明变量、游标)
103
3.6 嵌入式SQL 二、嵌入式SQL的工作原理 1. 嵌入式SQL与主语言的接口
(1) 状态变量SQLSTATE (描述系统当前状态和运行情况 ) \0 × 一般类别 特殊子类 SQLSTATE 的格式 在每一个SQL语句执行之后,DBMS将描述当前工作状态和运行环境的一个状态值放人SQLSTATE中。
104
3.6 嵌入式SQL (2)主变量(Host Variable) SQL语句中使用的主语言程序变量称为主变量。 (3)游标(Cursor)
作用:通过游标获取记录,并赋给主变量,交主语言处理。集合-》单条。 SQL查询结果 游标名 …………….. .……………. 一条记录 主变量 游标指针
105
3.6 嵌入式SQL 2. 嵌入式SQL需解决的问题 (1)如何区分SQL与主语言语句 ?
前缀加EXEC SQL,结束处用END_EXEC(或用分号)。 例嵌入到C程序中: EXEC SQL <SQL语句>; (2)如何区分主语言变量与SQL的列变量 ? 主变量前加冒号。如: :Cname (3)SQL的集合处理方式与主语言的单记录处理方式之间的协调。 需要有一种机制: 能将SQL中的集合量逐个送入主变量内,供主程序使用。 方法: 是在嵌入式SQL中增加一组游标语句。
106
3.6 嵌入式SQL 主语言 + 嵌入SQL 预处理 主语言 + 函数调用 主语言编译器 主语言执行程序
107
3.6 嵌入式SQL 3.嵌入式SQL的工作过程 主语言程序 SQL语句 …… 主变量 游标 状态变量 …… SQLSTATE ①执行参数
③操作 结果 ②执行 状态 SQL工作原理及过程示意图
108
3.6 嵌入式SQL 三、嵌入式SQL的程序组成 P.138 例3.71 1.程序的主要部分 (1) DECLARE段(用于定义主变量 )
格式:EXEC SQL BEGIN DECLARE SECTION; …… //主变量说明 EXEC SQL END DECLARE SECTION; (2)CONNECT 语句(建立SQL连接) 格式:EXEC SQL CONNECT TO <SQL服务器或数据库名> USER <用户名>
109
3.6 嵌入式SQL (3)WHENEVER语句 使用WHENEVER语句可以简化每条嵌入式SQL语句后编写检查SQLSTATE值的程序。
WHENEVER SQLERROR:通知预编译程序产生处理错误的代码(SQLSTATE<0). WHENEVER SQLWARING:通知预编译程序产生处理警报的代码(SQLSTATE=1). WHENEVER NOT FOUND:通知预编译程序产生没有查到内容的代码(SQLSTATE=100).
110
3.6 嵌入式SQL 用户可指定预编译程序采取以下行为: WHENEVER…GOTO:通知预备编译程序产生一条转移语句。
WHENEVER…CONTINUE:通知预编译程序让程序控制流转入到下一个主语言语句。 WHENEVER…CALL:通知预编译程序调用函数。 其完整语法如下: WHENEVER {SQLWARNING|SQLERROR|NOT FOUND} {CONTINUE|GOTO stmt_label|CALL function()}
111
3.6 嵌入式SQL (4)应用程序体 若干可执行SQL语句及主语言语句。 提交和退出数据库: COMMIT WORK RELEASE;
(2)使用预编译器,产生预编译输出文件; (3)使用C编译器对预编译输出文件进行编译,产生目标程序; (4)连接目标程序,产生可执行程序; (5)运行程序。
112
3.6 嵌入式SQL 四、嵌入式SQL的使用技术 1.无游标的操作 说明性语句 数据定义语句 数据控制语句 数据插入语句
非当前形式的UPDATE、DELETE语句 语句查询结果为单记录的SELECT 2.带游标的查询操作 查询结果为多记录。 当前形式的UPDATE、DELETE语句
113
3.6 嵌入式SQL 游标语句作用: (2)打开游标 把对集合的操作转换为对单个记录的处理。 执行相应的语句,把查询结果取到缓冲区中。
使用游标的步骤为: (1)定义游标 分配缓冲区并对应查询语句。 格式:EXEC SQL DECLARE <游标名> CURSOR FOR <SELECT 语句> (2)打开游标 执行相应的语句,把查询结果取到缓冲区中。 格式: EXEC SQL OPEN <游标名> (3)推进游标: 推进游标指针并取当前记录。格式:EXEC SQL FETCH <游标名> INTO :<主变量1>,:<主变量2>,…
114
3.6 嵌入式SQL (4)关闭游标: 释放缓冲区及其他资源。 格式:EXEC SQL CLOSE <游标名>; 查询语句
SELECT结果 1 2 … n 主变量 阅读[例3.76]
115
3.7 动态SQL 动态SQL语句的目的不是在编译时确定SQL的表和列,而是让程序在运行时提供,并将SQL语句文本传给DBMS执行。
(1)执行PREPARE语句要求DBMS分析、确认和优化语句,并为其生成执行计划。 语句格式:PREPARE <语句名> FROM :<主变量> 功能:接收含有SQL语句的主变量,并把该语句送到DBMS。DBMS编译该语句并生成执行计划。 (2)用EXECUTE语句执行执行计划。 [P.144 例 3.77]
116
3.7 动态SQL 补充例:在sc表中插入一条记录,记录的值由程序决定。 #include <stddef.h>
#include <stdio.h> main() { EXEC SQL BEGIN DECLARE SECTION; char perp[]=“INSERT INTO sc VALUES(?,?,?)”; char sno[6]; char cno[4]; int grade; EXEC SQL END DECLARE SECTION; EXEC SQL CONNECT TO student USER sa.; 参数标志
117
3.7 动态SQL EXEC SQL PREPARE prep_stat FROM :prep; if (SQLSTATE==0)
{ strcpy(sno,”995201”); strcpy(cno,”c601”); grade=76; EXEC SQL EXECUTE prep_stat USING :sno,:cno,:grade; } 代替准备语句中的参数标志“?”
118
3.8 ODBC与JDBC 1. 起因:嵌入式SQL需要有面向特定DBMS的预处理程序将嵌入式的SQL转化为宿主语言中的功能调用,这种特定的转化依赖于DBMS,因此即使源码可以为不同的DBMS工作,其最后的可执行代码只能对特定的DBMS起作用。 2. ODBC与JDBC通过API将数据库的功能以一种标准的形式提供出来,允许在不同的DBMS之间使用相同的可执行代码而无需重新编译。 3. 方法:引入一个间接的、额外的层次。
119
3.8 ODBC与JDBC 4. 结构 Application: 是处理业务逻辑的应用程序,在ODBC的体系结构中的作用是初始化与中止与数据源的连接。 Driver: 是转换的程序,用于将ODBC或JDBC调用转化为特定的DBMS调用。 Driver manager: 登记和管理driver,在运行时动态选择特定的driver Data Source: 处理由driver翻译好的命令,并返回结果。
120
第3章 关系数据库标准语言SQL 要点 4. 嵌入式 SQL的原理 1. SQL的特点、功能 2. SQL查询 3. 视图的概念、定义及作用
练习: P 、7、8
Similar presentations