五、视图的更新
#五、视图的更新
CREATE OR REPLACE VIEW myv1
as
select last_name,email,salary*12*(1+ifnull(commission_pct,0)) "annual salary"
from employees;
select * from myv1;#查看视图myv1
#1.插入
insert into myv1 values('张飞','zf@qq.com',1000000);#插入视图以后,原始表中也会有
#2.修改
#修改视图原始表也会更新
update myv1 set last_name='张无忌' where last_name='张飞';
#3.删除
delete from myv1 where last_name='张无忌';
#往往为视图添加权限,只允许读,不允许更新
视图的可更新性和视图中查询的定义有关系,以下类型的视图是不能更新的
/*
- 包含以下关键字的sql语句:分组函数,distinct、group by、having、union或者union all
- select中包含子查询
- join
- from一个不能更新的视图
- where子句的子查询引用了from子句中的表
*/
#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
);
#更新
#下面的语句无法执行
SELECT *FROM myv6
UPDATE myv6 SET salary=10000 WHERE last_name='k_ing';
视图和表的区别
创建语法的关键字 | 是否实际占用物理空间 | 使用 | |
---|---|---|---|
视图 | create view | 没有或很少,只是保存了sql逻辑 | 增删改查,一般不能增删改 |
表 | create table | 占用,保存了实际的数据 | 增删改查 |
2.delete 和truncate在事务使用时的区别
#演示delete
#delete删除以后可以回滚
SET autocommit=0;#关闭自动提交
START TRANSACTION;#开启事务
DELETE FROM account;
ROLLBACK;#不提交,回滚
#演示truncate
#truncate 删除以后没办法回滚
SET autocommit=0;
START TRANSACTION;
TRUNCATE TABLE account;
ROLLBACK;
147 MySQL基础,测试题讲解
/*
1.创建表Book表,字段如下:
bid整型,要求主键
bname 字符型,要求设置唯一键,并非空
price 浮点型,要求有默认值10
btypeId 类型编号,要求引用bookType表的id字段
已知bookType表(不用创建),字段如下:
id
name
*/
create table Book(
bid int primary key,
bname varchar(20) unique not null,
price float default 10,
btypeId int,
foreign key(btypeId) references bookType(id)
);
/*
2.开启事务
向表中插入1行数据,并结束
*/
set autocommit=0;
insert into book(bid,bname, price,btypeId)
values(1,'小李飞刀',100,1)
rollback;
/*
#3.创建视图,实现查询价格大于100的书名和类型名
create view myv1
as
select bname,name
from book b
join bookType t on b.btypeid=t.id
where price>100;
#4.修改视图,实现查询价格在90到120之间的书名和价格
create or replace view myv1
as
select bname,price
from book
where price between 90 and 120;
#5.删除刚才建的视图
drop view myv1;
0