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

SQL 21日自学通(V3.0)(PDF格式)-第29部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!





        3    WHERE  BILLS。ACCOUNT_ID  =  BANK_ACCOUNTS。ACCOUNT_ID; 



OUTPUT 



  BILLS。NAME               BILLS。AMOUNT        BALANCE      BANK 



  Phone pany            125                 500          First Federal 



  Power pany            75                  500          First Federal 



  Record Club              25                   1200        First Investor's 



  Software pany         250                 500          First Federal 



  Cable TV pany         35                  90           Credit Union 



  Joe's Car Palace         350                 2500         Second Mutual 



  S。C。 Student Loan        200                 4500         Fidelity 



  Florida Water pany    20                  500          First Federal 



  U…O…Us Insurance pany 125                 2500         Second Mutual 



    这一过程用视图来表达则语句如下 



    INPUT/OUTPUT 



    SQL》 CREATE VIEW BILLS_DUE (NAME; AMOUNT; ACCT_BALANCE; BANK) AS 



        2      SELECT  BILLS。NAME;  BILLS。AMOUNT;  BANK_ACCOUNTS。BALANCE 



        3      BANK_ACCOUNTS。BANK  FROM  BILLS;  BANK_ACCOUNTS 



                                                                            199 


…………………………………………………………Page 200……………………………………………………………

SQL 21  日自学通(V1。0)                                                  翻译人   笨猪 



        4      WHERE  BILLS。ACCOUNT_ID  =  BANK_ACCOUNTS。ACCOUNT_ID 



    View created。 



    如果你对 BILLS_DUE 视图执行查询是使用了一些条件                    如下语句所示 



INPUT/OUTPUT 



    SQL》 SELECT * FROM BILLS_DUE 



      2   WHERE ACCT_BALANCE 》 500 



NAME                      AMOUNT       ACCT_BALANCE       BANK 



Record Club               25           1200               FirstInvestor's 



Joe's Car Palace          350          2500               SecondMutual 



S。C。 Student Loan         200          4500               Fidelity 



U…O…Us Insurance pany  125          2500               SecondMutual 



分析 



    在上述语句中 SQL 执行了好几步操作                因为 BILLS_DUE  是一个视图        不是一个真实 



的表  SQL 首先查找一个名字叫 BILLS_DUE             的表  但是没有找到         SQL  的过程可能会从 



系统表中发现 BILLS_DUE        原来是一个视图  这依据你所使用的数据库而定                      于是它对视 



图进行了诠释并形成了如下的查询语句 



    SQL》 SELECT BILLS。NAME; BILLS。AMOUNT; BANK_ACCOUNTS。BALANCE; 



        2      BANK_ACCOUNTS。BANK  FROM  BILLS;  BANK_ACCOUNTS 



        3      WHERE  BILLS。ACCOUNT_ID  =  BANK_ACCOUNTS。ACCOUNT_ID 



        4      AND  BANK_ACCOUNTS。BALANCE  》  500; 



例 10。1 



    构造一个视图以显示所有需要发送账单的州                     同时要求显示每个州的账单金额总数和 



账单的总数 



    首先  你知道 CREATE VIEW 语句看起来应该是下边的样子 



    CREATE VIEW EXAMPLE (STATE; TOTAL_BILLS; TOTAL_AMOUNT) AS。。。 



    现在你必须决定 SELECT         语句的内容      你要清楚根据需要你要选择 STATE 字段并应 



该使用 SELECT DISTINCT 语法以显示账单需要发送的州                  例如 



INPUT 



    SQL》 SELECT DISTINCT STATE FROM PANY; 



OUTPUT 



    STATE   GA  FL  CA  TX  SC  NJ  为节约宽度这里用制表符取代了段落标记 



                                                                           200 


…………………………………………………………Page 201……………………………………………………………

SQL 21  日自学通(V1。0)                                                      翻译人     笨猪 



    除了选择州字段以外  你还需要知道发往这个州的账单总数  因此 你需要归并 BILLS 



表和 PANY 表 



INPUT/OUTPUT 



SQL》 SELECT DISTINCT PANY。STATE; COUNT(BILLS。*) FROM BILLS; PANY 



        2      GROUP  BY  PANY。STATE 



        3      HAVING  BILLS。NAME  =  PANY。NAME; 



                         STATE           COUNT(BILLS。*) 



                         GA              2 



                         FL              3 



                         CA              2 



                         TX              1 



                         SC              1 



                         NJ              1 



    现在你已经成功地返回了需要的三分之二的结果                          你可以用下边的语句来最终结束这 



条语句  加入 SUM 语句以返回每个州的金额总数 



INPUT/OUTPUT 



