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;