SQL Foundation(24--30)

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';

你可能感兴趣的:(SQL Foundation(24--30))