SQL》 SELECT DISTINCT PANY。STATE; COUNT(BILLS。NAME); SUM(BILLS。AMOUNT) 



        2      FROM  BILLS;  PANY 



        3      GROUP  BY  PANY。STATE 



        4      HAVING  BILLS。NAME  =  PANY。NAME 



               STATE     COUNT(BILLS。*)      SUM(BILLS。AMOUNT) 



               GA        2                   250 



               FL        3                   445 



               CA        2                   275 



               TX        1                   35 



               SC        1                   200 



               NJ        1                   35 



    最后一步  你可以将它与最初的 CREATE VIEW 语句组合在一起 



INPUT/OUTPUT 



    SQL》 CREATE VIEW EXAMPLE (STATE; TOTAL_BILLS; TOTAL_AMOUNT) AS 



        2      SELECT  DISTINCT  PANY。STATE;  COUNT(BILLS。NAME);SUM(BILLS。AMOUNT) 



        3      FROM  BILLS;  PANY 



                                                                                 201 


…………………………………………………………Page 202……………………………………………………………

SQL 21  日自学通(V1。0)                                                  翻译人    笨猪 



        4      GROUP  BY  PANY。STATE 



        5      HAVING  BILLS。NAME  =  PANY。NAME; 



INPUT/OUTPUT 



    SQL》 SELECT * FROM EXAMPLE; 



                   STATE    TOTAL_BILLS    TOTAL_AMOUNT 



                  GA        2              250 



                  FL        3              445 



                  CA        2              275 



                  TX        1              35 



                   SC       1              200 



                  NJ        1              35 



    上边的例子向你展示了如何设计 CREATE  VIEW 语句和 SELECT 语句                      SELECT  语句 



测试代码的作用在于检查数据的返回结果是不是符合你的要求                             然后才将其最终组合来创 



建一个视图 



例 10。2 



    假设你的债权人因为你推迟付款加收 10%的服务费  而且不幸的是你在这个月的每件 



事都需要推迟        因此你想看一下需要推迟付款的债主的账号 



    归并语句在这里是非常简单的               因为你不需要使用像 SUM  或 COUNT  之类的语句 



可是你会第一次发现使用视图的好处  在视图中你可以将增加的 10%的服务费在视图中作 



为一个字段       由于这一点  你可以在视图中使用 SELECT                语句来为你计算总计的结果             语 



句如下 



INPUT 



    SQL》 CREATE VIEW LATE_PAYMENT (NAME; NEW_TOTAL; ACCOUNT_TYPE) AS 



        2    SELECT  BILLS。NAME;  BILLS。AMOUNT  *  1。10;  BANK_ACCOUNTS。TYPE 



        3    FROM  BILLS;  BANK_ACCOUNTS 



        4    WHERE  BILLS。ACCOUNT_ID  =  BANK_ACCOUNTS。ACCOUNT_ID; 



OUTPUT 



    View created。 



INPUT/OUTPUT 



    SQL》 SELECT * FROM LATE_PAYMENT 



                                                                            202 


…………………………………………………………Page 203……………………………………………………………

SQL 21  日自学通(V1。0)                                                   翻译人    笨猪 



          NAME                       NEW_TOTAL      ACCOUNT_TYPE 



          Phone pany              137。50         Checking 



          Power pany              82。50          Checking 



          Record Club                27。50          MoneyMarket 



          Software pany           275            Checking 



          Cable TV pany           38。50          Checking 



          Joe's Car Palace           385            Checking 



          S。C。 Student Loan          220            Business 



          Florida Water pany      22             Checking 



          U…O…Us Insurance pany   137。50         Business 



          Debtor's Credit Card       38。50          Savings 



在 SELECT 语句使用约束 



    在视图的 SELECT  语句中使用约束是必然的  在使用 SELECT  语句中可以应用下边这 



两个规则 



    l   你不能使用 UNION 操作 



    l   你不能使用 ORDER BY 子句  但是在视图中使用 GROUP BY 子句可以有 ORDER 



        BY 子句相同的功能 



在视图中修改数据 



    正如同你所学习过的  你可以在数据库的一个或多个表中使用视图                              你也可以在 SQL 



和数据库应用程序中使用虚表  在使用 CREATE  VIEW  SELECT  创建视图以后                        你可以用 



在第八天      操作数据      学习过的 INSERT      UPDATE 和 DELETE  语句来更新  插入            删除 



视图中的数据 



    我们在稍后讨论在视图中操作数据的限制                    下边的例子显示了如何在视图中操作数据 



    将例 10。2 中的工作继续  更新 BILLS 表中的那不幸的 10%的费用 



INPUT/OUTPUT 



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