1:Database Objects 数据库对象:
1:table
2:view
3:sequence
4:index
5:synonym 别名
view 只是声明逻辑,真正的数据存储在表上。
索引相当于目录 用于改善某些查询的性能.
表名和列名的命名规则中: 字符数要小于30个
oracle 维护的存储的信息的表:
user_objects 当前用户所拥有的所有的objects
select dbms_metadata.get_ddl('TABLE','EMP1') from dual;
以上语句有点问题,需要再查看一下;
添加外键的时候
后面加入: ON DELETE CASCADE 表示 如果 一个表中的主键删除,
相应的表引用这个表的主键为外键的表也会删除。
如果创建外键的时候加上 ON DELETE SET NULL
表示删除主表中的数据的时候,引用该表主键的外键的值 设置为null
2: 拷贝一张表
create table table [column,column...]
as subquery
注意 只有not null 能够传递到新表中,其他的 外键 主键 什么的 都不传递到新创建的表。
create table dept80 as
select employee_id, last_name, salary*12,hire_date from employee where department_id = 80;
以上语句有错误是因为 子查询中含有 salary*12
如果搞定 列用别名;
如果只是想拷贝表结构:
技巧:
create table myobj as select * from table_name where 1=0;
以上是复制一张表的表结构。
note:
子查询创建表的时候,只有not null 约束 在创建的表和原表一致,其他
主键,外键等 不拷贝。
把一张表变成只读:
只读:
alter table dept80 read only;
能够读和写
alter table dept80 read write;
永久性删除掉一张表:
drop table dept80 purge;
以上语句代表永久性的删除了一张表;
如果把一张表删除了,这样依赖的表会无效,
3:view
View存储的是查询语句,真正的数据依然在原表中。
View用途: 限制用户的数据访问
让复杂的查询更加简单
保持数据的独立性(底层的表不发生变化)
同样的数据可以以不同的view展示出来
View就好像一个接口,访问底层基表的接口。
特性 |
简单视图 |
复杂视图 |
表的数量 |
one |
多个 |
包含函数 |
no |
yes |
包含分组数据 |
no |
yes |
是否可以在视图上DML操作 |
yes |
not always |
创建视图语法:
Create [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[,alias]....)]
as subquery
[with check option [Constraint constraint]]
[with read only [Constraint constraint]]
ex:
create view empvu80 as select employee_id,last_name,salary
from employees where department_id = 80;
describe view 可以查看视图;
SQL> select TEXT from user_views 2 where view_name = 'EMPVU80';
创建的视图约束,只把原表的not null约束带过来了,primary
key , foreign key 没有带到创建的视图约束中。
关于view的修改 看联机文档 alter view 内容。
修改视图,是修改 视图的基表的数据,对于 simple view可以修改,
对于complex view 要看具体情况。
如下视图:
create view dept_sum_vu
select d.department_name ,min(e.salary),max(e.salary),
avg(e.salary) from employees e join departments d
on (e.department_id = d.department_id)
group by d.department_name;
带有下列条件关键字的view 不能修改视图内容:
1; group view(sum,avg,min,max 等)
2: group by
3:distinct
4: rownum(是一个伪列编号)
with check option clause:
create or replace view empvu20
as select * from employees
where department_id =20
with check option constraint empvu20vk
如果修改的数据 和约束有冲突,修改会报错。
加上 with read only 视图不能修改了
删除view ;
drop view view_name;
只是删除视图的查询语句,对于基表内容没有影响。
4:sequence
创建sequence语法:
CREATE SEQUENCE SEQUENCE
[INCREMENT BY n]
[start with n]
[{maxvalue n | nomaxvalue}]
[{minvalue n | nominvalue}]
[{cycle | nocycle}]
[{cache n | nocache}] 放入内存中的sequence的数量,默认是20个
创建一个sequence:
CREATE SEQUENCE myseq increment by 10 start with 120 maxvalue 9999 nocycle nocache;
select myseq.nextval from dual;
select myseq.currval from dual; 如果想获取当前值,首先调用nexval;
insert into departments(department_id,department_name,location_id)
values (myseq.nexval,'support',2500);
select myseq.curval from dual;
删除sequence drop sequence sequence_name;
5:索引( index )
index : 是为了改进一些查询的性能;
1:是一个schema 对象
2:可以帮助oracle server查询的时候提高速度
3:index像一棵树,通过rowid进行查找定位到数据块,就可以很快把数据取出来
4:index 独立于表出现,
5:通过 oracle server 自动维护。
自动创建索引:
primary key 或者 unique 约束 如果有 会自动加上索引
手工创建索引:
nonunique 索引
首先复制表:
create table copy_index as select * from employees;
create index emp_last_name_index on
copy_index(last_name);
索引的使用规则:
索引有oracle维护,在增删改的时候oracle 的工作量会相应的 增加:
在以下情况下创建索引:
每一列包含的值分散的比较广,适合索引。
男女这样的列适合 bitmap索引。
2:一列包含许多的null 值
3:一列经常在where 或者其他子句中使用
4: 表很大,但是查询的数据只占 表数据的 2% --3%适合用索引
如果查询 30% 50% 的数据不适合用索引,可以采用全表扫描。
以下条件不适合索引:
1:这一列不经常用于查询
2:表中的数据很少,全表扫描就可以了。
3:如果一个表经常更新
4:索引的列经常作为表达式的一部分,需要再进行探讨
删除索引: drop index index_name;
关于索引是一个重要的对象,以后会专门进行分析。索引就是一把双刃剑,用好了提高效率和性能,用不好,反而让oracle server 维护增加。
6: synonym : 为一个对象起一个别名
创建别名:
create [public] synonym synonym_name for object_name;
如果加上public表示所以schema都可以看到,如果不加表示只有当前
schema可以看到。
用法:
create synonym tt for copy_index ;
select * from tt;
删除别名: drop synonym synoym_name;
SQL> select TEXT from user_views 2 where view_name = 'EMPVU80';