136 MySQL视图

目录

  • 一、视图概念
  • 二、视图实例
    • 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 | 上海   | 浦东      | 教职部    |
+----+---------+------+------+--------+--------+-----------+-----------+

你可能感兴趣的:(136 MySQL视图)