按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
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'。。。)
注意到所有这些解释器有几点是相同的