一、DDL:定义构成数据库的结构信息
对象:表,试图,系统,同义词,索引过程,函数,触发器
1、表分类
堆表
分区表
簇表
外部表
引用外部表 ,不占用磁盘空间
导入外部表,存在文件或磁盘空间里
2、建表:
create table 表名 (column datatype|constrain(约束)|default...) tablespace <指定存放表空间> pctused< 用来做insert 操作的空间,默认为90%> pctfree<用来做update操作的空间,默认为10%>
//必须以字母开头a-z A-Z,里面只能包含0-9 _ # $ , 长度不能超过30个字符。dbca 建库时默认的表空间为users
users --10m 如果我们的users只有10m
假如我们只有9m的使用空间--只能用insert操作这9M的空间
3、
查看表
tab
user_tables //在当前用户下查看表
user_object //在当前用户下查看表
项目中我们必须自己新建一个表空间用来存放我们的数据,不能放到users下
select object_name,object_type from user_objects where object_tyep='TABLE';
二、
字符类型
(粉色为常用)
char:固定字符长度,不能超过2000字符;
varchar:变长字符类型,用多少,分配多少,最长只能达到4000个字符;
clob:大对象字符类型,长度为4GB-1;
number:数值型,包括浮点型,不能超过30个字符长度;
date:日期型,年月日十分秒,不能显示时区;
timestamp:时间戳,有时区,精确到毫秒;
blob:二进制数据类型,长度为4GB-1.可用来存储多媒体:视频,声音;
long:长整型;
rowid:存的列的编号,可以显示放到哪个数据文件,数据块,行号是多少;
三、
五类约束
1.not null :非空,只能创建列级,不能创建表级
SQL> create table ntest(name varchar2(20),dno number not null);
SQL>create table ntest(name varchar2(20)); //如果没有跟上约束,我们可以用alter进行修改
alter tabel ntext modify(name varchar2(20) not null);
列名最好不要超过30个,列的数量最好不要超过1000个,最好不要使用关键字。
2.unique :唯一性约束
>>>create table utest(name varchar2(20) unique) ; //列级约束
>>>create tabel utext (name varchar2(20) , unique(name));//表级约束
>>>create tabel utext ( name varchar2(20 ) constraint u_name uqique);//用u_name给我们的列级约束命名
>>>create tabel utext (name varchar2(20) , constraint u_text_name unique(name));//u_text_name给我们的表级约束命名
#两种约束,效果是一样的
#如果不给约束重命名,系统会自动给约束一个名字一般为sysxxxxx格式。
3.primary key:主键约束,值必须唯一而且非空
>>>create table ptest (name varchar2(20) primary key(name));
>>>>>>create table ptest (name varchar2(20) constraint pk_ptest_name primary key(name));//给我们的约束条件重命名
4.foreign:外建约束,主键的子集,被主键调用
>>>create table ftest(empno number(10) primary key,name varchar2(20),mgr number(10) references ftest(empno));
//外键用references 来指定
>>>create table ftest(empno number(10) primary key,name varchar2(20),mgr number(10) constraint fk_ftest_no references ftest(empno));
>>>create table ftest(empno number(10) primary key,name varchar2(20),mgr number(10), fk_ftest_no foreign key(mgr) references ftest(empno));
5.check:检查约束,条件约束
>>>create table ctest (name varchar2(20), mail varchar2(30) check(mail like '%_%@%_%.%_%')); //列级约束
>>>create table ctest (name varchar2(20), mail varchar2(30) ,check(mail
like '%_%@%_%.%_%')); //表级约束
若建表的时候,出错,使用modify 去修改
表级约束与列级约束两种约束一样,只是语法上的区别
列级约束:创建表时,约束直接跟在列后
表级约束:创建表时,约束要用逗号隔开
user_constraints
user_cons_columns
>>>desc user_constraint //查看我们的哪些表有约束
>>> select constraint_name,table_name,constraint_type from user_constraint;
>>>desc user_cons_columes ; //查看约束建到了哪个列当中
>>> select constraint_name,table_name,constraint_type,column_name from user_cons_columes a ,uer_constrain b where a.constraint =b.constraint;
禁用和启用约束
alter table<> disable constraint <>; //禁用
alter table<> enable constraint<>; //启用
alter table <> drop constraint <>; //删除
四、表的基本操作
1、 增加列:
alter tabel <表名> add( 列名 数据类型);
2、修改字符长度:
alter table <表名> modify(col 数据类型)
>>> alter table ctest modify(mail varchar(20)) ; //一般改空,先导出数据,在进行修改
3、修改列名:
alter table <表名> rename column <old> to <new>;
4、删除列:
alter table <> drop column <>;
5、修改表名:
alter table <> rename to <>;
6、表只读read only;
alter table <> read only; //只能对表做查询和维护操作
维护操作
alter table cts mov ; //把数据块从一个移动到另一个
alter table cts enable rows movement; //打开行的移动
alter table cts shrink space ;//清理碎片
alter table cts disable rows movement; //关闭行的移动
7、表的读写
lter table <> read write;
8、删除表
drop table <>;//不能正真删除,只是放到回收站里,重命名了一下。
drop table <> purge; //直接删除,不放入回收站
show parameret resyslebin; //为on 则表明回收站打开的
show resyslebin ;//查看我们回收站中的内容
desc user_resyslebin;//查看我们回收站的内容,不仅能看到内容还能够看到索引
flashback table <表名> to before drop ;// 闪回,在回收站恢复我们删掉的表
flashback table <表名> to before drop rename to <>; //闪回的时候给他重命名
purge table <表名> ;// 清空回收站里指定的表
purge rscyclebin;//清空回收站
alter session set resyslebin=off;//关闭我们的回收站,只在当前会话生效
alter session set resyslebin=on;//打开我们的回收站,只在当前会话生效
五、ctas 建表方法
ctas====
子查询的方式建表
create table <> as select ...; //将其他表的表结构复制过来,内容也会一起复制
>>>create table emp1 as select * from emp;
>>>create table emp1 as select * from emp where 0=1;//只复制结构不要数据,因为给了一个为假的条件
>>>create table emp3 as select ename name.deptno dpo,job sjob from emp where 0=9;//复制表的时候修改列名
>>>create table emp3 (name,hdate,epo) as select ename,hiredate,empno from emp where 0=1;//复制的时候修改列名