视图(VIEW)、索引(INDEX)

1、视图:表的一部分投影,也是数据库中一个对象。(表的虚拟部分)

     作用:因为视图中含有某表中的部分数据,不在视图中的字段有隐藏效果。相对来说,较安全。

     特点:视图可以像表一样进行增删改查。

     创建视图create view viewName as subQuery;

eg:将员工表中的10部门的数据封装到一个视图view_emp中
create view view_emp as select * from emp where deptno = 10;

     删除视图:drop view viewName;

     操作视图通过视图进行DML操作,一定会对表有影响。 但通过表进行DML操作,可能会对视图有影响。

eg:通过视图,
插入数据 empno:9001,ename:'zs',部门号:10
插入数据 empno:9002,ename:'ls',部门号:20
insert into view_emp_deptno_10 values (9003,'zs',null,null,null,null,null,10);
insert into view_emp_deptno_10 (empno,ename,deptno)values (9004,'ls',20);

 eg:
查询表emp,查询视图view_emp_deptno_10
select * from view_emp_deptno_10;

得出结论:如果操作了表中的记录,并且此记录存在视图中,则视图中会有影响,如果不存在视图中则没有影响。

    with check option:对视图的一种检查约束选项。

  如果在创建视图有此选项时,表示只能对视图DML操作可见数据。对视图不可见的数据,是不可以通过视图进行DML操作的。

   创建一个视图view_emp_deptno_20,
   投影20号部门的 员工编号,员工姓名,职位,工资,部门号。
练习3:通过视图view_emp_deptno_20插入数据
     empno:9003,ename:'ww',job:manager,sal:5000,20
     empno:9004,ename:'zl',job:manager,comm:500,20
     empno:9005,ename:'qq',job:manager,sal:500,10
create view view_emp_deptno_20 as select empno,ename,job,sal,deptno
from emp where deptno = 20 with check option;

select * from view_emp_deptno_20;
insert into  view_emp_deptno_20 values(9003,'ww','manager',5000.0,20);正确
insert into  view_emp_deptno_20 values(9008,'qq','manager',5000.0,10);错误,因为此语句不符合视图的条件,10号部门的数据此视图不可见。

     视图的分类:

     简单视图:subQuery是一个表中的普通查询语句。

     复杂视图:subQuery是一个可以带有分组函数的,或者关联查询的语句。复杂视图不能对视图进行DML操作,只能进行DQL操作

练习:创建一个复杂视图view_emp_100,是每个部门的平均工资,最高工资,最低工资,及其部门号。
create view view_emp_100 as select avg(ifnull(sal,0)) avg_sal,max(sal) max_sal,
min(sal) min_sal,deptno from emp group by deptno;

     2、索引:目的是为了提高查询速度。相当于一本书的目录。

          特点:索引也是数据库的对象,占空间,每张表每个字段都可以设置相应索引。

          优点:提高查询速度。

          缺点:占空间,每次进行DML操作时,数据库都要自动重新维护索引,降低效率。虽然索引可以提高效率,但并不是索引越多越好。

          不需要索引的情况:

          *表中数据量比较小时,无需索引(因为直接查询可以比索引更快)

          *当某个字段值较少时,也不需要,如性别字段只有'f','m'

           索引的创建:

练习1:给emp表中的empno创建索引。
create index index_emp_empno on emp(empno);
练习2:查询empno为9003的数据。
select * from emp where empno=9003;

           索引的删除:drop index indexName;

 

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