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

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

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





据库的特权    而大众用户则只有使用 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 



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



   表的原因     虚体也使用了相同的逻辑 



使用索引 



   使用索引是另外一种让数据提供给用户的形式与它在数据库中不同的方法                     此外   索 



引可以让存储于磁盘上的数据进行重新排序  这是一些视图不具有的功能 



   在 SQL 中使用索引是其于以下几个原因 



   l  在使用 UNIQUE  关键字时强制性地保证数据的完整性 



   l  可以容易地用索引字段或其它字段进行排序 



   l  提高查询的执行速度 



什么是索引 



   可以用两种方法从数据库中获得数据 第一种方法常被称为顺序访问方式 它需要 SQL 



检查每一个记录以找到与之相匹配的  这种查找的方法效率很低                  但它是使记录准确定位 



的唯一方法     回想一下以前图书馆的卡片档案系统  假设卡片是按字母的顺序排列的                   那 



                                                            209 


…………………………………………………………Page 210……………………………………………………………

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



么在将它们抽出来后在放回卡片柜时  那么当你来到书柜的旁边以后  那么你只能从头开 



始  然后一张卡片一张卡片地看  直到找到你所需要的  当然  也许你碰巧很快就找到了 



   现在假设图书管理员将书的标题按字母顺序排列                那么通过查看目录中的书的字母顺 



序你可以很快地找到你想要的书 



   进一步设想如果管理员非常勤劳            他不但将书按标题进行了排序  而且还另外制作了 



不同的卡片柜  在那个卡片柜中他是按照作者的名字或其他的方式进行排序的                        那么这对 



于你   一个图书馆的读者来说检索信息就有了相当大的灵活性                  而且你只需要很短的时间 



就能找到你所需要的内容 



   在数据库中使用索引可以让 SQL 使用直接访问方式              SQL 采用树形结构来存储和返回 



索引数据  用以指示的数据存储在树的最末端              也就是叶子      它们被称为结点      也可以叫 



叶子    每一个结点中有一个指向其它结点的指针              结点左边的值只是它的双亲结点          结点 



右边的值则是孩子结点或叶子 



   SQL 将从根结点开始直到找到所需要的数据 



注  当查询没有使用索引的表时查询通常是全表搜索后才会得到结果  全表搜索会让数据 



   库服务程序遍历过表中的所有记录然后返回给定条件的记录                    这种方法就好比从图书 



   馆的第一号书架的第一本书找起           直到找到了你所需要的书一样  你或许会使用卡片 



   柜以更快地找到所需的书         索引可以让数据库服务程序快速地定位到表中的确定行 



   幸运的是这个树结构不需要由你来制作              你甚至不必去写从数据库的表中存储和读的 



过程  基本的 SQL 索引的语法形式如下 



INPUT/OUTPUT 



   SQL》    CREATE  INDEX  index_name 



     2  ON table_name(column_name1; 'column_name2'; 。。。) 



   像你以前多次看到的那样 索引的语法对于不同的数据库系统差别很大 例如 CREATE 



INDEX 语句在 ORACLE7  中的形式如下 



SYNTAX 



   CREATE INDEX 'schema。'index 



   ON { 'schema。'table (column '!!under!!ASC|DESC' 



             ';  column  '!!under!!ASC|DESC''  。。。) 



         |  CLUSTER  'schema。'cluster  } 



                                                               210 


…………………………………………………………Page 211……………………………………………………………

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



     'INITRANS integer' 'MAXTRANS integer' 



     'TABLESPACE tablespace' 



     'STORAGE storage_clause' 



     'PCTFREE integer' 



     'NOSORT' 



     而它在 Sybase SQL Server  中的语法形式则如下 



SYNTAX 



     create 'unique' 'clustered | nonclustered' 



                   index  index_name 



     on ''database。'owner。'table_name (column_name 



             ';  column_name'。。。) 



     'with {fillfactor = x; ignore_dup_key; sorted_data; 



                 'ignore_dup_row  |  allow_dup_row'}' 



     'on segment_name' 



     Informix SQL  解释器的命令形式则如下 



SYNTAX 



     CREATE 'UNIQUE | DISTINCT' 'CLUSTER' INDEX index_name 



     ON table_name (column_name 'ASC | DESC'; 



                                   column_name  'ASC  |  DESC'。。。) 



     注意到所有这些解释器有几点是相同的                        它们的基本开始语句都是 



     CREATE INDEX index_name ON table_name (column_name; 。。。) 



     SQL Server 和 ORACLE 允许你创建成簇的索引 这将在稍后讨论 ORACLE 和 Informix 



