复制代码
    
Oracle学习系列7
************************************************************************************
            
关联表的约束:
    强制删除关联表中的父表:
        drop table tab_name cascade constraint ; 
        
    约束本身是可以修改的,但是不建议修改约束
    

知识点:
        
        1,掌握视图的作用及定义
        2,掌握序列的使用:SEQUENCE
        3,掌握PowerDesigner设计工具的使用
        4,了解同义词,了解用户管理,了解嵌套表及可变数组
        5,理解数据库的设计范式


--------------------------------------------------------

        1,视图:
            
                封装了一条复杂的查询语句
                
            语法:
            
                create view view_name 
                    as 子查询  
                    {with check option | with read only } ; //不能更新视图的创建条件,不能更改视图数据
                    
            建立一个视图,此视图包含了全部部门20的信息:
                create view view_emp20 
                    as  
                        select  empno,ename, job,hiredate 
                            from emp 
                                where deptno=20 ;
                                
            查询视图:
                
                sele * from view_emp20 ;
                
            删除视图:
            
                drop view view_name ;
                
                ex: 
                    drop view view_emp20 ;
                
                
            完整语法格式:
            
                create or replace view  view_name
                    as 子查询   //系统会为用户自动进行删除及重建的功能
                    
                    
            ex:
                create or replace view view_emp20
                    as 
                        select d.dname, count(e.empno), avg(e.sal), avg(months_between(sysdate,e.hiredate)/12) years
                            from emp e, dept d
                                where e.deptno=d.deptno
                                     group by d.dname ;
                
                更新视图:
                    
                        修改视图中7369的部门编号:
                            update view_emp20 
                                set deptno=30
                                    where empno=7369; //提示更新成功,但是视图表中无编号7369的雇员


--------------------------------------------------------
序列(重点)

    在oracle完成自动序列增长的功能,则只能依靠序列完成
    格式:
            
        create sequence  seq_name 
            [increment by n] [start with n]
            [{maxvalue n |nomaxvalue}]
            [{minvalue n | nominvalue }]
            [{cycle | nocycle}]
            [{cache n | nocache }];
            
        删除:
            drop sequence seq_name
        
        
        
        
        
        ex:创建一个myseq的序列,验证自动增长的操作:
        
            create sequence myseq  increment by 2;
            
            在序列中提供两种操作:
                nextVal:取得序列的下一个内容
                currVal:取得序列的当前内容
                
                
            创建表test_seq:
                create table test_seq(
                 
                        curr number,
                        next number
                
                );
                                                                                
            使用序列:
                insert into test_seq(curr,next)
                    values(myseq.currval,myseq.nextVal)  ;

--------------------------------------------------------
同义词(了解):
        
        功能:可以让其他用户通过一个名称方便的访问‘user.table_name’.
        
        语法:
        
            create  synonym  syn_name  for  user.tab_name  ; //建立
            
            drop  synonym syn_name ;   //删除
            
        ex: create synonym   dual  for sys.dual ;
            
            ------------------------------------------
        
            select  sysdate from dual ;//dual是张虚拟表
            
            conn sys/change_on_install as sysdba ;
            select * from tab 
                where TNAME='DUAL';//在sys用户下存在此表
                

--------------------------------------------------------
用户管理(了解):

        语法:    
            create user user_name  identified by passwd //创建用户(sys用户权限)
                [default tablespace  default_tablespace]
                [temporary tablespace  temporary_tablespace ]
                
            grant 权限1,权限2,权限3.. to user ;//给用户授权   create session
            
            alter user user_name identified by passwd_new ; //修改用户密码
            
         eg:
             create user kevin  identified by root ;
            grant  conncet, resource to kevin ; 
            
        角色:connect 、resource   //每个角色有好多不同的权限
/锁住用户:
            alter user user_name  account  lock /unlock;
            
            eg: 
                alter user kevin account lock /unlock ;
                
                
                
                授权emp表:
                    grant 权限1,权限2  on   user_name.tabl_name  to user_name ;
            将scott用户下的emp表的查询权限及删除权限给kevin:
                    grant select ,delete on scott.emp to kevin;
                    
                    
                回收权限:
                    
                    revoke 权限1,权限2,.. on  user.tab_name  from user_name ;
                    
                    eg:
                        revoke select ,delete on scott.emp from kevin ;
                                                     
                                        
        grant/(revoke)  权限1,权限2,权限3   on  user.tab_name  to / (from)  user_name ;                    
                                                    
--------------------------------------------------------

数据库的备份与恢复(了解):

        数据库备份: exp
        
                D:\data>exp         
                
        数据库恢复:    imp        
                        
                D:\data>impf    

        查看错误:show error 
--------------------------------------------------------
嵌套表(了解):

            在一个表中包含另外一个子表
        //创建project_ty类型
        create type project_ty as object(
        
                proid number(4),
                proname  varchar(50),
                prodate date 
        
        ) ;
        /                 //最后一个‘/' 不可少
        
        
        //使用porject_nt类型
        create type project_nt as table of project_ty;
         /                    //最后一个‘/' 不可少

        create table department(
        
                deptno  number(2) primary key not null,
                dname   varchar2(50) not null,
                projects   project_nt
        
            ) nested table projects store  as project_nt_tab_temp ;


        对于插入数据来讲,需要指定每个project_ty的数据类型
        insert into department(deptno,dname,projects)
            values(
                1,'技术部',
                project_nt(
                    project_ty(1001,'erp',sysdate),
                    project_ty(1002,'crm',sysdate),
                    project_ty(1003,'oa',sysdate),
                
                )
            
            );


        查询:
            select * from department ;

        若此时需要查看一个部门的全部项目的话,则需要查询嵌套表:
            select * from table( select projects from department where deptno=1 ) ;

        更新:
        update table (select projects from department where deptno=1 ) pro
            set values(pro )=project_ty('1001','测试项目',to_date('2016-02-12','yyyy-mm-dd'))
                    where pro.proid=1001 ; 


--------------------------------------------------------
可变数组(了解):
        
        属于嵌套表的升级版,在可变数组中手机上就是将内部的嵌套表的内容的长度进行了限制。
        
        //定义类型
        create type worker_info as object(
        
            id        number,
            name    varchar2(50),
            sex     varchar2(6)
        
        );
        /
        
        //定义数组类型
        create type worker_info_list as varray(10) of worker_info ;
        /


        //创建可变数组表
        create table department(
        
            deptno        number(2)    primary key not null,
            dname        varchar2(50)    not null,
            workers        worker_info_list
        
        );

        
        //插入数据
        
        insert into department(deptno,dname,workers)
            values( 20,'后勤部',
                worker_info_list(
                    worker_info(1,'dustin','F'),
                    worker_info(2,'kevin','F'),
                    worker_info(3,'allen','M')
                
                ) 
            
            );


--------------------------------------------------------

数据库设计范式(了解):

        1.第一范式(确保每列保持原子性)
        2.第二范式(确保表中的每列都和主键相关)
        3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
            

--------------------------------------------------------

数据库设计工具(重点):
            powerDesigner工具的使用
复制代码