友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

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 



注  你可以删除一个视图而不影响任何一个真实的表               这也就是为什么我们将视图称为虚 



   表的原因     虚体
返回目录 上一页 下一页 回到顶部 1 1
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!