數據庫對象的創建和管理


--數據庫對象的創建和管理 DDL(數據定義語言)
    --表(table): 數據庫存儲的基本單元;
    --約束條件(constraint):用來確保數據庫中數據的完整性,確保數據滿足某些特定的商業規則
    --視圖(view):一個或多個表的邏輯表示或虛擬表示,主要用於簡化查詢操作
    --索引(index):用於加速數據訪問數據庫對象,提高訪問效率
    --序列(sequence):用於生成唯一數字值的數據庫對象,序列的生成機制會自動生成順序遞增的數字,可以用來作為數據表的主鍵值
    --同義詞(synonym):對象別名

    --數據類型: char,varchar,number,date,timestamp(默認的顯示格式:DD-Mon-RR HH12.MI.SS AM)
    --             blob(二進制數據大對象類型) clob(字符大對象類型 <=4GB) bfile(數據庫外部二進制文件)

    --數據字典  一些只讀的表和視圖
        --可參考http://www.cnblogs.com/jonescheng/archive/2008/03/24/1119380.html
        --racle中的數據表可以分為兩大類:用戶表和數據字典表.用戶表:用戶創建和維護,
        --數據字典表:由Oracle數據庫自己創建和維護,存放數據庫自身信息,包括描述數據庫和它所有對象的信息,
        --以及一些統計分析數據庫的視圖等.
        --命名規則
        --DBA_***:指整個數據庫包含的對象信息
            --DBA_TABLES:數據庫中全部數據表  select count(1) from dba_tables; ==>2784
            --DBA_OBJECTS:數據庫中全部對象  select * from dba_objects where owner ='SCOTT'; 
            --SCOTT創建的所有表和索引都在里面
            --DBA_DATA_FILES:數據庫文件信息
        --ALL_**用戶可以訪問的對象信息   除了當前用戶自己方案中的表外,還可以訪問其它用戶方案下有權限的表
            --ALL_TABLES;
            --ALL_INDEXES;
            --ALL_OBJECTS;
        --USER_***用戶自己方案下的數據表
            --USER_TABLES;
            --USER_VIEWS;
            --USER_OBJECTS;
        --查詢數據字典  
            describe dictionary; 
            --desc dict; 簡寫
            --查詢數據字典里面的 USER_TABLES 表的信息
            select * from dictionary where table_name ='USER_TABLES';

    二、創建表
        --create table [schema.]table_name(column_name datetype [default expr] [,....]);
        --這里的schema默認為當前用戶的方案,也可以制定其它用戶
        --通過子查詢創建表
        create table scott.emp30 as select * from emp where deptno =30;
        --基本創建表    無法執行,和命名空間有關系,等學完oracle整個結構在深入
        --encrypt 對數據的加密保存,待深入
        CREATE TABLE hr.admin_emp (
         empno      NUMBER(5) PRIMARY KEY,
         ename      VARCHAR2(15) NOT NULL,
         sex         CHAR(1) default 'M',
         ssn        NUMBER(9) ENCRYPT,
         job        VARCHAR2(10),
         mgr        NUMBER(5),
         hiredate   DATE DEFAULT (sysdate),
         photo      BLOB,
         sal        NUMBER(7,2),
         hrly_rate  NUMBER(7,2) GENERATED ALWAYS AS (sal/2080),
         comm       NUMBER(7,2),
         deptno     NUMBER(3) NOT NULL
                     CONSTRAINT admin_dept_fkey REFERENCES hr.departments
                     (department_id))
           TABLESPACE admin_tbs
           STORAGE ( INITIAL 50K);
           --應該是往數據字典里面添加comment
        COMMENT ON TABLE hr.admin_emp IS 'Enhanced employee table';

    --三、修改表    
        --增加列
            alter table emp10 add(sex char(1) default 'M');
        --增加表的constraint 因為列級的約束,可以直接通過修改列修改
            --alter table table_name add[CONSTRAINT constraint type (column,...)];
        --修改列
            alter table emp10 rename column empno to id;
            alter table emp10 modify(job varchar(20) default 'clerk');
        --刪除列  必需保證該列下面的數據為空
            alter table emp10 drop (comm);
        --修改表名
            rename emp10 to employee10;
    --四、截斷表  刪除該表下面的所有數據
        --truncate 速度很快,並不在事務日志中記錄所刪除的數據,所以不能恢復,delete會在日志中記錄刪除操作,
        truncate table employee10;

    --五、刪除表
        --drop table table_name [cascade constraint]
        --如果表被其它表參考(外鍵..)  需要使用 CASCADE CONSTRAINT;
        drop table employee10;
    --六、給表增加注釋
        --comment on {table|column} {table_name|tablename.column} is 'comment_string';

        comment on table emp_20 is '部門編號是20的員工';
    --七、在數據字典中查看表信息
        --和表相關的數據字典有 USER_TABLES; USER_OBJECTS; USER_TAB_COMMENTS; USER_COLUMN_COMMENTS;
        select table_name from user_tables;
        select * from user_tab_comments where table_name ='EMP_20';

    --八、約束條件
        --create table [scheme.] table_name(
            column_name datatype [default expr] [column_constraint],
            [,...],
            [table_constraint]
        );
        --表級約束和列級約束語法如下:
        column_constraint =[CONSTRAINT constraint_name] constraint_type;
        table_constraint =[CONSTRAINT constraint_name] constraint_type(column,...);
        一、約束類型not null,unique,primary key,foreign key,check
            --1.not null
                create table employees (
                    eid number(6),
                    --這個not null 約束由系統命名
                    name varchar(20) not null,
                    salary number(3,2),
                    --給not null約束起了一個名字(employees_hiredate_nn 規則:表名_列名_約束條件名稱)
                    hiredate date CONSTRAINT employees_hiredate_nn not null
                );
                --在數據字典中查看constraint
                select owner, constraint_name, constraint_type from user_constraints where table_name ='EMPLOYEES';
            --2.unique   規定了唯一constraint,Oracle數據庫會自動建立一個索引,索引名稱和約束名稱相同
                --給employees添加一列email並添加約束unique 
                --1.直接把約束添加到lie中,
                --2.給表添加約束,可以同時給兩列添加約束,此時兩列組合為鍵,
                alter table employees add (email varchar(15) unique);
                --alter table employees add(email varchar(15));
                --alter table employees add CONSTRAINT employees_email_uk unique(name);
            --3.primary key 不能為null且unique 可是使用聯合主鍵,兩個列為主鍵

            --4.froeign key 定義在一個表的兩個字段(自身關聯),或者兩個表的一個字段
                alter table employees add(deptno number(4));
                alter table employees add CONSTRAINT employees_deptno_fk foreign key(deptno) REFERENCES dept(deptno); 

                --select * from user_cons_columns where table_name='EMPLOYEES';
                --on delete cascade 刪除主表值時,會刪除從表的值
                --ondelete set null 刪除主表時,把從表的值置為null
                -- alter table employees add constraint employess_deptno_fk foreign key(deptno)
                    references dept(deptno) [on delete cascade | on delete set null];
            --5.check 檢查用來描述字段上的每個值都要滿足check中定義的條件
                alter table employees add CONSTRAINT employees_salary_ck check(salary >800);

                insert into employees(eid,name, salary, hiredate, deptno) select empno, ename, sal, hiredate, deptno from emp where hiredate is not null and sal>800;

            --啟用和禁用約束 暫時讓約束失效,在批量導數據是有用
                -- alter table table_name disable |enable CONSTRAINT constraint_name [cascade];
                --cascade是指在關閉約束后,對外鍵的聯級也消失

                --顯示該表所有約束
                    select c1.constraint_name,c2.constraint_type,c1.column_name from user_cons_columns c1,user_constraints c2 where c1.table_name='EMPLOYEES' and c1.constraint_name=c2.constraint_name;
                --關閉所有約束
                alter table employees disable constraint EMPLOYEES_SALARY_CK;
                alter table employees disable constraint employees_deptno_fk cascade;
                alter table employees disable constraint sys_c0011178;
                alter table employees disable constraint sys_c0011176;
                alter table employees disable constraint employees_hiredate_nn;
                alter table employees enable constraint employees_hiredate_nn;

                insert into employees(eid,name, salary, hiredate, deptno) select empno, ename, sal, hiredate, deptno from emp;

                --導入數據后發現部分約束打不開了,因為數據不正常了
                alter table employees enable constraint EMPLOYEES_SALARY_CK;
                alter table employees enable constraint employees_deptno_fk ;
                alter table employees enable constraint sys_c0011178;
                alter table employees enable constraint sys_c0011176;

    --九、視圖:虛表,一條查詢語句得到的結果集.視圖只包含映射導基表的一個查詢語句,可以執行dml語句
        --優點:簡化復雜查詢,經常在多表上面執行發雜查詢,就可以基於復雜查詢創建視圖,之后查詢視圖就好了
        1.創建視圖
        create [ or replace] view view_name [(col_alias[,col_alias])] 
        as subquery [with read only];
        --create創建一個view,create or replace 修改視圖
        col_alias定義視圖中列的別名, with read  only 表示不能執行dml語句

        create view v_emp_10 as select empno, ename, sal salary, deptno from emp where deptno=10;    

        select * from v_emp_10;

        --獲得每個部門的平均薪水和薪水總和,最高薪水,最低薪水的視圖
        create or replace view v_emp_salary as select deptno, avg(sal) avg_sal,
        sum(sal) sum_sal, max(sal) max, min(sal) min from emp group by deptno;
        --獲得每個部門的平均薪水和薪水總和,最高薪水,最低薪水的視圖 使用視圖別名
        create or replace view v_emp_salary (deptno, avg, sum, max, min) as 
        select deptno, avg(sal), sum(sal), max(sal), min(sal) from emp group by deptno;

        2.刪除視圖
            drop view v_emp_10;
        3.數據字典中查看視圖 user_objects, user_views,user_updatable_columns,
            select object_name from user_objects where object_type='VIEW';
        select view_name, text from user_views;

        --因為包含了group by語句,所以這個並不是基表的直接映射,所以不能修改
        select column_name, insertable, updatable, deletable from user_updatable_columns where table_name='V_EMP_SALARY';
    --十、索引  應該是把索引和地址放在一個表里面,快速訪問
        --用來在數據庫中加速表查詢的數據庫對象,通過誇蘇路徑訪問方式快速定位數據,可以有效的減少磁盤I/O操作,提高性能.
        --DML操作將會更新索引,增加了dml的時間.
        --創建索引的原則:
            1.為經常出現在where,order by,distinct子句中的列創建索引,
            2.連接條件的列加上索引
            3.不要在經常做dml操作的表加索引,不要在小表上面建索引,限制表的索引數目,
        1.創建索引
        create [unique] index index_name on table(column[,column...]);

        create index idx_emp_ename on emp(ename);

        select empno, ename, sal, job from emp where ename='SMITH';

        2.重構索引 經常做dml操作的表,需要定期重建索引
        alter index idx_emp_ename rebuild;
        3.刪除索引
        drop index idx_emp_ename;
        4.在數據字典中查看索引 user_indexes, user_ind_columns; 
        select index_name from user_indexes where table_name='EMP';
    十一、序列
        用來生成唯一序列值的數據庫對象,一般用來自動生成表的主鍵,
        --創建序列
            create sequence [schema.] sequence_name
            [start with i] [increament by j]
            [maxvalue m |nomaxvalue]
            [minvalue n |nominvalue]
            [cycle | nocycle] [cache p | nocache] 
            第一個值的序列i 步數j 最大值m 最小值n 
            cycle 遞增至最大或者遞減至最小之后是否繼續生成序列號 
            cache 用來制定預取p個數據在緩存中,以提高序列的生成效率 
        --修改序列
            alter sequence [schema.] sequence_name
            [increament by j]
            [maxvalue m |nomaxvalue]
            [minvalue n |nominvalue]
            [cycle | nocycle] [cache p | nocache] 

        --刪除序列
            drop sequence sequence_name;
        --數據字典 
            user_sequence
    十二、同義詞

        1.創建共用同義詞
        create public synonym synonym_name for [schema.]object;
        create public synonym public_emp for emp;
        select * from public_emp;

        2.創建私有的同義詞 只用當前用戶可以直接使用,其它用戶訪問需要該同義詞對應表的訪問權限
         create synonym private_emp for emp;
         select * from private_emp;

         3.刪除同義詞
         drop public synonym public_emp;
         drop synonym private_emp;
         4.數據字典中查看
         user_synonym;



    --參考書籍Oracle 11g數據庫編程與實踐  寧麗娟

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM