136 MySQL視圖

1、視圖概念

  • 視圖是存在內存中的臨時表
  • 視圖的建立依賴select語句,因此就是select語句操做的結果造成的表
  • 視圖支持對數據的增刪改查,增刪改本質是直接對建立視圖的真實表進行操做
  • 視圖不容許對視圖表的字段作修改
  • 視圖不只支持建立,也支持更新與刪除

2、視圖實例

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、建立表實例

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 |
+-----------+--------+

2、視圖改操做

  • 前提:視圖的增刪改操做能夠直接映射給真實表(本質就是對真實表進行操做)
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 |
+----+------+------+--------+

3、視圖增操做

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 | 上海   | 浦東      | 教職部    |
+----+---------+------+------+--------+--------+-----------+-----------+
相關文章
相關標籤/搜索