约束 constraint
–1.概念:表中列的限制
–2.五个约束:not null 非空/ unique 唯一/ primary key 主键 /
foreign key 外键 / check 检查
–3.五种约束限制的是,当向表中相应的列中添加数据时,要求必须满足约束的条件
–4.约束分为:列级约束 vs 表级约束
–5.1何时添加约束:创建表的同时,添加约束
–5.2何时修改约束:修改表的时候
–6.1 not null 非空 (只能使用列级约束)
–列级约束(系统自动分配约束名)
–列级约束(自定义约束名)。推荐!
create table emp1(
id number(10) not null, (匿名约束)
name varchar2(15) constraint emp1_name_nn not null, (有名约束)
salary number(10,2),
email varchar2(20)
)
–6.2 unique 唯一性约束
列级约束,表级约束
–允许向声明为unique的列上多次插入null值。
create table emp2(
id number(10) constraint emp2_id_uk unique,–列级约束
name varchar2(15) ,
salary number(10,2),
email varchar2(20),
–表级约束
constraint emp2_email_uk unique(email)
);
–6.3主键约束:primary key:非空且唯一。
–能够通过主键作用的列,唯一的确定表中的一条记录。
create table emp3(
id number(10),
name varchar2(15),
salary number(10,2),
email varchar2(20),
–表级约束
constraint emp3_id_pk primary key(id)
);
–6.4外键 foreign key
–外键约束所作用的列a添加的值,一定是所关联的表的列b中出现过的值。
–作用的列b要求有唯一性或者主键的约束
create table dept
as
select * from departments;
(如此复制的表,只是复制表的数据,没有赋值表的约束)
create table emp4(
id number(10),
name varchar2(15),
dept _id number(10),
–表级约束.
constraint emp4_dept_id_fk foreign key(dept _id)
references departments(department _id)
);
–6.5检查约束
create table emp5(
id number(10),
name varchar2(15),
salary number(10,2) check(salary > 2500)
);
–如何删除约束
alter table emp2
drop constraint emp2_email_uk;
–添加
alter table emp2
add constraint emp2_email_uk unique(email);
视图
第10节 视图 view
–视图:存储起来的select语句
–1.视图的创建
create view emp_vu
as
select employee_id , last_name,salary
from employees
where department_id = 90;
–结论:修改视图中的数据,会导致基于视图存在的表中相应数据的修改
–2.修改视图的数据(与表的操作一样)
update emp_vu
set last_name = ‘Queen’
where last_name = ‘King’;
–3.视图的修改
create or replace view emp_vu
as
select employee_id,last_name,salary,email
from employees
where department_id = 80;
–4.不允许修改视图的数据
create or replace view emp_vu
as
select employee_id,last_name,salary,email
from employees
where department_id = 80
with read only;
–5复杂视图
相对于如上 的简单试图,复杂视图使用了组函数。
对于使用了组函数的列必须为列添加别名
对于使用组函数的虚拟列,不能使用DML修改其值。
create or replace view dept_avgsal_vu
as
select department _id , avg(salary) dept_id_avgsal
from employees
group by department_id;