--数据库对象的创建和管理 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数据库编程与实践 宁丽娟