十四、创建视图
1. 视图的概念和优点
视图是基于一个或多个表及视图的一些查询语句, 它象显示数据的视窗, 它本身是不存储数据的.
视图可以限制数据库的访问, 更好的控制权限
使用户使用简单的查询语句
数据的非依赖性
2. 创建视图的语法
SQL> CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
参数解释:
FORCE 表不存在时,视图仍然可以创建成功
WITH CHECK OPTION 只有符合视图定义的记录才能被插入或修改
WITH READ ONLY 不允许DML操作
Oracle8i以后创建视图可以用order by
3. 创建修改视图的例子
SQL> CREATE OR REPLACE VIEW salvu41 AS SELECT id, first_name FIRST,
last_name LAST, salary MONTHLY_SALARY
FROM s_emp WHERE dept_id = 41;
SQL> CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal) AS SELECT d.name, MIN(e.salary), MAX(e.salary), AVG(e.salary) FROM s_emp e, s_dept d WHERE e.dept_id = d.id GROUP BY d.name;
注意: 如果用select * from table_name创建的视图
table_name的结构改变后 view要重建或compile后才能显示新的字段内容
4. 查询视图的数据字典
SQL> set long 1600;
SQL> select view_name,text from user_views;
说明: 可以根据视图text_length来设置set long 数字;
User_updatable_columns视图能查询视图里能被修改的字段
5. 简单和复杂的视图对比
| 特 性 | 简单视图 | 复杂视图 |
| 表的数量 | 一个 | 多个 |
| 有函数吗? | 没有 | 有 |
| 有分组操作吗? | 没有 | 有 |
| 有基于视图的DML操作吗? | 有 | 没有 |
6. 在视图上可以用DML命令吗?
可以, 但有一定的限制条件
没有下面的情况, 可以删除view里的记录. group function, group by, distinct
没有上面和下面的情况, 可以修改view里的记录. 字段表达式,
例如: salary*12 含rownum的view
没有上面两种情况, 且view里含基表里所有非空字段的情况, 可以往view里插入记录.
7. 在视图里使用 WITH CHECK OPTION约束条件
SQL> create or replace view empvu41
as select * from s_emp where dept_id = 41
with check option constraint empvu41_ck;
如果运行下面命令会出错ora-01402
SQL> update empvu41 set dept_id=42 where id=16;
原因: 视图empvu41里规定只能看部门号为41的记录 修改后会把记录排除在视图empvu41以外
与它的约束条件冲突
8. 删除视图
SQL> DROP VIEW view_name;
十五、创建索引
1.索引的概念
索引是数据库里的一种数据对象
它利用B*树, hash, bitmap结构直接快速地访问数据
它和表是分开存放的两个实体
索引创建好了后, 由系统自动调用和管理
2. 什么时候创建索引?
自动创建的索引:唯一关键字, 唯一的约束条件
手工需要创建的索引:大表查询时, sql语句where后经常用到的字段或字段组合
字段内容差别很大有大量NULL值表很大, 返回记录数较少
3. B*树索引的结构
每个索引由字段值和指针或ROWID组成
4.创建索引的语法
CREATE INDEX 索引名 ON 表名 ( 字段1, [字段2, ……] ) TABLESPACE 表空间名;
5.创建索引的注意事项
创建索引时会加行级独占锁
一个表的索引最好不要超过三个 (特殊的大表除外)
最好用单字段索引
索引最好和表分不同的表空间存放
结合SQL语句的分析执行情况, 也可以建立多字段的组合索引和基于函数的索引
大表的索引会占用很大的存储空间
不要建唯一的索引, 而应该加唯一的约束条件
6.查询索引的方法
查询数据字典user_indexes和user_ind_columns
例子:
SQL> SELECT ic.index_name, ic.column_name,
2 ic.column_position col_pos,ix.uniqueness
3 FROM user_indexes ix, user_ind_columns ic
4 WHERE ic.index_name = ix.index_name
5 AND ic.table_name = 'S_EMP';
注意: 数据字典里存放的字符都是大写的.
7. 不用索引的地方
表很小
where后不经常使用的比较字段
表被频繁修改
返回记录数很多
where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件
8. 重建索引的语法
ALTER INDEX 索引名 REBUILD TABLESPACE 原来表空间名 NOLOGGING;
定期重建索引可以减少索引的碎片, 更有效地使用表空间.
9. 删除索引
SQL> drop index 索引名;
SQL> alter table 表名 drop constraint 约束名;
更多内容请看PCdog.com--数据库体系架构 数据库相关文章专题
