视图

1. 视图

含义:虚拟表,和普通表一样使用。mysql5.1版本出现的新特性,是通过表动态生成的数据。

1.1 创建视图

/*
语法:create view 视图名 as 查询语句;
*/
#1.查询姓名中包含a字符的员工名、部门名和工种信息
#创建
create view myv1 as select
	last_name,
	department_name,
	job_title
from
	employees e
join departments d on
	e.department_id = d.department_id
join jobs j on
	j.job_id = e.job_id;

#使用
select
	*
from
	myv1
where
	last_name like '%a%';

#2.查询各部门的平均工资级别
#创建视图查看每个部门的平均工资
create view myv2 as select
	avg(salary) ag,
	department_id
from
	employees
group by
	department_id;

#使用
select
	myv2.`ag`,
	g.grade_level
from
	myv2
join job_grades g on
	myv2.`ag` between g.`lowest_sal` and g.`highest_sal`;

#3.查询平均工资最低的部门信息
select
	*
from
	myv2
order by
	ag
limit 1;

#4.查询平均工资最低的部门名和工资
#基于视图创建视图
create view myv3 as select
	*
from
	myv2
order by
	ag
limit 1;

#使用
select
	d.*,
	m.ag
from
	myv3 m
join departments d on
	m.`department_id` = d.`department_id`;

1.2 视图的修改

#方式一:
/*
语法:
    create or replace
    view 视图名 as 查询语句;
*/
create or replace
view myv3 as select
	avg(salary),
	job_id
from
	employees
group by
	job_id;

#方式二:
/*
语法:alter view 视图名 as 查询语句;
*/
alter view myv3 as select
	*
from
	employees;

1.3 删除视图

/*
语法:
    drop view 视图名1,
    视图名2,
    ...;
*/
drop view myv1,
myv2,
myv3;

1.4 查看视图

desc myv3;

show create view myv3;

1.5 视图的更新

视图的更新会更新创建视图的表。

create or replace
view myv1 as select
	last_name,
	email
from
	employees;

#1.插入
insert
	into
		myv1
	values('张三',
	'zhangsan@qq.com');

#2.修改
update
	myv1
set
	last_name = '李四'
where
	last_name = '张三';

#3.删除
delete
from
	myv1
where
	last_name = '李四';

具备以下特点的视图不允许更新:

#1.包含以下关键字的sql语句:分组函数、distinct、group by、having、union或者union all
create or replace
view myv1 as select
	max(salary) m,
	department_id
from
	employees
group by
	department_id;

#更新失败
update
	myv1
set
	m = 9000
where
	department_id = 10;

#2.常量视图
create or replace
view myv2 as select
	'john' NAME;

#更新失败
update
	myv2
set
	NAME = 'lucy';

#3.select中包含子查询
create or replace
view myv3 as select
	department_id,
	(
	select
		max(salary)
	from
		employees) 最高工资
from
	departments;

#更新失败
update
	myv3
set
	最高工资 = 100000;

#4.join
create or replace
view myv4 as select
	last_name,
	department_name
from
	employees e
join departments d on
	e.department_id = d.department_id;

#更新成功
update
	myv4
set
	last_name = '张三'
where
	last_name = 'Whalen';

#更新失败
insert
	into
		myv4
	values('李四',
	'xxxx');

#5.from一个不能更新的视图
create or replace
view myv5 as select
	*
from
	myv3;

#更新失败
update
	myv5
set
	最高工资 = 10000
where
	department_id = 60;

#6.where子句的子查询引用了from子句中的表
create or replace
view myv6 as select
	last_name,
	email,
	salary
from
	employees
where
	employee_id in(
	select
		manager_id
	from
		employees
	where
		manager_id is not null);

#更新失败
update
	myv6
set
	salary = 10000
where
	last_name = 'k_ing';

1.6 视图和表的区别

创建语法的关键字是否实际占用物理空间使用
视图create view只是保存了sql逻辑增删改查,只是一般不能增删改
create table保存了数据增删改查
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值