友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第40部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
SQL》 CREATE VIEW LATE_PAYMENT AS
2 SELECT * FROM BILLS;
SQL》 UPDATE LATE_PAYMENT
2 SET AMOUNT = AMOUNT * 1。10;
203
…………………………………………………………Page 204……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
SQL》 SELECT * FROM LATE_PAYMENT;
NAME NEW_TOTAL ACCOUNT_ID
Phone pany 137。50 1
Power pany 82。50 1
Record Club 27。50 2
Software pany 275 1
Cable TV pany 38。50 3
Joe's Car Palace 385 5
S。C。 Student Loan 220 6
Florida Water pany 22 1
U…O…Us Insurance pany 137。50 5
Debtor's Credit Card 38。50 4
为了验证结果确实已经进行了更新 我们在一次在 BILLS 表中运行查询
INPUT/OUTPUT
SQL》 SELECT * FROM BILLS
NAME NEW_TOTAL ACCOUNT_ID
Phone pany 137。50 1
Power pany 82。50 1
Record Club 27。50 2
Software pany 275 1
Cable TV pany 38。50 3
Joe's Car Palace 385 5
S。C。 Student Loan 220 6
Florida Water pany 22 1
U…O…Us Insurance pany 137。50 5
Debtor's Credit Card 38。50 4
现在我们从视图中删除一行
INPUT/OUTPUT
SQL》 DELETE FROM LATE_PAYMENT
2 WHERE ACCOUNT_ID = 4;
SQL》 SELECT * FROM LATE_PAYMENT;
NAME NEW_TOTAL ACCOUNT_ID
Phone pany 137。50 1
Power pany 82。50 1
Record Club 27。50 2
204
…………………………………………………………Page 205……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
Software pany 275 1
Cable TV pany 38。50 3
Joe's Car Palace 385 5
S。C。 Student Loan 220 6
Florida Water pany 22 1
U…O…Us Insurance pany 137。50 5
最后一步是测试 UPDATE 函数 为 BILLS 表中所有的 NEW_TOTAL 中大于 100 的增
加 10
INPUT/OUTPUT
SQL》 UPDATE LATE_PAYMENT
2 SET NEW_TOTAL = NEW_TOTAL + 10
3 WHERE NEW_TOTAL 》 100;
SQL》 SELECT * FROM LATE_PAYMENT;
NAME NEW_TOTAL ACCOUNT_ID
Phone pany 147。50 1
Power pany 82。50 1
Record Club 27。50 2
Software pany 285 1
Cable TV pany 38。50 3
Joe's Car Palace 395 5
S。C。 Student Loan 230 6
Florida Water pany 22 1
U…O…Us Insurance pany 147。50 5
在视图中修改数据的几个问题
你大概已经看到了 视图其实就是一组表的映射 所以想要修改下层表的数据并不会
总是像上例那样直接 下面给出了你在使用视图进行工作时常用会遇到的限制
l 对于多表视图你不能使用 DELETE 语句
l 除非底层表的所有非空列都已经在视图中出现 否则你不能使用 INSERT 语句
有这个限制的原因是 SQL 不知道应该将什么数据插入到 NOT COLUMNS 限制列
中 没有在视图中出现的
l 如果对一个归并的表格插入或更新记录 那么所有被更新的记录必须属于同一个
205
…………………………………………………………Page 206……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
物理表
l 如果你在创建视图时使用了 DINTINCT 子句 那么你就不能插入或更新这个视图
中的记录
l 你不能更新视图中的虚拟列 它是用计算字段得到了
通用应用程序的视图
下边有几个视图需要完成的任务
l 提供了用户安全功能
l 可以进行单位换算
l 创建一个新的虚拟表格式
l 简单的结构化复合查询
视图与安全性
尽管我们需要在第 12 天的 数据库安全 中才会完全地讨论数据库的安全性 但是在
本题目下我们先来大致谈一谈如何使用视图的安全性功能
所有的关系型数据库在今天都有着完善的内置的安全性特性 数据库系统的用户通常
会根据他们所使用的数据库来分成不同的组 常用组的类型有数据库管理员 database
administrators 数据库开发员 database developers 数据录入人员 data entry personnel
和大众用户 不同的组在使用数据库时有着不同的权限 数据库管理员具有系统的完全控
制权限 包括更新 UPDATE 插入 INSERT 删除 DELETE 修改 ALTER 数
据库的特权 而大众用户则只有使用 SELECT 语句的权利 — — 或许是只有对特定的数据库
使用特定的 SELECT 语句的权利
视图通常用在对用户访问数据进行控制的场所 例如 如果你只想让用户访问 BILLS
表中的 NAME 字段 你需要创建一个名字叫 BILLS_NAME 的视图
INPUT/OUTPUT
SQL》 CREATE VIEW BILLS_NAME AS SELECT NAME FROM BILLS
具有系统管理员权限的人也可以使用具有公共组 SELECT 权限的 BILLS_NAME 该
组没有任何对下层 BILLS 表的权限 如你所料 SQL 也提供了可以使用的数据安全语句
现在你要知道的是视图对于实现数据库的安全有相当大的用处
206
…………………………………………………………Page 207……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
在单位换算中使用视图
视图在你提供给用户的数据与数据库中的真实数据不同时也相当有用 例如 如果
AMOUNT 字段实际上存储于美国 加拿大的用户不想频繁地进行美元与加拿大元之间的
转换工作 那么你可以创建一个叫 CANADA_BILLS 的视图
INPUT/OUTPUT
SQL》 CREATE VIEW CANADIAN_BILLS (NAME; CAN_AMOUNT) AS
2 SELECT NAME; AMOUNT / 1。10
3 FROM BILLS
SQL》 SELECT * FROM CANADIAN_BILLS
NAME CAN_AMOUNT
Phone pany 125
Power pany 75
Record Club 25
Software pany 250
Cable TV pany 35
Joe's Car Palace 350
S。C 。 Student Loan 200
Florida Water pany 20
U…OUs Insurance pany 125
分析
当进行类似这样的单位转换时 要注意当计算字段创建一个列时修改底层表的数据时
可能带来的问题 与往常一样 你应该查看你的数据库系统的相关文档看一看你的系统上
的 CREATE VIEW 命令是如何执行了
在视图中使用简单的结构化复合查询
视图在你需要按次序运行一系列查询以后得到某个结果的情况下也很有用 下边的例
子显示了如何在这种情况下使用视图
如果想找出所有发给德克萨斯州的账单金额少于 50 美元的银行的名字 你可以把这个
问题分解成如下的两个问题
l 得到所有发给德克萨斯州的账单
207
…………………………………………………………Page 208……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
l 找出账单中金额小于 50 美元的记录
让我们用两个分开的视图 BILLS_1 和 BILLS_2 来解决这两个问题
INPUT/OUTPUT
SQL》 CREATE TABLE BILLS1 AS
2 SELECT * FROM BILLS
3 WHERE AMOUNT 《 50;
SQL》 CREATE TABLE BILLS2 (NAME; AMOUNT; ACCOUNT_ID) AS
2 SELECT BILLS。* FROM BILLS; PANY
3 WHERE BILLS。NAME = PANY。NAME AND PANY。STATE = 〃TX〃;
分析
因为你想找的是所有发给德州的账单和所有账单中小于 50 美元的账单 你现在可以使
用 SQL 中的 IN 子句来找出所有在 BILLS1 中发往德州的账单 这个信息来创建一个名字
叫 BILLS3 的视图
INPUT/OUTPUT
SQL》 CREATE VIEW BILLS3 AS
2 SELECT * FROM BILLS2 WHERE NAME IN
3 (SELECT * FROM BILLS1);
现在将上述查询与 BANK_ACCOUNT 表进行合并以得到最初想要的结果
INPUT/OUTPUT
SQL》 CREATE VIEW BANKS_IN_TEXAS (BANK) AS
2 SELECT BANK_ACCOUNTS。BANK
3 FROM BANK_ACCOUNTS; BILLS3
4 WHERE BILLS3。ACCOUNT_ID = BANK_ACCOUNTS。ACCOUNT_ID
SQL》 SELECT * FROM BANK_IN_TEXAS;
BANK
Credit Union
分析
如你所见 当把一个查询分解成几个视图以后 最后的查询就非常简单了 当然 使
用一个视图也经常是必需的
208
…………………………………………………………Page 209……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
删除视图语句
就像每一个 CREATE 语句一样 CREATE VIEW 语句对应的也与 DROP VIEW 语句相
对应 其语法形式如下
SQL》 DROP VIEW view_name
在使用它的时候需要记住 DROP VIEW 命令会使所有与 DROP 视图相关联的视图不
能正常运行 一些数据库系统甚至会将所有与要 DROP 的视图相关联的视图也删除掉 在
Personal Oracle7 中 如果你将 BILLS1 删除 那么最终的查询将会返回下边的错误
INPUT/OUTPUT
SQL》 DROP VIEW BILLS1;
View dropped。
SQL》 SELECT * FROM BANKS_IN_TEXAS;
ERROR at line 1:
ORA…04063: view 〃PERKINS。BANKS_IN_TEXAS〃 has errors
注 你可以删除一个视图而不影响任何一个真实的表 这也就是为什么我们将视图称为虚
表的原因 虚体
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!