允许你指明列名是按升序排列还是按降序排列  我们不喜欢听到被打断的声音                                               但是请再 



一次  参考你的数据库管理系统以得到明确的关于 CREATE INDEX 的指示 



     例如  要对 BILLS 表中的 ACCOUNTID 字段创建索引  其 CREATE INDEX 语句如下 



INPUT 



     SQL》 SELECT * FROM BILLS 



OUTPUT 



                                                                                         211 


…………………………………………………………Page 212……………………………………………………………

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



               NAME                           AMOUNT        ACCOUNT_ID 



               Phone pany                   125          1 



               Power pany                   75           1 



               Record Club                     25           2 



               Software pany                250          1 



               Cable TV pany                35           3 



               Joe's Car Palace                350          5 



               S。C。 Student Loan               200          6 



               Florida Water pany           20           1 



               U…O…Us Insurance pany        125          5 



               Debtor's Credit Card            35           4 



INPUT/OUTPUT 



     SQL》 CREATE INDEX ID_INDEX ON BILLS( ACCOUNT_ID ); 



     SQL》 SELECT * FROM BILLS 



               NAME                           AMOUNT        ACCOUNT_ID 



               Phone pany                   125          1 



               Power pany                   75           1 



               Software pany                250          1 



               Florida Water pany           20           1 



               Record Club                     25           2 



               Cable TV pany                35           3 



               Debtor's Credit Card            35           4 



               Joe's Car Palace                350          5 



               U…O…Us Insurance pany        125          5 



               S。C。 Student Loan               200          6 



     直至索引被 DROP  INDEX 语句删除之前  BILLS 表是按照 ACCOUNT_ID  的顺序进行 



排序的  DROP INDEX 语句是非常清楚的 



SYNTAX 



     SQL》 DROP INDEX index_name; 



     当索引被删除以后的结果是什么样呢 



INPUT/OUTPUT 



     SQL》 DROP INDEX ID_INDEX 



     Index dropped。 



     SQL》 SELECT * FROM BILLS 



                                                                                        212 


…………………………………………………………Page 213……………………………………………………………

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



               NAME                         AMOUNT       ACCOUNT_ID 



               Phone pany                125          1 



               Power pany                75           1 



               Record Club                  25           2 



               Software pany             250          1 



               Cable TV pany             35           3 



               Joe's Car Palace             350          5 



               S。C。 Student Loan            200          6 



               Florida Water pany        20           1 



               U…O…Us Insurance pany     125          5 



               Debtor's Credit Card         35           4 



分析 



    现在的 BILLS 表是它原本的形态                使用索引不会对表中的物理存储造成影响 



    你也许想知道为什么数据库提供了索引而又允许你使用 ORDER BY 子句吧 



INPUT/OUTPUT 



    SQL》 SELECT * FROM BILLS ORDER BY ACCOUNT_ID; 



              NAME                          AMOUNT       ACCOUNT_ID 



               Phone pany                125          1 



               Power pany                75           1 



               Software pany             250          1 



               Florida Water pany        20           1 



               Record Club                  25           2 



               Cable TV pany             35           3 



               Debtor's Credit Card         35           4 



               Joe's Car Palace             350          5 



               U…O…Us Insurance pany     125          5 



               S。C。 Student Loan            200          6 



分析 



    它与使用 ID_INDEX  语句的结果是一样的                   不同之处在于当你使用 ORDER  BY  子句 



时每次运行它都需要重新进行排序                    而当你使用索引的时候              数据库会建立一个物理索引 



对象     就是前边提到的树结构  而在你每次运行查询时都访问同一个索引 



    警告    当表被删除时  所有与表相关的索引也将被删除 



                                                                                   213 


…………………………………………………………Page 214……………………………………………………………

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



使用索引的技巧 



这里给出了几个在使用索引时需要记住的技巧 



l  对于小表来说    使用索引对于性能不会有任何提高 



l  当你的索引列中有极多的不同的数据和空值时索引会使性能有极大的提高 



l  当查询要返回的数据很少时索引可以优化你的查询           比较好的情况是少于全部数据的 



  25%  如果你要返回的数据很多时索引会加大系统开销 



l  索引可以提高数据的返回速度       但是它使得数据的更新操作变慢  在对记录和索引进 



  行更新时请不要忘记这一点       如果要进行大量的更新操作  在你执行更新操作时请不 



  要忘记先删除索引      当执行完更新操作后     只需要简单的恢复索引即可  对于一次特 



  定的操作  系统可以保存删除的索引 18  个小时  在这个时间内数据更新完后你可以恢 



  复它 



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