1.数据更新
1.1.插入数据
SQL的数据插入语句INSERT通常有两种形式子查询不仅可以嵌套在SELECT语句中,用以构造父查询的条件(如3.3.3节所述),也可以嵌套在INSERT语句中,用以生成要插入的批量数据
插入子查询结果的INSERT语句的格式为:
INSERT
INTO<表名>[(<属性列1>[,<属性列2>…])
子查询:
例3 对每一个系,求学生的平均年龄,并把结果存入数据库
首先在数据库中建立一个新表,其中一列存放系名,另一列存放相应的学生平均年龄
CREATE TABLE Deptage
(Sdept CRAR(15)
Avgage SMALLINT),
然后对Student表按系分组求平均年龄,再把系名和平均年龄存入新表中
INSERT
INTO Deptage(Sdept,Avgage)
SELECT Sdept,AVG(Sage)
FROM Studem
ROUP BY Sdept;
插入单个元组的INSERT语句的格式为:
INSERT
INTO<表名>[(<属性列1>[,<属性列2>…])
VALUES(<常量1>[,<常量2>]…);
其功能是将新元组插入指定表中其中新记录属性列1的值为常量1,属性列2的值为常量2,…INTO子句中没有出现的属性列,新记录在这些列上将取空值但必须注意的是,表定义时说明了NOT NULL的属性列不能取空值否则会出错
如果INTO子句中没有指明任何列名,则新插入的记录必须在每个属性列上均有值
例1 将一个新学生记录(学号:95020;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中
INSERT
INTO Student
VALUES('95020','陈冬','男','IS',18);
例2 插入一条选课记录(950217,q,)',
INSERT
INTO SC(Sno,Cno)
VALUES('95020','1');
新插入的记录在Grade列上取空值
子查询不仅可以嵌套在SELECT语句中,用以构造父查询的条件(如3.3.3节所述),也可以嵌套在INSERT语句中,用以生成要插入的批量数据
插入子查询结果的INSERT语句的格式为:
INSERT
INTO<表名>[(<属性列1>[,<属性列2>…])
子查询:
例3 对每一个系,求学生的平均年龄,并把结果存入数据库
首先在数据库中建立一个新表,其中一列存放系名,另一列存放相应的学生平均年龄
CREATE TABLE Deptage
(Sdept CRAR(15)
Avgage SMALLINT),
然后对Student表按系分组求平均年龄,再把系名和平均年龄存入新表中
INSERT
INTO Deptage(Sdept,Avgage)
SELECT Sdept,AVG(Sage)
FROM Studem
ROUP BY Sdept;
1.2.修改数据
S修改操作语句的一般格式为:
UPDATE <表名>
SET<列名>=<表达式>[,<列名>=<表达式>]…
[WHERE<条件>];
其功能是修改指定表中满足WHERE子句条件的元组其中SET子句给出<表达式>的值用于取代相应的属性列值如果省略WHERE子句,则表示要修改表中的所有元组
修改操作语句的一般格式为:
UPDATE <表名>
SET<列名>=<表达式>[,<列名>=<表达式>]…
[WHERE<条件>];
其功能是修改指定表中满足WHERE子句条件的元组其中SET子句给出<表达式>的值用于取代相应的属性列值如果省略WHERE子句,则表示要修改表中的所有元组
一、修改某一个元组的值
例4 将学生95001的年龄改为22岁
UPDATE Student
SET Sage=22
WHERE Sno='95001';
二、修改多个元组的值
例5 将所有学生的年龄增加1岁
UPDATE Student
SET Sage=Sage+l
三、带子查询的修改语句
子查询也可以嵌套在UPDATE语句中,用以构造修改的条件
例6 将计算机科学系全体学生的成绩置零
UPDATE SC
SET Grade=O
WHERE 'CS'=
(SELETE Sdept
FROM Student
WHERE Student.Sno=SC.Sno);
3.4.3删除数据
删除语句的一般格式为:
DELETE
FROM<表名>
[WHERE<条件>];
DELETE语句的功能是从指定表中删除满足WHERE子句条件的所有元组如果省略WHERE子句,表示删除表中全部元组,但表的定义仍在字典中也就是说,DELETE语句删除的是表中的数据,而不是关于表的定义
一、删除某一个元组的值
例7 删除学号为95019的学生记录
DELETE
FROM Student
WHERE Sno='95019':
二、删除多个元组的值
例8 删除所有的学生选课记录
DELETE
FROM SC
三、带子查询的删除语句
子查询同样也可以嵌套在DELETE语句中,用以构造执行删除操作的条件
例9 删除计算机科学系所有学生的选课记录
DELETE
FROM SC
WHERE 'CS'=
(SELETE Sdept
FROM Student
WHERE Student.Sno=SC.Sno);
S四、更新操作与数据库的一致性
增删改操作只能对一个表操作这会带来一些问题例如,比如95019学生被删除后,有关其选课信息也应同时删除,而这只能通过两条语句进行
第1条语句删除95019学生:
DELETE
FROM Student
WHERE Sno='95019';
第2条语句删除95019学生的选课记录:
DELETE
FROM SC
WHERE Sno='95019';
在执行了第1条DELETE语句之后,数据库中的数据已处于不一致状态,因为这时实际上已没有学号为95019的学生了,但SC表中仍然记录着关于95019学生的选课信息,即数据的参照完整性受到破坏只有执行了第2条DELETE语句之后,数据才重新处于一致状态但如果执行完-条语句之后,机器突然出现故障,无法再继续执行第2条UPDATE语句,则数据厍中的数据将永远处于不一致次状态因此必须保证这两条语句要么都做,要么都不做为解决这一问题,数据库系统通常都引入了事务(Transaction)的概念,将在第七章详细介绍
在2.3节"关系的完整性"中已讲到,实体完整性和参照完整性是关系模型必须满足的完整性约束条件,应该由关系系统自动支持
当向参照表中插入元组,如往SC中插入选课记录('95020','1'),系统将自动地检查被参照表(Student和Course)中是否存在相应的元组(95020号学生的记录,1号课程的记录),如果都存在则操作成功,否则操作失败
当删除主表中的元组(如学生95019),可以有以下的策略:
(1)系统自动地删除参照表(如SC)中相应的元组(学生95019的选课记录)
(2)系统检查参照表中是否存在相应的元组,如果存在,则操作失败
各种数据库产品提供了不同的实现策略
3.5 视 图
视图是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制
视图是从一个或几个基本表(或视图)导出的表,它与基本表不同,是一个虚表数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化
视图一经定义,就可以和基本表一样被查询、被删除,我们也可以在一个视图之上再定义新的视图,但对视图的更新(增加、删除、修改)操作则有-定的限制
本节专门讨论视图的定义、操作及优点
1.3.删除数据
一、删除某一个元组的值
例7 删除学号为95019的学生记录
DELETE
FROM Student
WHERE Sno='95019':
二、删除多个元组的值
例8 删除所有的学生选课记录
DELETE
FROM SC
三、带子查询的删除语句
子查询同样也可以嵌套在DELETE语句中,用以构造执行删除操作的条件
例9 删除计算机科学系所有学生的选课记录
DELETE
FROM SC
WHERE 'CS'=
(SELETE Sdept
FROM Student
WHERE Student.Sno=SC.Sno);
四、更新操作与数据库的一致性
增删改操作只能对一个表操作这会带来一些问题例如,比如95019学生被删除后,有关其选课信息也应同时删除,而这只能通过两条语句进行
第1条语句删除95019学生:
DELETE
FROM Student
WHERE Sno='95019';
第2条语句删除95019学生的选课记录:
DELETE
FROM SC
WHERE Sno='95019';
在执行了第1条DELETE语句之后,数据库中的数据已处于不一致状态,因为这时实际上已没有学号为95019的学生了,但SC表中仍然记录着关于95019学生的选课信息,即数据的参照完整性受到破坏只有执行了第2条DELETE语句之后,数据才重新处于一致状态但如果执行完-条语句之后,机器突然出现故障,无法再继续执行第2条UPDATE语句,则数据厍中的数据将永远处于不一致次状态因此必须保证这两条语句要么都做,要么都不做为解决这一问题,数据库系统通常都引入了事务(Transaction)的概念,将在第七章详细介绍
在2.3节"关系的完整性"中已讲到,实体完整性和参照完整性是关系模型必须满足的完整性约束条件,应该由关系系统自动支持
当向参照表中插入元组,如往SC中插入选课记录('95020','1'),系统将自动地检查被参照表(Student和Course)中是否存在相应的元组(95020号学生的记录,1号课程的记录),如果都存在则操作成功,否则操作失败
当删除主表中的元组(如学生95019),可以有以下的策略:
(1)系统自动地删除参照表(如SC)中相应的元组(学生95019的选课记录)
(2)系统检查参照表中是否存在相应的元组,如果存在,则操作失败
各种数据库产品提供了不同的实现策略
2.课外阅读
PowerBuilder查询功能的实现
所属类别:
Power Builder
数据库
编号:QA000142
建立日期: 1998年11月27日 最后修改日期:1998年11月27日
钟楚敏:
目 前 我 正 在 开 发 一 个 人 事 薪 资 管 理系 统 , 而 我 曾 试 过 种 种 尝 试 , 却 几 乎 什 麽 功 能 也 实 现 不 了 , 实 在 没 撤 , 只 好 求 助 于 您 , 希 望能 得 到 您 帮 助 和 指 教 , 不 胜 感 激 ! 现 所 开 发 的 这 个 人 事 薪 资 管 理 系 统 是 基 于 Win95/Win NT操作 系 统 , 采 用 Power Builder 5.0自 带 的 Sybase SQL Anywhere 5.0后 端 数 据 库 接 口 平 台 ; 目前 是 在 简 体 Win98环 境 下 开 发 作 为 一 个 初 学 者 , 存 在 的 问 题 实 在 太 多 , 这 里 主 要 存 在 的 问 题有 :
1.查 询 功 能 的 难 以 实 现 因 为 自 已 学 习 的 还 不 够 深 入 , 对 PB的 一些 语 法 机 制 还 不 尽 熟 悉
, 我 曾 试 过 种 种 方 案 , 却 难 以 如 愿 地 实 现 查 询 功 能 , 当 然 , 如 果查 询 不 能 很 好 地 实 现
, 其 他 的 诸 如 数 据 统 计 等 功 能 便 难 以 展 开 , 您 说 对 不 ?
2.作 为 开 发 出 来 的 一 个 好 的 数 据 库 产 品 , 其 维 护 方 面 当 是 较 为 容易 的 为 此 , 在 开 发 过
程 中 , 可 以 设 置 外 部 键 将 两 表 关 联 但 我 在 PB开 发 过 程 中 发 现 ,若 选 取 已 连 接 好 后 的
两 表 中 的 若 干 字 段 创 建 一 DataWindow, 如 果 其 中 包 含 有 Blob列 字段 , 则 预 览 该 Datawind
ow或 运 行 应 用 程 序 后 , 当 执 行 到 用 该 Datawindow作 为 数 据 源 的 Window时 , 则 出 错 , 显
示 的 出 错 信 息 是 : Syntax error near '(end of line)', 并 且 Window中 的 一 些 按 钮 也 不 能 正 常 使 用 , 这 是 何 原 因 , 有 没 有 办 法 改 善 , 使 之 既 能 实 现 预 期 的功 能 , 又 能 避 免 这 一 情 形 发 生
3.由 于 工 作 的 需 要 , 得 将 单 位 员 工 的 照 片 存 入 数 据 库 , 以 便 实 现员 工 照 片 的 查 询 检 索 但 在 具 体 的 操 作 过 程 中 , 发 现 原 本 很 清 晰 的 照 片 文 件 存 入 数 据 库 后 , 一是 照 片 所 占 内 存 增 大 , 二 是 所 看 到 的 图 象 效 果 已 失 真 , 请 问 这 是 否 正 常 , 若 不 正 常 , 有 没 有办 法 使 一 幅 照 片 存 入 数 据 库 后 , 看 到 的 图 象 视 觉 效 果 良 好
具 体 存 在 的 问 题 和 应 用 程 序 请 阅 附 件 文 件 rsgz.zip
回答:
我 认 为 一 般 来 说 查 询 不 是 系 统 的 核 心 , 数据 处 理 才 是 核 心 , 对 于 某 些 侧 重 于 统 计 分 析 的 系 统 , 则 需 要 强 化 查 询 的 功 能 . 建 议 你 在 学 习过 程 中 , 参 考 PB的 sample code建 立 适 合 你 所 需 要 的 模 板 Window, 一 般 的 查 询 不 需 要 更 新 数 据库 , 只 有 考 虑 单 DW的 查 询 和 Master-Detail的 查 询 即 可 . 在 以 后 建 立 新 的 Window, 从 模 板 继 承 . 一 般 查 询 所 要 求 具 有 的 功 能 无 非 是 : Query(带 参 数 或 不 带 参 数 ), Sort, Filter, Print. 都 有 相 应 的 函 数 , 工 作 量 不 太 大 .
Blob我 没 用 过 , 好 象 DW的 Select clause中 不 能 包 括 Blob字 段 , 你的 例 子 程 序 中 也 没 有 将 Blob字 段 作 为 DW的 一 个 column, 而 是 在 detail band加 一 个 对 象 来 对 应 Blob字 段 请 参 考 随 机 手 册 中 关 于 Blob的 使 用 部 分
由 于 我 用 的 是 PB6, 你 的 Exe不 能 运 行 , 而 从 你 的 源 程 序 运 行 , 没看 到 照 片 , 不 知 效 果 也 没 什 么 建 议 , 见 谅
大 致 看 了 你 的 源 程 序 , 想 提 一 些 建 议 :
1. 你 建 了 一 个 Table存 放 登 录 用 户 信 息 , 但 password字 段 是 明 文 , 建 议 用 一 单 向 陷 门 函 数 加 密 后 存 入 数 据 库
2. 建 议 主 窗 口 在 登 录 后 保 持 open状 态 , 直 至 用 户 退 出 , 同 时 关 闭登 录 窗 口 (至 少 应 Hide)