数据库实用教程董健全丁宝康编著清华大学出版社第4章.ppt_第1页
数据库实用教程董健全丁宝康编著清华大学出版社第4章.ppt_第2页
数据库实用教程董健全丁宝康编著清华大学出版社第4章.ppt_第3页
数据库实用教程董健全丁宝康编著清华大学出版社第4章.ppt_第4页
数据库实用教程董健全丁宝康编著清华大学出版社第4章.ppt_第5页
已阅读5页,还剩150页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章 结构化查询语言SQL 本 章 概 要 SQL是结构化查询语言(Structured Query Language)的缩写,其功能包括数据查询、数据操纵 、数据定义和数据控制四个部分。 SQL 语言简洁、方便实用、功能齐全,已成为目前 应用最广的关系数据库语言。 本章要求 了解 SQL数据库的体系结构:SQL的组成。 掌握SQL语言的四大功能及使用方法, 重点掌握其数据查询功能及其使用。 4.1 SQL 概述 4.1.1 SQL语言的发展及标准化 4.1.1.1 SQL语言发展史 SQL语言是当前最为成功、应用最为广泛的关系数据库语 言,其发展主要经历了以下几个阶段: 1974年由CHAMBERLIN和BOYEE提出,当时称为 SEQUEL(STUCTURED ENGLISH QUERY LANGUAGE); IBM公司对其进行了修改,并用于其SYSTEM R关系数据库 系统中; 1981年 IBM推出其商用关系关系数据库SQL/DS,并将其名 字改为SQL,由于SQL语言功能强大,简洁易用,因此得到 了广泛的使用; 今天广泛应用于各种大型数据库,如SYBASE、INFORMIX、 ORACLE、DB2、INGRES等,也用于各种小型数据库,如 FOXPRO、ACCESS。 4.1.1.2 SQL语言标准化 随着关系数据库系统和SQL语言应用的日益广泛, SQL语言的标准化工作也在紧张革进行着,十多年来已制 订了多个SQL标准; 1. 1982年,美国国家标准化局(AMERICAN NATIONAL STANDARD INSTITUTE,简称ANSI)开始制定SQL标准; 2. 1986年,美国国家标准化协会公布了SQL语言的第 一个标准SQL86; 3. 1987年,国际标准化组织(ISO)通过了SQL86标准 ; 4. 1989年,国际标准化组织(ISO)对SQL86进行了补 充,推出了SQL89标准; 5. 1992年,ISO又推出了SQL92标准,也称为SQL2; 6. 目前SQL99(也称为SQL3)在起草中,增加了面向 对象的功能。 SQL成为国际标准后,对数据库以外的领域也产 生了很大影响,不少软件产品将 SQL语言的数据查询功 能与图形功能、软件工程工具、软件开发工具、人工智 能程序结合起来。SQL已成为关系数据库领域中一个主 流语言。 4.1.2 SQL语言的基本概念 首先介绍两个基本概念:基本表和视图。 基本表(BASE TABLE):是独立存在的表,不是由 其它的表导出的表。一个关系对应一个基本表,一个或 多个基本表对应一个存储文件。 视图(VIEW):是一个虚拟的表,是从一 个或几个基本表导出的表。它本身不独立存在于数 据库中,数据库中只存放视图的定义而不存放视图 对应的数据,这些数据仍存放在导出视图的基本表 中。当基本表中的数据发生变化时,从视图中查询 出来的数据也随之改变。 优点是提高了数据库对应用程序的独立性, 有利于保持数据的一致性。其次是简化了复杂查询 ,提供了保持数据库安全性的手段。 例如:学生数据库中有学生基本情况表 STUDENT(SNO,SNAME,SSEX,SAGE,SDEPT),此表为基 本表,对应一个存储文件。可以在其基础上定义一 个男生基本情况表 STUDENT_MALE(SNO,SNAME,SAGE,SDEPT), 它是从STUDENT中选择SSEX=男的各个行,然 后在SNO,SNAME,SAGE,SDEPT上投影得到的。 在数据库中只存有STUDENT_MALE的定义,而 STUDENT_MALE的记录不重复存储。 在用户看来,视图是通过不同路径去看一个实际 表,就象一个窗口一样,我们通过窗户去看外面 的高楼,可以看到高楼的不同部分,而透过视图 可以看到数据库中自己感兴趣的内容。 SQL语言支持数据库的三级模式结构,如图3.1所 示。其中外模式对应于视图,模式对应于基本表 ,内模式对应于存储文件。 SQL 视图1视图2 基本表1基本表2基本表3基本表4 存储文件1存储文件2 外模式 模式 内模式 图3.1 SQL语言支持的关系数据库的三级逻辑结构 SQL数据库的体系结构具有如下特征: (l)一个 SQL模式(Schema)是表和约束的集合 。 (2)一个表(Table)是行(Row)的集合。每行 是列(Column)的序列,每列对应一个数据项。 (3)一个表可以是一个基本表,也可以是一个视 图。基本表是实际存储在数据库中的表。视图是从 基本表或其他视图中导出的表,它本身不独立存储 在数据库中,也就是说数据库中只存放视图的定义 而不存放视图的数据,这些数据仍存放在导出视图 的基本表中。因此视图是一个虚表。 (4)一个基本表可以跨一个或多个存储文件,一个存 储文件也可存放一个或多个基本表,一个表可以带若 干索引,索引也存放在存储文件中。每个存储文件与 外部存储器上一个物理文件对应。存储文件的逻辑结 构组成了关系数据库的内模式。 (5)用户可以用SQL语句对视图和基本表进行查询等 操作。在用户看来,视图和基本表是一样的,都是关 系(即表格)。 (6)SQL用户可以是应用程序,也可以是终端用户。 SQL语句可嵌入在宿主语言的程序中使用,宿主语言有 FORTRAN、COBOL、PASCAL、PLI、C和Ada等语言; SQL语言也能作为独立的用户接口,供交互环境下的终 端用户使用。 4.1.3 SQL语言的主要特点 1. SQL语言类似于英语的自然语言,简洁易用 。 2. SQL语言是一种非过程语言,即用户只要提 出“干什么”即可,不必管具体操作过程,也不必了 解数据的存取路径,只要指明所需的数据即可。 3. SQL语言是一种面向集合的语言,每个命令 的操作对象是一个或多个关系,结果也是一个关系。 4. SQL语言既是自含式语言,又是嵌入式语言 。可独立使用,也可嵌入到宿主语言中。 自含式语言可以独立使用交互命令,适用于终端 用户、应用程序员和DBA; 嵌入式语言使其嵌入在高级语言中使用,供应用 程序员开发应用程序。 5.SQL的组成 SQL主要分成四个部分: (1)数据定义:这一部分也称为“SQL DDL”, 用于定义 SQL模式、基本表、视图和索引。 (2)数据操纵:这一部分也称为“SQL DML”。 数据操纵分成数据查询和数据更新两类。其中数据更 新又分成插入、删除和修改三种操作。 (3)数据控制:这一部分也称为“SQL DCL”。 数据控制包括对基本表和视图的授权,完整性规则的 描述,事务控制语句等。 (4)嵌入式SQL的使用:这一部分内容涉及到SQL 语句嵌入在宿主语言程序中的使用规则。 4.2 SQL的数据定义 SQL的数据定义部分包括对SQL模式(Schema) 、基本表(关系,Table)、视图(View)、索引( index)的创建和撤消操作。 4.2.1 SQL模式的创建和撤消 1SQL模式的创建 在SQL2中,一个SQL模式(即“数据库模式”) 被定义为基本表的集合。一个SQL模式由模式名和模式 拥有者的用户名或账号来确定,并包含模式中每一个元 素(基本表、视图、索引等)的定义。创建了一个 SQL 模式,就是定义了一个存储空间。 SQL模式的创建可用 CREATE语句实现,其句 法如下: CREATE SCHEMA 模式名 AUTHORIZATION 用户名 例如,下面语句定义了教学数据库的 SQL模式: CREATE SCHEMA ST_COURSE AUTHORIZATION 张铭 该模式名为 ST_COURSE,拥有者为张铭。 在SQL中还有一个“目录”(CATALOG)概念。 目录是SQL环境中所有模式的集合。一个目录由一个特 殊模式“INFORMATION_SCHEMA”组成,它负责提供所 有模式描述是元素的信息,这些信息除了关系、视图 、索引等的定义外,还包括实体完整性规则、引用完 整性规则等内容。 由于“SQL模式”这个名称学术味太重,因此 大多数 DBMS中不愿采用这个名词,而是采用“数据库 ”(DATABASE)这个名词。也就是大多数系统中创建 SQL模式不是用“CREATE SCHEMA”字样,而是用“ CREATE DATABASE”字样。 2SQL模式的撤消 当一个 SQL模式及其所属的基本表、视图等元素 都不需要时,可以用 DROP语句撤消 这个SQL模式。DROP 语句的句法如下: DROP SCHEMA 模式名 CASCADE|RESTRICT 撤消的方式有两种: CASCADE(连锁式)方式:执行 DROP语句时,把 SQL模式及其下属的基本表、视图、索引等所有元素全部 撤消。 RESTRICT(约束式)方式:执行DROP语句 时,只有当 SQL模式中没有任何下属元素时,才 能撤消 SQL模式,否则拒绝执行 DROP语句。 例如,要撤消SQL模式STCOURSE及其下属 所有的元素,可用下列语句实现: DROP SCHEMA STCOURSE CASCADE 4.2.2 SQL提供的基本数据类型 下面是SQL提供的一些主要数据类型: 1数值型 INTEGER 长整数(也可写成INT) SMALLINT 短整数 REAL 取决于机器精度的浮点数 DOUBLE PRECISION 取决于机器精度 的双精度浮点数 FLOAT(n) 浮点数,精度至少为n位数字 NUMERIC(p,d) 定点数,由p位 数字(不包括符号小数点)组成,小数点后面有d位数字(也 可写成DECIMAL(P,d)或DEC(P,d) 2字符串型 CHAR(n) 长度为n的定长字符串 VARCHAR(n) 具有最大长度为n的变长字符串 3位串型 BIT(n) 长度为n的二进制位串 BIT VARYING(n) 最大长度为 n的变长二进制 位串 4时间型 DATE 日期,包含年、月、日,形为 YYYYMMDD TIME 时间,包含一日的时、分、秒,形为 HH:MM:SS SQL允许在上面列出的域上执行比较操作,但 算术操作只限于数值型。 SQL允许用户使用“CREATE DOMAIN语句定义 新的域,例如: CREATE DOMAIN PERSON_NAME CHAR(10) 定义了一个新的域PERSON_NAME,以后就可把 它作为基本数据类型看待,用户在定义其他列时可以 采用PERSON_NAME作为数据类型。 4.2.3 基本表的创建、修改和撤消 如果在系统中创建了一个 SQL模式,那么就可 以在该模式中创建基本表。对基本表结构的操作有创 建、修改和撤消三种操作。 1基本表的创建 创建基本表,就是定义基本表的结构。基本表 结构的定义可用CREATE语句实现: CREATE TABLE SQL模式名基本表名 (列名 类型, 完整性约束, ) 定义基本表结构,需指出它放在哪个模式中 ,后面为简单起见,模式名省略不写。每个属性的类 型可以是基本类型,也可以是用户事先定义的域名。 完整性规则主要有三种子句:主键子句(PRIMARY KEY)、检查子句(CHECK)和外键子句(FOREIGN KEY)。 例4.1 在有关零件、供应商、工程项目的数 据库中,有四个关系,其结构如下: 供应商关系: S(SNO,SNAME,STATUS,ADDR) 零件关系: P(PNO,PNAME,COLOR,WEIGHT) 供应商关系: J(JNO,JNAME,CITY,BALANCE) 工程项目关系: SPJ(SNO,PNO,JNO,PRICE,QTY) 供应商关系S,可用下列语句创建: CREATE TABLE S (SNO CHAR(4) NOT NULL, SNAME CHAR(20) NOT NULL, STATUS CHAR(10), ADDR CHAR(20) PRIMARY KEY(SNO); 注:主键是供应商编号SNO ,所以对属性 SNO的定 义中的“NOT NULL”可以省略不写。(空值NULL表示 “不知道”) 对于基本表P可以用下列语句创建: CREATE TABLE P (PNO CHAR(4) NOT NULL, PNAME CHAR(20)NOT NULL, COLOR CHAR(8), WEIGHT SMALLINT, PRIMARY KEY(PNO); 对于基本表J可以用下列语句创建: CREATE TABLE J (JNO CHAR(4)NOT NULL, JNAME CHAR(20), CITY CHAR(20), BALANCE NUMBERIC(7,2), PRIMARY KEY(JNO); 对于基本表P可以用下列语句创建: CREATE TABLE SPJ (SNO CHAR(4)NOT NULL, PNO CHAR(4)NOT NULL, JNO CHAR(4)NOT NULL, PRICE NUMERIC(7,2), QTY SMALLINT, PRIMARY KEY(SNO,PNO, JNO), FOREIGN KEY(SNO) REFERENCES S(SNO), FOREIGN KEY(PNO) REFERENCES P(PNO), FOREIGN KEY(JNO) RFERENES J(JNO), CHECK(QTY BETWEEN 0 AND 10000); 2基本表结构的修改 在基本表建立后,可以根据实际需要对基本 表的结构进行修改,即增加新的属性或删除原有的属 性。 (1)增加新的属性用“ALTERADD”语句,其 句法如下: ALTER TABLE 基本表名 ADD 新属性名 新属性类型 例4.2在基本表 S中增加一个电话号码( TELE)属性,可用下列语句: ALTER TABLE S ADD TELE CHAR(12); 应注意,新增加的属性不能定义为“NOT NULL”。基本表在增加一属性后,原有元组在新增加 的属性列上的值都被定义为空值(NULL)。 (2)删除原有的属性用“ALTER DROP ”语 句,其句法如下: ALTER TABLE 基本表名 DROP 属性名 CASCADE | RESTRICT 此处CASCADE方式表示:在基本表中删 除某属性时,所有引用到该属性的视图和约束 也要一起自动地被删除。而RESTRICT方式表示 在没有视图或约束引用该属性时,才能在基本 表中删除该属性,否则拒绝删除操作。 例4.3在基本表S中删除状态(STATUS)属性,并 且将引用该属性的所有视图和约束也一起删除,可用下 列语句: ALTER TABLE S DROP TELE CASCADE; (3)基本表的撤消。 可以用“DROP TABLE”语句撤消基本表。在一 个基本表撤消后,其所有数据也就丢失了。 撤消语句的句法如下: DROP TABLE 基本表名 CASCADE | RESTRICT 此处的CASCADE和RESTRICT的语义同前面句法 中的语义一样。 例4.4 需要撤消基本表S。但只有在没有视 图或约束引用基本表S中的列时才能撤消,否则拒绝撤 消。可用下列语句实现: DROP TABLE S RESTRICT; 4.2.4 视图的创建和撤消 在SQL中,外模式一级数据结构的基本单位是 视图(View)视图是从若干基本表和(或) 其他 视图构造出来的表。这种构造方式采用后面4.3节介 绍的SELECT语句实现。在我们创建一个视图时,系统 把视图的定义存放在数据字典中,而并不存储视图对 应的数据,在用户使用视图时才去求对应的数据。因 此,视图被称为“虚表”。 1. 视图的创建 创建视图可用“CREATE VIEW”语句实现。其 句法如下: CREATE VIEW 视图名(列名表 ) AS SELECT 查询语句 例4.5对工程项目零件供应数据库中基本表 S,P,J,SPJ,用户经常要用到有关项目使用零件情 况信息:工程号(JNO)、工程项目名称(JNAME)、 供应商号(SNO)、供应商名(SNAME)、零件号( PNO)、零件名(PNAME)、供应数量(QTY)等列的 数据,那么可用下列语句建立视图: CREAT VIEW JSP_NAME(JNO,JNAME, SNO,SNAME,PNO,PNAME,QTY) AS SELECT (J.JNO, JNAME, S.SNO, SNAME,P.PNO , PNAME,QTY) FROM S,P,J WHERE S.SNO=SPJ.SNO AND P.PNO=SPJ.PNO AND J.JNO=SPJ.JNO; 此处,视图中列名顺序与SELECT子句中的列名 顺序一致,因此视图名JSP_NAME后的列名可省略。 2视图的撤消 可以用“DROP VIEW”语句把视图从系 统中撤消。其句法如下: DROP VIEW 视图名 例4.6撤消 JSP_NAME视图,可用下 列语句实现: DROP VIEW JSP_NAME; 4.2.5 索引的创建和撤消 在SQL86和SQL89标准中。基本表没有关键码 概念。用索引机制弥补,而且至今仍有许多关系 DBMS使用索引创建和撤消语句,因此在此加以介绍 。 索引属于物理存储的路径概念,而不是逻辑 的概念。在定义基本表时,还要定义索引,就把数 据库的物理结构和逻辑结构混合在一起了,因此, 在SQL2中,直接使用主键概念,在创建基本表时用 主键子句定义主键。 下面介绍SQL标准中和现在许多DBMS中使用的 索引技术。 1索引的创建 创建索引可用”CREATE INDEX”语句实现。其 句法如下; CREATE UNIQUE INDEX 索引名 ON 基本表名 ( , ) 其中,基本表名指定要建索引的基本表的名字 。索引可以建在该表的一列或多列上,各列名 之间用逗号分隔。每个列名后面还可以用 次序指定索引值的排列次序,包括ASC升序和 DESC降序两种,默认值为ASC。UNIQUE表示此索引 的每一个索引值只对应惟一的数据记录。 例4.7 如果工程项目表用下列语句创建: CREATE TABLE J (JNO CHAR(4),JNAME CHAR(20), CITY CHAR(20); 此时可对基本表J建立一个索引: CREATE INDEX JNO_INDEX ON J(JNO); 此语句表示对基本表J的列JNO建立索引,索引 键的名为JNOINDEX。如果要求列JNO的值在基本表J 中不重复,那么在INDEX前加上保留字UNIQUE; CREATE UNIQUE INDEX JNO_INDEX ON J(JNO); SQL中的索引是非显式索引,也就是在索引创建 后,用户在索引撤消前不会再用到该索引键的名,但 是索引在用户查询时会自动起作用。 一个索引键也可以对应多个列。索引排列时可 以升序,也可以降序,升序排列用 ASC表示,降序排 列用DESC表示,默认时表示升序排列。譬如,可以对 基本表 SPJ中的(SNO,PNO,JNO)建立索引: CREATE UNIQUE INDEX SPJ_INDEX ON SPJ(SNO ASC ,PNO ASC ,JNO DESC); 2.索引的撤消 索引的撤消可用 DROP INDEX 索引 名 语句实现。 例4.8 撤消索引JNOINDEX和SPJ INDEX,可以用下列语句: DROP INDEX JNO_INDEX , SPJ_INDEX 4.3 SQL 的数据查询 数据查询是关系运算理论在SQL语言中 的主要体现。SQL的数据查询只一条SELECT语 句,而且它是用途最广泛的一条语句,功能 非常强大。在学习时,应注意把SELECT语句 和关系代数表达式联系起来考虑问题。 4.3.1 SELECT语句格式 一个完整的SELECT语句包括6个子句,其中前面 的2个子句是必不可少的,其他子句可以省略。 SELECT 语句的完整格式如下: SELECT DISTINCT 目标表的列名或 列表达式序列 FROM 基本表名或视图名序列 WHERE 行条件表达式 GROUP BY 列名1 序列 HAVING 组条件表达式 ORDER BY 列名2 ASC|DESC 序列 整个语句的执行过程如下: 根据 WHERE子句的行条件表达式,从FROM子句 指定的基本表或视图中找出满足 条件的元组,再按SELECT子句中的目标列表达式选出 元组中的属性值形成结果表。如果有GROUP子句,则将 结果按列名1的值进行分组,该属性列值相等的元 组为一个组,每个组产生结果表中的一条记录。通常会 在每组中进行聚合操作。如果GROUP子句带HAVING短语 ,则只有满足指定条件的组才予输出。如果有ORDER子 句,则结果表还要按列名2的值的升序或降序排序 。 在WHERE子句的行条件表达式中可使用的运算符 有 算术比较运算符:, , 或! 逻辑运算符: AND, OR, NOT 集合运算符: UNION(并), INTERSECT(交), EXCEPT(差) 集合成员资格运算符:IN, NOT IN 谓词:EXISTS(存在量词), ALL, SOME, UNIQUE 聚合函数:AVG(平均值),MIN(最小值), MAX(最大值),SUM(和),COUNT(计数) 条件表达式中的运算对象还可以是另一个 SELECT语句,即SELECT语句可以嵌套(就是说: SELECT语句既可以完成简单的单表查询,也可以完 成复杂的联接查询和嵌套查询)。 上面形式的SQL查询语句,很容易看成是关 系代数的表达式。SELECT子句指定作投影运算,当 FROM子句指出多个关系时则表示要做笛卡尔积运算 ,WHERE子句指定做选择运算。但值得注意的是, 当查询要求做关系代数的自然联接时,那么不仅要 在FROM子句中给出多个关系,而且必须在WHERE子 句的条件中包含自然联接的条件(在公式属性上相 等)。下面讨论SELECT的使用方法 4.3.2 单表查询 SQL语言的所有查询都是利用SELECT语句完成的 。下面通过例子介绍它的使用方法: 例4.9 假设项目零件供应数据库中有四个基本 表(关系): 供应商关系:S(SNO,SNAME,STATUS,ADDR ) 零件关系:P(PNO,PNAME,COLOR,WEIGHT) 工程项目关系;J(JNO,JNAME,CITY, BALANCE) 供应情况关系:SPJ(SNO,PNO,JNO,PRICE ,QTY) 如果上述关系的当前值如下: 供应商关系:S SNO SNAME STATUS ADDR S1 原料公司 10 南京北门23号 S2 红星钢管厂 30 上海浦东100号 S3 零件制造公司 20 南京东晋路55号 S4 配件公司 50 江西上饶58号 S5 原料厂矿 40 北京红星路88号 S8 东方配件厂矿 60 天津叶西路100号 零件关系:P PNO PNAME COLOR WEIGHT P1 钢精 黑 25 P2 钢管 白 26 P3 螺母 红 11 P4 螺丝 黄 12 P5 齿轮 红 18 工程项目关系:J JNO JNAME CITY BALANCE J1 东方明珠 上海 0.00 J2 炼油厂 长春 -11.20 J3 地铁三号 北京 678.00 J4 明珠线 上海 456.00 J5 炼钢工地 天津 123.00 J6 南浦大桥 上海 234.70 J7 红星水泥厂 江西 343.00 供应情况关系:SPJ SNO PNO JNO PRICE QTY S1 P1 J1 22.60 80 S1 P1 J4 22.60 60 S1 P3 J1 22.80 100 S1 P3 J4 22.80 60 S3 P3 J5 22.10 100 S3 P4 J1 11.90 30 S3 P4 J4 11.90 60 S4 P2 J4 33.80 60 S5 P5 J1 22.80 20 S5 P5 J4 22.80 60 S8 P3 J1 13.00 20 S1 P3 J6 22.80 6 S3 P4 J6 11.90 6 S4 P2 J6 33.80 8 试用SQL语句表达下列查询语句。 检索供应工程J1零件的供应编号SNO。 SELECT DISTINCT SNO FROM SPJ WHERE JNO=J1; SELECT子句后面的DISTINCT 表示要在结果中去掉 重复的供应商号SNO。 查询结果如下: SNO S1 S3 S5 S8 (4 row(s) affected) 检索供应工程J1零件P1的供应商编号 SNO。 SELECT SNO FROM SPJ WHERE JNO=J1 AND PNOP1 ; 查询结果如下: SNO - S1 (1 row(s)affected) 查询全体工程项目的详细信息。 SELECT * FROM J; 如果要查询FROM子句后面指定的基本 表的全体属性时,可以用“*”来表示。所 以上面的语句等价于: SELECT JNO, JNAME, CITY , BALANCE FROM J; 查询没有正余额的工程编号、名称及城市,结 果按工程编号升序排列。 SELECT JNO,JNAME,CITY FROM J WHERE BALANCES IS NULL OR BALANCES WHERE 条件表达式 例4.20 删除工程号为J4的所有 零件供应记录 DELETE FROM SPJ WHERE JNO = J4 把供应商为东方配件厂供应给 工程的所有零件从SPJ表中删除。 DELETE FROM SPJ WHERE SNO IN (SELECT SNO FROM S WHERE SNAME=东方配件厂); 注意,DELETE语句只能从一个关系 中删除元组,而不能一次从多个关系中 删除元组。要删除多个元组,就要写多 个DELETE语句。 4.3.3 数据修改 当需要修改指定关系中元组的某些值时,可以 用下列语句实现: UPDATE 基本表名 SET 列名 = 值表达式 ,列名 = 值表达式 WHERE 条件表达式 该语句的意义是:修改指定表中满足条件表达 式的元组中的指定属性值,其中SET子句用于指定修 改方法,即用的值取代相应的属性列值。如 果省略WHERE子句,则表示要修改表中的所有元组。 例4.21 对关系S、P、J、SPJ中的 值进行修改。 将供应商J4提供的零件S5的价格 提高6% UPDATE SPJ SET PRICE = PRICE *(1+0.06) WHERE JNO = J4 AND SNO = S5; 将工程名为“明珠线”的所有 供应数提高10%。 UPDATE SPJ SET QTY = QTY * 1.1 WHERE JNO IN (SELECT JNO FROM J WHERE JNAME = 明珠 线); 当S3提供的P5零件的单价低于该零 件的平均单价时,将其提高6。 UPDATE SPJ SET PRICE = PRICE * 1.06 WHERE SNO = S3 AND PNO = P5 AND PRICE SCROLL CURSOR FOR END_EXEC 与452节中游标定义语句相比,这里只是 多了个关键字“SCROLL”。 滚动游标的打开和关闭语句与4.52节中一样。 (2)滚动游标的推进句法如下: NEXT 表示把游标从当前位置推进一行 PRIOR 表示把游标从当前位置返回一行; FIRST 表示把游标移向查询结果的第一行; LAST 表示把游标移向查询结果的最后一行。 RELAIVE 3 表示把游标从当前位置推进3行 RELATIVE 5 表示把游标从当前位置返回5行; ABSOLUTE 4 表示把游标移向查询结果的第4行 ABSOLUTE 6 表示把游标移向查询结果的倒数第 6行 4.5.4 动态 SQL语句 前面提到的嵌人式SQL语句都必须在源程序中 完全确定,然后再由预处理程序预编译和宿主语言 编译程序编译。在实际问题中,源程序往往还不能 包括用户的所有操作,用户对数据库的操作有时在 系统运行时才能提出来,这时要用到嵌人式SQL的动 态技术才能实现。 动态 SQL技术主要有两个 SQL语句: (1)动态SQL预备语句。 EXEC SQL PREPARE 动态SQL语句名 FROM 共享变量或字符串 这里共享变量或字符串的值应是一个完整的 SQL语句。这个语句可以在程序运行时由用户输人才 组合起来。此时,这个语句并不执行。 (2)动态SQL执行语句。 EXEC SQL EXECUTE 动态SQL语句名 动态 SQL语句使用时,还可以有两点改进: (1)当预备语句中组合而成的 SQL语句只需执 行一次时,那么预备语句和执行语句可合并成一个语 句: EXEC SQL EXECUTE IMMEDIATE 共享变 量或字符串 (2)当预备语句中组合而成的 SQL语句的条件 值尚缺时,可以在执行语句中用 USING短语补上 EXEC SQL EXECUTE 动态SQL语句名 USING 共享变量 例428 下面两个C语言的程序段说明了 动态SQL语句使用技术。 (1) EXEC SQL BEGIN DECLARE SECTION; char * query; EXEC SQL END DECLARE SECTION; scanf(”%s”,query); *从键盘输人一个SQL语句* EXEC SQL PREPARE QUE FROM :query; EXEC SQL EXECUTE que; 这个程序段表示从键盘输人一个SQL语句到 字符数组中。字符指针query指向字符串的第1个字 符。 如果执行语句只做一次,那么程序段最后 两个语句可合并成一个语句: EXEC SQL EXECUTE IMMEDIATE :query; (2) char *query = “ UPDATE SPJ SET QTY = QTY * 1.3 WHERE SNO = ?”; EXEC SQL PREPARE dynprog FROM :query; char sno5 = “s2”; EXEC SQL EXECUTE dynprog USING :sno; 这里第一个char语句表示用户组合成一个 SQL语句,但有一个值(供应商号)还不能确定, 因此用“?”表示。第二个语句是动态SQL预备 语句。第三个语句(char语句)表示取到了供应 商号的值。第四个语句是动态SQL执行语句, “?”值到共享变量sno中取。 通过两个程序来看SQL语句在应用程序中的 使用方法: (1)使用嵌入式SQL语句:我们来看一个完整的 程序,它是用C语言写成的,中间嵌有SQL语句,完 成仓库关系的数据载入工作,用户根据程序的提示 ,分别输入仓库号、城市和面积字段的值,然后 INSERT语句将这些值插入仓库关系,程序用CTL-C结 束。下面是C语言写的完整程序: 1: #include “stdio.h” 2: EXEC SQL BEGIN DECLARE SECTION; 3: VARCHAR uid20; 4: VARCHAR pwd20; 5: VARCHAR whnumb10; 6: VARCHAR city12; 7: int wh_area; 8: EXEC SQL END DECLARE SECTION; 9: EXEC SQL INCLUDE SQLCA; 10: 11: main() 12: 13: /*log into ORACLE */ 14: strcpy(uid.arr,”CUI”); 15: uid.len=strlen(uid.arr); 16: strcpy(pwd.arr,”WEI”); 17: pwd.len=strlen(pwd.arr); 18: 19: EXEC SQL CONNECT :uid IDENTIFIED BY :pwd; 20: printf(“Connect to ORACLE user:%sn”,uid.arr); 21: printf(“用CTL-C 结束程序 nn”); 22: while(1) 23: 24: printf(“输入仓库号:”); 25: scanf(“%s”,whnumb.arr); 26: whnumb.len=strlen(whnumb.arr); 27: printf(“输入城市名:”); 28: scanf(“%s”,city.arr); 29: city.len=strlen(city.arr); 30: printf(“输入仓库面积:”); 31: scanf(“%d”, 32: 33: EXEC SQL INSERT INTO 仓库 34: (仓库号,城市,面积) 35: VALUES(:whmumb,:city,:wh_area); 36: EXEC SQL COMMIT WORK RELEASE; 37: printf(“加入了一个仓库记录。nn”); 38: 39: EXEC SQL COMMIT WOR RELEASE; 40: exit(0); 41: 下面解释一下程序中的有关语句: 第28行是主变量说明,其中类型符VARCHAR是SQL 提供的变长字符串类型。比如: VARCHAR uid20 等价于 struct un

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论