正课:
1、约束
为数据库对象。
对把数据库表中的字段类型,实现数据插入的限制条件。
也会附带着其他的约束:如绑定。
主键、外键、非空、唯一、检查约束。
1)、主键约束
主键:对表中的记录数据,进行唯一标识。
主键与表中的业务字段没有关系,主键不参与业务操作。
仅用于标识某条记录在表中存在的唯一性。
主键:primary key
①、在建表的时候直接给字段添加主键。
如:员工编号,在员工表中的存在,就能作为主键。
--员工表基础数据录入
CREATE TABLE emp1(
empno NUMBER(4) primary key,--设置主键约束
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno number(2)
);
②、给建好的表,追加主键约束
alter table 表名
add primary key(字段名);
如:alter table emp add primary key(empno);
注意:联合主键
对于表中的两个以上的字段,联合查询,才能对
某条记录数据确定其唯一性。
可以定义成联合主键(不常用)。
2)、外键约束
对表1插入数据的时候,受到表2数据的限制。
表2必定在表1中,有字段约束。
则表1中对应的表2字段,可以作为外键约束。
外键约束,表1中的外键必须是表2中的主键(联合主键)。
如:emp表中的deptno可以作为外键,
受到dept表中的deptno字段的约束。
①、在建表的时候直接给字段添加外键。
CREATE TABLE emp1(
empno NUMBER(4) primary key,--设置主键约束
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno number(2),
--设置外键约束
foreign key(deptno) references dept(deptno)
);
注:外键约束字段,必须是关联表中的主键。
a、添加emp数据时,外键值deptno
必须在关联表中存在对应的主键值deptno。
b、删除关联表dept数据时,
必须在emp表中找不到关联的子记录。
②、给建好的表,追加外键约束
alter table 表名
add foreign key(字段)
references 外表名(主键字段);
如:
alter table emp
add foreign key(deptno)
references dept(deptno);
3)、非空约束
not null
限制数据库表中字段在插入数据时,不能为null值。
CREATE TABLE emp1(
empno NUMBER(4) primary key,--设置主键约束
ename VARCHAR2(10) not null,--设置非空约束
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno number(2),
--设置外键约束
foreign key(deptno) references dept(deptno)
);
注意:主键约束也必须是非空约束
4)、唯一约束
unique
限制数据库表中字段在插入数据时,不能为表中重复的值。
CREATE TABLE emp1(
empno NUMBER(4) primary key,--设置主键约束
ename VARCHAR2(10) not null,--设置非空约束
job VARCHAR2(9) unique,--设置唯一约束
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno number(2),
--设置外键约束
foreign key(deptno) references dept(deptno)
);
注意:主键约束也必须是唯一约束
5)、检查约束
check
限制数据库表中字段在插入数据时,必须符合一定的规范。
CREATE TABLE emp1(
empno NUMBER(4) primary key,--设置主键约束
ename VARCHAR2(10) not null,--设置非空约束
job VARCHAR2(9) check(length(job)>3),--设置检查约束
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno number(2),
--设置外键约束
foreign key(deptno) references dept(deptno)
);
注意:非空约束其实也是一种检查约束。
结论:
约束,是用来限制向数据库表中字段插入数据,
必须符合一定的规范。否则不予插入。
附带的在数据增删改,都要满足约束设置的规范。
约束对于开发来说,是个麻烦。
为了方便开发,所以在开发前,对数据库设计时,
可以提前的将约束都设计完毕,但不要将约束添加
到数据库中。
在测试阶段的中后期,可以将所有的约束条件,添加
到数据库中,并完成最终的测试及修改。
2、视图(view)
view:也为数据库对象。
视图的结构与表相似,所以又被称为虚表,即虚拟的表。
但是其数据来源于真实的表中。
视图对应一条查询语句,把查询的结果数据,以表的形式
存储在视图中。组成视图数据的来源表,叫做基表.
一旦基表中的数据发生变化,则视图中的结果集必然
会跟着变化。
在一定程度上,视图可以实现:
a、简化查询(重用查询结果)
可将复杂查询sql的结果集,提前查询
并存放在视图中。需要的时候,直接查询
视图即可。
b、限制数据的访问。
select * from emp;
所有字段都被看到,包括sal工资。
可以将除工资以外的所有数据,存放在视图中
对外暴露。让外界只查视图,对员工薪资进行保护。
1)、创建视图
create view 视图名
as (select 子查询);
create view emp_view
as (
select empno,ename,job,mgr,hiredate,deptno
from emp
);
创建视图,必须授予创建视图权限。
grant create view to ksxx_21;
视图的查询与表一致。
select * from emp_view;
2)、视图分类
根据视图的复杂程度,可以分为:
简单视图:
select 基于单表操作,且不包含任何函数、
运算符、表达式、分组函数、distinct....
select 字段名... from 表名;
复杂视图:
select 基于单表操作,可包含函数、
运算符、表达式、分组函数、distinct、
group by....
连接视图:
select 查询基于多表联合查询。
3)、创建视图添加别名
create view emp_view2
as (
select empno 员工编号,ename 姓名,
job 职位,mgr 领导编号,hiredate 入职日期,deptno 部门编号
from emp
);
--创建复杂视图
create view sal_view
as (select sal,sal*12 from emp);
则查询视图后,显示的字段直接为别名。
一定程度上,是对数据来源,进行保护。
4)、对视图进行DML操作。
视图为虚表,支持DML操作,但有诸多限制,不建议操作。
对视图进行DML操作,必须遵守以下基本原则:
a、只能对简单视图进行DML操作,
复杂、连接视图无法实现DML操作。
b、对视图进行DML操作,必须遵循基表中的约束条件。
c、插入时,允许插入非视图范围内的数据。
但视图查不到,在基表中存在。
d、删除、修改时,必须为视图范围内的数据。
5)、删除视图
drop view 视图名;
drop view emp1_view;
6)、为视图添加约束
①、检查约束
with check option;
为视图添加检查约束,对视图进行DML操作时,
必须遵循以下原则:
a、向视图中添加的数据,必须是视图可见数据。
b、修改视图时,修改之后的数据,必须是
视图可见数据。
否则以上DML操作失效。
②、只读约束
with read only;
为视图添加只读约束,对视图将只能查,
不能进行DML操作。
结论:
①、允许对简单视图进行DML操作,
但实际开发中,这样的操作很少很少。
②、复杂视图、连接视图不能执行DML操作。
③、对简单视图进行DML操作,必须遵循以上级别规则。
3、序列(sequence)
数据库对象
用于生成一组数字,用于生成某表的主键值。
通常情况下,一个序列只会给一张表生成主键值,
但也可以给多个表提供主键值。
1)、创建序列
create sequence 序列名
start with i
increment by j
maxvalue m|nomaxvalue(默认)
minvalue n|nominvalue(默认)
cycle|nocycle(默认)
cache(默认 20)|nocache
create sequence emp_empno_seq
start with 1
increment by 1;
2)、序列使用
select 序列名.nextval from dual;
如:select emp_empno_seq.nextval from dual;
获得当前序列值,并将指针指向下一个序列值。
序列的nextval,一但当前值被获取,就不可能重复取值。
犹如时间一样,一去不复返。
向表中插入由序列生成的主键值。
insert into emp values(emp_empno_seq.nextval,'ADAMS','CLERK',7788,to_date('23-5-87','dd-mm-yyyy'),1100,null,20);
3)、删除序列
drop sequence 序列名;
drop sequence emp_empno_seq;
4、索引(index)
数据库对象
一种提高查询效率的机制。
1)、创建索引
给对应的字段创建索引
create index 索引名 on 表名(字段名);
create index emp_empno_index on emp(empno);
2)、索引使用
根本无需使用。
只管创建即可,会在查询的时候,根据查询的sql,
自动调用索引,来提高查询效率。
3)、合理索引创建的规则
a、小表一般不建索引,大表考虑创建索引。
b、给经常出现在where、order by、distinct、
group by子句中的列创建索引。
c、给经常作为联合条件的字段,创建索引。
d、不要在经常做DML操作的表中创建索引。
e、索引不是越多越好,适当就好。
f、一定要删除不合适的索引。
4)、维护索引
对经常做DML操作的表,若创建索引,一定要定期维护。
alter index 索引名 rebuild;
如:alter index emp_job_index rebuild;
5)、删除索引
对不合适的索引,要进行删除。
drop index 索引名;
如:drop index emp_job_index;
5、存储过程
6、触发器