MySQL 视图(View)可以理解为是一种虚拟存在的表,表面上看起来和真实表一样。视图是数据库对象之一。
数据库中只存放了视图的定义,并没有存放视图中的数据,这些数据都存放在定义视图查询所引用的真实表中,本质是来自于一个 select子句。
使用视图查询数据时,数据库会从真实表中取出对应的数据。因此,视图中的数据是依赖于真实表中的数据的。一旦真实表中的数据发生改变,显示在视图中的数据也会发生改变。
为什么需要视图?
答:
1.假设一张表中有些字段不希望某些用户看见,那么就可以使用视图进行筛选,仅展示可查看的字段,进而保护了表结构。
2.可以使用视图返回多张表的关联查询结构,对于使用者而言他并不知道这些数据来自多张表,进而简化查询操作。
创建语法:
create [or replace] view 视图名 as select .... ;
1.准备测试数据
DROP TABLE IF EXISTS emp;
CREATE TABLE emp (
id int(11) PRIMARY KEY AUTO_INCREMENT,
age int(11) DEFAULT NULL,
name varchar(50) DEFAULT NULL
)DEFAULT CHARSET=utf8;
INSERT INTO `emp` VALUES (1, 18, '张三');
INSERT INTO `emp` VALUES (2, 20, '李四');
INSERT INTO `emp` VALUES (3, 25, '王五');
INSERT INTO `emp` VALUES (4, 22, '赵六');
2.创建一个简单视图
create view v_emp1 as select * from emp;
3.创建一个有别名的视图
create view v_emp2 as select age+10 as my_age from emp;
视图本身不存储数据,操作视图就相当于操作视图对应的基表中的数据。
查询:select * from v_emp1;
删除:delete from v_emp1 where id=1; -- 视图和原表数据都会被删除
修改:update v_emp1 set name='wwb' where id=2; -- 视图和原表数据都会被修改
增加:insert into v_emp1 values (5, 11, '666'); -- 视图和原表数据都会增加(一般视图是不建议插入的,会造成原表数据污染)
可以为视图加限定条件,从而约束使用者行为:with check option
create view v_emp3 as select * from emp where age<200 with check option;
测试:
测试插入:
mysql> insert into v_emp3(age) values(300);
ERROR 1369 (HY000): CHECK OPTION failed 'v_test.v_emp3' -- 失败
mysql> insert into v_emp3(age) values(100); -- 成功
Query OK, 1 row affected (0.08 sec)
DESC 视图名; -- 查看视图的字段信息
SHOW CREATE VIEW 视图名; -- 查看视图的创建信息
DROP VIEW <视图名1> [ , <视图名2> …]
ALTER VIEW <视图名> AS <SELECT语句>