0 常见对象有:
对象 | 描述 |
表 | 基本存储单位 |
视图 | 在表基础上抽取出逻辑相关的数据集合 |
序列 | 提供有规律的数值 |
索引 | 提供高效的查询 |
同义词 | 给对象起别名 |
1 表字段类型
数据类型 | 描述 |
char(size) | 定长字符 |
varchar2(size) | 可变长字符 |
clob | 字符数据,最大可4G |
BLOB | 二进制数据,最大可4G |
number(n) | 可变长数值类型 |
long | 可变长字符数据,最大可2G |
rowid | 行地址 |
bfile | 存储外部文件的二进制数据,最大可4G |
date | 日期 |
eg: create table testsavepoint (tid number,tname varchar2(20));
2 DDL语句:
1 参考原来表结构的基础上创建新表,同是将原表部分数据赋值到新表中:
create table emp20
as
select * from emp where deptno=20; (创建表的同时将部门号为20的记录赋值到新表emp20中)
如果仅仅是创建表,写成如下:
create table emp20
as
select * from emp where 1=2;
2 修改表: (追加新列 修改列 删除列 重名列)
2.0 create table test1(tid number,tname varchar2(20),hiredate date);
2.1 alter table test1 add image blob;
2.2 alter table test1 modify tname varchar2(40);
2.3 alter table test1 drop column image;
2.4 alter table test1 rename column tname to username;
3 删除表:
drop table test1;
3 约束(表级别的限制,关键词constraint,可以不加此关键词)
约束类型:
a) not null
b) unique
c) primary key
d) foreign key
e) check
检查性约束:
create table test2
(tid number,
tname varchar2(20),
gender varchar2(4) check (gender in ('男','女')),
sal number check (sal > 0)
);
外键约束几个关键字:
a) foreign key: 在子表中定义了一个表级的约束
b) references: 指定表和父表的列
c) on delete cascade: 当删除父表时,级联删除子表记录
d) on delete set null: 当删除父表时,将子表的相关记录外键值为null
eg: 见下面创建表的同时创建约束并给约束赋值,最后一行就是设置外键约束写法
create table myperson
(pid varchar2(18) constraint myperson_PK primary key,
pname varchar2(40) constraint myperson_Name_notnull not null,
gender varchar2(4) constraint myperson_Gender check (gender in ('男','女')),
email varchar2(40) constraint myperson_Email_unique unique
constraint myperson_Email_notnull not null,
deptno number constraint myperson_FK references dept(deptno) ON DELETE CASCADE
); 创建表myperson字段deptno ,给这个字段增加外键约束myperson_FK,关联父表dept字段deptno,并当
删除父表时,级联删除子表myperson记录。
4 视图
a) 视图是一张续虚表
b) 建立在已有表的基础上的一种封装查询
c) 仅仅是提供数据展示的一种形式而已,对于开发人员而言,就是带有业务功能的select查询的预定义,终极目的是为了简化查询而生(这个简化是相对于开发人员而言,对于oracle而言是一点简化都没有)
d) 只能创建/删除/替换, 如果修改的话,就相当于替换
e) 非常不建议通过视图对表的数据进行 插入/修改/删除
f) 建议创建视图时候就增加上 read only
创建视图和快捷创建表写法类似,如下
create view empview
as
select e.empno,e.ename,e.sal,e.sal*12 annlsal,d.dname
from emp e,dept d
where e.deptno=d.deptno with read only;
创建好了后,直接执行: select * from empview; 实际上就是让oracle根据视图名称 empview去执行
视图名称对应的 那一大堆select查询,仅仅是让操作人员操作起来少些一些代码而已(类似于一个预定义功能,或者理解为面向对象的封装)
5 序列:(产生唯一数值的数据库对象,多用于生成主键)
序列就是数组,并被装载在内存中。
两个属性:
a) nextval---> 返回序列中下一个有效的数值,任何用户都可以引用
b) currval---> 存放序列的当前值
序列初始化后,当前值是指向第一个数值之前的那个位置(类似于游标),因此第一个数值
创建: create sequence myseq;
得到序列的第一个数值:
错误写法:
select myseq.currval from dual *
第 1 行出现错误:
ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此会话中定义
正确写法:
select myseq.nextval from dual;
1 |
使用序列作为主键向表中插入数值:
create table tableA(tid number,tname varchar2(20));
insert into tableA values(myseq.nextval,'aaa' );
如果你创建的序列作为所有表的主键来共同使用,那么每个表的主键必定会造成不连续结果,
tableA 1
tableA 2
tableB 3
tableA 4
因此在开发中,每个表对应一个此表专有的序列对象。
序列修改后,只会影响将来的值,已经被使用的数值不会改变。
alter sequence xxx increment by xx maxvalue xxx;
删除序列: drop sequence xxx;
6 索引(和表记录的关系类似于 字典目录和字典里面详细内容)
如果针对创建索引的列字段经常被更新(eg:sal) 那么不建议创建索引,否则 数据库经常维护这个索引表,效率也不会提高到多少。
创建索引:
create index myindex on emp(deptno);
create index myindex on emp(deptno,ename);
删除索引:
drop index myindex ;