day48数据库 视图 和 约束

二、视图

  • 什么是视图: 数据库中的表和视图都是其内部的对象,视图可以理解成一张虚拟的表,视图本质就是取代了一条SQL查询语句。

  • 为什么使用视图:因为有些数据的查询需要书写大量的SQL语句,每次书写效率太低,使用视图可以起到SQL重用的作用,视图可以隐藏敏感信息

  • 创建视图的格式:

    create view 视图名 as 子查询; 
    create table 表名 as 子查询

  • 创建一个10号部门员工的视图

    create view v_emp_10 as 
    (select * from emp where deptno=10); 
    ​
    -- 从视图中查询数据 
    select * from v_emp_10;

  • 创建一个没有工资的员工表视图

    create view v_emp_nosal as 
    (select empno,ename,comm,deptno from emp); 
    ​
    -- 查询 
    select * from v_emp_nosal

视图的分类
  1. 简单视图:创建视图的子查询中不包含:去重,函数,分组,关联查询。可以对视图中的数据进行增删改查操作

  2. 复杂视图:和简单视图相反,只能对视图中的数据进行查询操作

  • 创建一个复杂视图

    create view v_emp_info as 
    (select avg(sal),max(sal),min(sal) from emp); 
    ​
    -- 查询 
    select * from v_emp_info;

对简单视图进行增删改查,操作方式和table一样
  1. 插入数据

    insert into v_emp_10 (empno,ename,deptno) values
    (10011,'刘备',10); 
    ​
    select * from v_emp_10; 
    ​
    select * from emp;

  • 如果插入一条在视图中不可见,但是原表中却可见的数据称为 数据污染。

    insert into v_emp_10 (empno,ename,deptno) values
    (10012,'关羽',20); 
    ​
    select * from v_emp_10; 
    select * from emp;

  • 通过 with check option 解决数据污染问题

    create view v_emp_20 as 
    (select * from emp where deptno=20) 
    with check option; 
    ​
    insert into v_emp_20 (empno,ename,deptno) values
    (10013,'赵云',20); //成功 
    ​
    insert into v_emp_20 (empno,ename,deptno) values
    (10014,'黄忠',30); //失败

  • 修改和删除视图中的数据(只能修改删除视图中有的数据)

     update v_emp_20 set ename='赵云2' where ename='赵云'; 
     update v_emp_20 set ename='刘备2' where ename='刘备';//修改失败 
     delete from v_emp_20 where deptno=10;//没有数据被删除

  • 创建或替换视图

    create or replace view v_emp_10 as 
    (select * from emp where deptno=10 and sal>2000);

  • 删除视图 drop view 视图名;

    drop view v_emp_10;
    ​
    show tables;

  • 如果创建视图的子查询中使用了别名 则对视图操作时只能使用别名

    create view v_emp_10 as 
    (select ename name from emp where deptno=10); 
    ​
    select name from v_emp_10;//成功 
    select ename from v_emp_10;//失败

视图总结:
  1. 视图是数据库中的对象,代表一段SQL语句,可以理解成一张虚拟的表

  2. 作用: 重用SQL,隐藏敏感信息

  3. 分类:简单视图(创建视图时不使用去重、函数、分组、关联查询,可以对数据进行增删改查)和复杂视图(和简单视图相反,只能对数据进行查询操作)

  4. 插入数据时有可能出现数据污染,可以通过with check option解决

  5. 删除和修改只能操作视图中存在的数据

  6. 起了别名后只能用别名

三、约束

  • 什么是约束: 约束就是给表字段添加的限制条件

主键约束+自增 primary key auto_increment
  • 作用:唯一且非空

非空约束 not null
  • 作用:该字段的值不能为null

    create table t_null(
        id int,
        age int not null
    ); 
        
    insert into t_null values(1,18); //成功 
    ​
    insert into t_null values(2,null);//失败

唯一约束 unique
  • 作用: 该字段的值不能重复

    create table t_unique(
        id int,
        age int unique
    ); 
    ​
    insert into t_unique values(1,28);//成功 
    insert into t_unique values(2,28);//失败 不能重复

默认约束 default
  • 作用: 给字段设置默认值

    create table t_default(
        id int,
        age int default 20
    ); 
    ​
    insert into t_default (id) values(1); //默认值会生效 
    insert into t_default values(2,null);//默认值不会生效 
    insert into t_default values(3,30);//可以赋值其它值

外键约束
  • 外键:用来建立关系的字段称为外键

  • 外键约束: 添加外键约束的字段,值可以为null,可以重复,但是值不能是关联表中不存在的数据,外键指向的数据不能先删除,外键指向的表也不能先删除

  • 如何使用外键约束

  1. 创建部门表

    create table dept(
        id int primary key auto_increment,
        name varchar(10)
    );
  2. 创建员工表

    create table emp(
      id int primary key auto_increment,
      name varchar(10),
      dept_id int,
      constraint fk_dept foreign key(dept_id) references dept(id)); 
      
    -- 格式介绍:
    constraint 约束名称 foreign key(外键字段名) references 依赖的表名(依赖的字段名)
    ​
    -- 测试插入数据 
    insert into dept values
    (null,'神仙'),
    (null,'妖怪'); 
    ​
    insert into emp values
    (null,'悟空',1); 
    ​
    insert into emp values
    (null,'赛亚人',3);//失败 
    ​
    delete from dept where id=1;//失败 
    ​
    drop table dept; //失败
  • 由于添加外键约束后 会影响测试效率,所以工作中很少使用,一般都是通过java代码实现逻辑外键。

你可能感兴趣的:(数据库,oracle)