视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一些列带有名称的列和行数据。视图的变化会影响到基表,同理基表的变化也会影响到视图;
创建视图:
create view viewName as (select 语句);
eg:
测试数据:
- 显示员工及其对应的部门名;
分析:
员工名来自emp表、部门名来自于dept表,因此我们可以对这两个表做内连接查询:
SQL语句:select ename,dname from emp inner join dept on emp.deptno<=> dept.deptno;
2. 查询员工SMITH 的部门名:
select ename,dname from emp inner join dept on emp.deptno<=> dept.deptno where ename='SMITH';
那如果我要筛选KING、FORD、MILLER等的部门号呢?我们是不是每次都要重新写上面的SQL语句,这样效率是不是太慢了?因为每次查询都要做笛卡尔积,太慢了,同时SQL语句也比较长,难的写;
为此,我们可以将上面的员工名与部门名组成的表当作视图,让其临时存在与内存中,这样我们接下来如果还要查询某个人对应的部门名的话,我们就对这个视图进行操作就行了,减少了每次做笛卡尔积的消耗,同时操作这个视图与操作普通表无异;
打视图:
create view myview as (select ename,dname from emp inner join dept on emp.deptno<=> dept.deptno);
其中:像emp、dept这样提供原始数据的表叫做基表,myview叫做视图;
修改了视图,对基表数据有影响;
- 将视图中SMITH的名字进行小写:
- 修改基表中的数据,对视图有影响:
删除视图:
drop view viewname;
eg:
drop view myview;
- 视图与表结构一样,必须命名,不能与其它表同名;
- 创建视图没有数目限制,但是要考虑复杂查询创建视图之后的性能影响;
- 视图不能添加索引,也不能有关联的触发器或者默认值;
- 视图可以提高安全性,必须具有足够的访问权限;
- order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by ,那么该视图
中的 order by 将被覆盖;
eg:
在上面的例子中,查询结果将按照column2的值进行排序,而不是按照在视图中定义的column1排序。- 视图可以和表一起使用