目录
- 一、视图概念
- 二、视图实例
- 2.1 语法
- 2.2 实例
- 一、创建表实例
- 二、视图改操作
- 三、视图增操作
一、视图概念
- 视图是存在内存中的临时表
- 视图的创建依赖select语句,所以就是select语句操作的结果形成的表
- 视图支持对数据的增删改查,增删改本质是直接对创建视图的真实表进行操作
- 视图不允许对视图表的字段做修改
- 视图不仅支持创建,也支持更新与删除
二、视图实例
2.1 语法
1.只是创建:create view 视图名[(别名们)] as select 语句;
2.没有表的时候是create,否则替换表:create or replace 视图名[(别名们)] as select 语句;
3.用来修改已有的视图:alter 视图名[(别名们)] as select 语句;
2.2 实例
基于emp表,表数据如下:
mysql> select * from emp;
+----+------+------+------+--------+--------+-----------+-----------+
| id | name | sex | age | salary | area | addr | dep |
+----+------+------+------+--------+--------+-----------+-----------+
| 1 | aaa | 男 | 42 | 10.5 | 上海 | 浦东 | 教职部 |
| 2 | bbb | 男 | 38 | 9.4 | 山东 | 济南 | 教学部 |
| 3 | ccc | 女 | 30 | 3 | 江苏 | 张家港 | 教学部 |
| 4 | ddd | 女 | 28 | 2.4 | 广州 | 广东 | 教学部 |
| 5 | eee | 男 | 28 | 2.4 | 江苏 | 苏州 | 教学部 |
| 6 | fff | 男 | 18 | 8.8 | 中国 | 黄浦 | 咨询部 |
| 7 | ggg | 男 | 18 | 8.8 | 安徽 | 宣城 | 教学部 |
| 8 | hhh | 男 | 28 | 9.8 | 安徽 | 巢湖 | 教学部 |
| 9 | iii | 女 | 36 | 1.2 | 安徽 | 芜湖 | 咨询部 |
| 10 | jjj | 男 | 36 | 5.8 | 山东 | 济南 | 教学部 |
| 11 | kkk | 女 | 28 | 1.2 | 山东 | 青岛 | 教职部 |
| 12 | lll | 男 | 30 | 9 | 上海 | 浦东 | 咨询部 |
| 13 | mmm | 男 | 30 | 6 | 上海 | 浦东 | 咨询部 |
| 14 | nnn | 男 | 30 | 6 | 上海 | 浦西 | 教学部 |
| 15 | ooo | 女 | 67 | 2.501 | 上海 | 陆家嘴 | 教学部 |
+----+------+------+------+--------+--------+-----------+-----------+
一、创建表实例
1.创建视图v1(用来查询每个部门的最高薪资)
# 直接用select语句的结果显示的字段作为视图v1的字段名
create view v1 as select dep,max(salary) from emp group by dep;
mysql> select * from v1;
+-----------+-------------+
| dep | max(salary) |
+-----------+-------------+
| 咨询部 | 9 |
| 教学部 | 9.8 |
| 教职部 | 10.5 |
+-----------+-------------+
# 用dep_name,max_salary 来作为视图的字段
create view v1(dep_name,max_salary) as select dep,max(salary) from emp group by dep;
mysql> select * from v1;
+-----------+------------+
| dep_name | max_salary |
+-----------+------------+
| 咨询部 | 9 |
| 教学部 | 9.8 |
| 教职部 | 10.5 |
+-----------+------------+
2.创建或替换视图
create or replace view v1(depname,maxname) as select dep, max(salary) from emp group by dep;
mysql> select * from v1;
+-----------+---------+
| depname | maxname |
+-----------+---------+
| 咨询部 | 9 |
| 教学部 | 9.8 |
| 教职部 | 10.5 |
+-----------+---------+
3.直接修改已有的视图
alter view v1(name,salary) as select dep,max(salary) from emp group by dep;
mysql> select * from v1;
+-----------+--------+
| name | salary |
+-----------+--------+
| 咨询部 | 9 |
| 教学部 | 9.8 |
| 教职部 | 10.5 |
+-----------+--------+
二、视图改操作
- 前提:视图的增删改操作可以直接映射给真实表(本质就是对真实表进行操作)
1.先创建一个视图v2(显示emp表的id,name,age,salary)
create or replace view v2 as select id,name,age,salary from emp;
mysql> select * from v2;
+----+------+------+--------+
| id | name | age | salary |
+----+------+------+--------+
| 1 | aaa | 42 | 10.5 |
| 2 | bbb | 38 | 9.4 |
| 3 | ccc | 30 | 3 |
| 4 | ddd | 28 | 2.4 |
| 5 | eee | 28 | 2.4 |
| 6 | fff | 18 | 8.8 |
| 7 | ggg | 18 | 8.8 |
| 8 | hhh | 28 | 9.8 |
| 9 | iii | 36 | 1.2 |
| 10 | jjj | 36 | 5.8 |
| 11 | kkk | 28 | 1.2 |
| 12 | lll | 30 | 9 |
| 13 | mmm | 30 | 6 |
| 14 | nnn | 30 | 6 |
| 15 | ooo | 67 | 2.501 |
+----+------+------+--------+
2.更新v2的数据,把v2视图id为1的人 的salary+1(从此处我们可以发现我们直接对视图进行修改,回影响真实表)
update v2 set salary=salary+1 where id=1;
mysql> select * from v2;
+----+------+------+--------+
| id | name | age | salary |
+----+------+------+--------+
| 1 | aaa | 42 | 12.5 |
| 2 | bbb | 38 | 9.4 |
| 3 | ccc | 30 | 3 |
| 4 | ddd | 28 | 2.4 |
| 5 | eee | 28 | 2.4 |
| 6 | fff | 18 | 8.8 |
| 7 | ggg | 18 | 8.8 |
| 8 | hhh | 28 | 9.8 |
| 9 | iii | 36 | 1.2 |
| 10 | jjj | 36 | 5.8 |
| 11 | kkk | 28 | 1.2 |
| 12 | lll | 30 | 9 |
| 13 | mmm | 30 | 6 |
| 14 | nnn | 30 | 6 |
| 15 | ooo | 67 | 2.501 |
+----+------+------+--------+
mysql> select * from emp;
+----+------+------+------+--------+--------+-----------+-----------+
| id | name | sex | age | salary | area | addr | dep |
+----+------+------+------+--------+--------+-----------+-----------+
| 1 | aaa | 男 | 42 | 12.5 | 上海 | 浦东 | 教职部 |
| 2 | bbb | 男 | 38 | 9.4 | 山东 | 济南 | 教学部 |
| 3 | ccc | 女 | 30 | 3 | 江苏 | 张家港 | 教学部 |
| 4 | ddd | 女 | 28 | 2.4 | 广州 | 广东 | 教学部 |
| 5 | eee | 男 | 28 | 2.4 | 江苏 | 苏州 | 教学部 |
| 6 | fff | 男 | 18 | 8.8 | 中国 | 黄浦 | 咨询部 |
| 7 | ggg | 男 | 18 | 8.8 | 安徽 | 宣城 | 教学部 |
| 8 | hhh | 男 | 28 | 9.8 | 安徽 | 巢湖 | 教学部 |
| 9 | iii | 女 | 36 | 1.2 | 安徽 | 芜湖 | 咨询部 |
| 10 | jjj | 男 | 36 | 5.8 | 山东 | 济南 | 教学部 |
| 11 | kkk | 女 | 28 | 1.2 | 山东 | 青岛 | 教职部 |
| 12 | lll | 男 | 30 | 9 | 上海 | 浦东 | 咨询部 |
| 13 | mmm | 男 | 30 | 6 | 上海 | 浦东 | 咨询部 |
| 14 | nnn | 男 | 30 | 6 | 上海 | 浦西 | 教学部 |
| 15 | ooo | 女 | 67 | 2.501 | 上海 | 陆家嘴 | 教学部 |
+----+------+------+------+--------+--------+-----------+-----------+
3.修改真实表emp的数据,也会影响视图
update emp set salary=salary+1 where id=1;
mysql> select * from v2;
+----+------+------+--------+
| id | name | age | salary |
+----+------+------+--------+
| 1 | aaa | 42 | 13.5 |
| 2 | bbb | 38 | 9.4 |
| 3 | ccc | 30 | 3 |
| 4 | ddd | 28 | 2.4 |
| 5 | eee | 28 | 2.4 |
| 6 | fff | 18 | 8.8 |
| 7 | ggg | 18 | 8.8 |
| 8 | hhh | 28 | 9.8 |
| 9 | iii | 36 | 1.2 |
| 10 | jjj | 36 | 5.8 |
| 11 | kkk | 28 | 1.2 |
| 12 | lll | 30 | 9 |
| 13 | mmm | 30 | 6 |
| 14 | nnn | 30 | 6 |
| 15 | ooo | 67 | 2.501 |
+----+------+------+--------+
三、视图增操作
1.重新以v3这个视图为例(显示emp的所有数据)
create or replace view v3 as select * from emp;
2.给视图v3增加一条数据
insert into v3 values(16, 'cecilia', '女',18, 1.51, '上海', '浦东', '教职部');
mysql> select * from v3; 职部');;
+----+---------+------+------+--------+--------+-----------+-----------+
| id | name | sex | age | salary | area | addr | dep |
+----+---------+------+------+--------+--------+-----------+-----------+
| 1 | aaa | 男 | 42 | 13.5 | 上海 | 浦东 | 教职部 |
| 2 | bbb | 男 | 38 | 9.4 | 山东 | 济南 | 教学部 |
| 3 | ccc | 女 | 30 | 3 | 江苏 | 张家港 | 教学部 |
| 4 | ddd | 女 | 28 | 2.4 | 广州 | 广东 | 教学部 |
| 5 | eee | 男 | 28 | 2.4 | 江苏 | 苏州 | 教学部 |
| 6 | fff | 男 | 18 | 8.8 | 中国 | 黄浦 | 咨询部 |
| 7 | ggg | 男 | 18 | 8.8 | 安徽 | 宣城 | 教学部 |
| 8 | hhh | 男 | 28 | 9.8 | 安徽 | 巢湖 | 教学部 |
| 9 | iii | 女 | 36 | 1.2 | 安徽 | 芜湖 | 咨询部 |
| 10 | jjj | 男 | 36 | 5.8 | 山东 | 济南 | 教学部 |
| 11 | kkk | 女 | 28 | 1.2 | 山东 | 青岛 | 教职部 |
| 12 | lll | 男 | 30 | 9 | 上海 | 浦东 | 咨询部 |
| 13 | mmm | 男 | 30 | 6 | 上海 | 浦东 | 咨询部 |
| 14 | nnn | 男 | 30 | 6 | 上海 | 浦西 | 教学部 |
| 15 | ooo | 女 | 67 | 2.501 | 上海 | 陆家嘴 | 教学部 |
| 16 | cecilia | 女 | 18 | 1.51 | 上海 | 浦东 | 教职部 |
+----+---------+------+------+--------+--------+-----------+-----------+