什么是视图? 它是一个【虚拟表】
怎么来的? 从数据库中的一张或者多张表导出的
干什么用的?
1. 方便用户操作
要求所见即所需,无需添加额外的查询条件,直接查看;
2. 增加原数据的安全性
通过试图,用户只能查看或者修改制定的数据;
3. 提高表的独立逻辑性
原有数据表结构的变化,不会影响视图,如果修改原有列,责只需要修改视图即可。
是否有权限创建?
通过sql查询
select select_priv,create_view_priv from mysql.user where user ='root';
一、创建视图
1、语法:
create
[algorithm = {undefined | merge | temptable}]
view 视图名 [{属性清单}]
as select 语句
[with [cascaded|local] check option];
algorithm:选择的算法
with check option:表示更新视图时要保证在该视图的权限范围之内
undfined:表示 MySQL 自动选择所需使用的算法
merge:表示将视图的语句与视图的定义合并,使得视图定义的某一部分取代语句的对应部分
temptable:将视图的结果存入临时表
cascaded:表示更新视图时要满足所有相关视图和表的条件
local:表示更新视图时,要满足该视图本身的定义的条件即可。
- 单表创建视图
CREATE VIEW Course_view as SELECT * FROM Course;
- 多表创建视图
CREATE algorithm = merge VIEW StudentScore_view as
SELECT t.s_name,t.s_sex,t3.c_name,t2.s_score FROM Student t ,Score t2 ,Course t3 WHERE t.s_id = t2.s_id and t2.c_id = t3.c_id
二、查看视图
- desc + 视图名称查看视图;
desc StudentScore_view
- show table status
show table status like 'StudentScore_view' \G;
3. show create view 视图名
show create view StudentScore_view \G;
4. 在veiws 表中查看
select * from information_schema.views \G;
三、修改视图
- 通过 create or replace view 修改(如果没有则创建,有则修改)
create or replace algorithm = temptable view course_view as select * from course where c_id in ('01','02');
- 通过alter 修改(只能修改不能创建)
alter view course_view as select * from course with check option;
四、更新视图
- 查看视图信息
select * from course_view ;
- 更新视图
注意:并非所有的视图都能更新!!!
update course_view set c_name = '语文';
-- 比如说我这个,我更新报错了,ERROR 1288 (HY000): The target table course_view of the UPDATE is not updatable
报错原因为:(我的course表有主键,切其余字段都定义了不为空)
so 我更新了别的表 --
update studentscore_view set s_name='王宇';
mysql> select * from studentscore_view ;
+--------+-------+--------+---------+
| s_name | s_sex | c_name | s_score |
+--------+-------+--------+---------+
| 王宇 | 男 | 语文 | 80 |
| 王宇 | 男 | 数学 | 90 |
| 王宇 | 男 | 英语 | 99 |
+--------+-------+--------+---------+
所有的名字都让我改成了同一个人~~
当视图中包含有如下内容时,视图的更新操作将不能被执行:
(1)视图中包含聚合函数时:
(2)视图中包含 union、union all、distinct、group by 和 having 等关键字
(3)常量视图
(4)视图中的 select 中包含子查询
(5)由不可更新的视图导出的视图
(6)创建视图时,algorithm 为 temptable 类型
(7)视图对应的表上存在没有默认值的列,而且该列没有包含在视图里。
[最好视图仅限于查询,若要更新则要考虑全面,否则会造成更新失败]
五、 删除试图
- 语法
drop view [if exists] 视图列表
drop view if exists course_view;
--Query OK, 0 rows affected (0.01 sec)
- 判断是否有删除权限
select drop_priv from mysql.user where user='root';
-- mysql> select drop_priv from mysql.user where user='root';
+-----------+
| drop_priv |
+-----------+
| Y |
+-----------+