您的位置:首页 > 数据库

SQL Foundation(24--30)

2013-05-25 18:18 239 查看

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多个
包含函数noyes
包含分组数据noyes
是否可以在视图上DML操作yesnot 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';
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