视图知识点
个人的一些学习总结,各位大牛给指正指正。
什么是视图?
视图实际上就是一张虚拟表,可以和普通表一样使用,但是视图中不存数据,而且视图中的数据是虚拟存储的,来源于实际表。
大型企业开发要求:再简单的查询也要通过视图查询。
视图的优点:
①节省SQL语句。
②数据安全。
一·视图的创建
语法:
/*
create view 视图名
as
查询语句
*/
# 范例1:查询员工姓名中带a字符的员工名,部门名和工种信息
#使用了员工表,部门表,工总表
CREATE VIEW myv1
AS
SELECT a.last_name,b.`department_name`,a.`job_id`,c.`job_title`
FROM employees a,departments b ,jobs c
WHERE a.`department_id` = b.`department_id`
AND a.`job_id` = c.`job_id` AND last_name LIKE '%A%';
二、使用视图(查看视图中的数据)
select * from myv1;
三、视图的修改
①方式一:如果视图名称不存在则创建,存在则修改。
/*
create or replace view 视图名称
as
查询语句
*/
#范例:修改视图myv1
create or replace view myv1
as
select * from employees;
②方式二:修改视图,如果视图名称不存在,则报错。
/* alter view 视图名
as
查询语句
*/
#范例:修改视图myv1
alter view myv1
as
select * from employees;
四、视图的删除
#格式:drop view 视图名称1,视图名称2,...
#范例:删除视图myv1
drop view myv1;
#范例2:删除多个视图
drop view myv1,myv2,myv3;
五、查看视图
#查看视图结构
desc myv1;
#可以看到所创建视图的详细信息
show create view myv1;
六、视图的更新(视图数据的更新)
#对视图的更新最终会转换成对基本表的更新。
对视图的更新最终会转换成对基本表的更新
#根据boys表创建视图boys_v
create view boys_v
as
select * from boys;
#新增数据 -》新增到基表
insert into boys_v(boyname,usercp) values('小明',1000);
#修改数据 -》修改基表的数据
update boys_v set usercp = 1 where boysname = '小明';
#删除数据 -》删除基表数据
delete from boys_v where boyname = '小明';
具备以下条件的视图不允许更新
1、视图创建过程中的SQL语句包含:分组函数、distinct、group by、having、union、union all。
2、select中包含子查询的视图、常量视图、多表连接、select后面的from是一个不可以修改的视图,where子句中引用了form子句中的表。
CREATE VIEW dept_avg_salary_v
AS
SELECT AVG(salary) avg_salary,department_id
FROM employees
GROUP BY department_id;
INSERT INTO dept_avg_salary_v (avg_salary,department_id)
VALUES(10000,60);
/*
创建视图的过程中sql语句包含了分组函数 AVG()、group by,导致添加数据失败,出现以下错误。
#The target table dept_avg_salary_v of the INSERT is not insertable-into
*/
#where 字句中引用了form子句中的表
CREATE VIEW myv5 AS
SELECT * FROM employees
WHERE employee_id NOT IN(
SELECT employee_id
FROM employees
WHERE department_id IS NULL
);
总结(区别):
视图 | 表 |
---|---|
create view | create table |
只保存了sql的逻辑,没有保存数据 | 既保存了SQL逻辑,又保存了数据 |
基本只用于查询 | 增删改查 |