前言:
什麼是視圖?
一張虛表,和真實的表一樣。視圖包含一系列帶有名稱的行和列數據。視圖是從一個或多個表中導出來的,我們可以通過insert,update,delete來操作視圖。當通過視圖看到的數據被修改時,相應的原表的數據也會變化。同時原表發生變化,則這種變化也可以自動反映到視圖中。
視圖具有以下優點:
- 簡單化:看到的就是需要的。視圖不僅可以簡化用戶對數據的理解,也可以簡化操作。經常被使用的查詢可以製作成一個視圖;
- 安全性:通過視圖用戶只能查詢和修改所能見到的數據,數據庫中其他的數據既看不見也取不到。數據庫授權命令可以讓每個用戶對數據庫的檢索限制到特定的數據庫對象上,但不能授權到數據庫特定的行,列上;
- 邏輯數據獨立性:視圖可幫助用戶屏蔽真實表結構變化帶來的影響。
視圖和表的區別以及聯繫是什麼?
兩者的區別:
- 視圖是已經編譯好的SQL語句,是基於SQL語句的結果集的可視化的表,而表不是;
- 視圖沒有實際的物理記錄,而表有;
- 表是內容,視圖窗口;
- 表和視圖雖然都佔用物理空間,但是視圖只是邏輯概念存在,而表可以及時對數據進行修改,但是視圖只能用創建語句來修改 ;
- 視圖是查看數據表的一種方法,可以查詢數據表中某些字段構成的數據,只是一些SQL 語句的集合。從安全角度來說,視圖可以防止用戶接觸數據表,因而不知道表結構 ;
- 表屬於全局模式中的表,是實表。而視圖屬於局部模式的表,是虛表;
- 視圖的建立和刪除隻影響視圖本身,而不影響對應表的基本表。
兩者的聯繫:
視圖是在基本表之上建立的表,它的結構和內容都來自於基本表,它依賴基本表存在而存在。一個視圖可以對應一個基本表,也可以對應多個基本表。視圖是基本的抽象和邏輯意義上建立的關係。
一、創建視圖
1、創建單表視圖
mysql> create table t(quantity int,price int); <!--創建表-->
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t values(3,50); <!--插入數據-->
Query OK, 1 row affected (0.00 sec)
<!--創建視圖-->
mysql> create view view_t as select quantity,price,quantity*price as tottal from t;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from view_t; <!--查看視圖的數據-->
+----------+-------+-------+
| quantity | price | total |
+----------+-------+-------+
| 3 | 50 | 150 |
+----------+-------+-------+
1 row in set (0.00 sec)
2、創建多表視圖
<!--創建基本表-->
mysql> create table student
-> (
-> s_id int(3) primary key,
-> s_name varchar(30),
-> s_age int(3),
-> s_sex varchar(8)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> create table stu_info
-> (
-> s_id int(3),
-> class varchar(50),
-> addr varchar(100)
-> );
Query OK, 0 rows affected (0.01 sec)
<!--插入些數據-->
mysql> insert into stu_info values
-> (1,'erban','anhui'),
-> (2,'sanban','chongqing'),
-> (3,'yiban','shangdong');
<!--創建視圖-->
mysql> create view stu_class(id,name,class) as
-> select student.s_id,student.s_name,stu_info.class
-> from student,stu_info where student.s_id=stu_info.s_id;
3、查看視圖的相關信息
<!--查看視圖的表結構-->
mysql> desc stu_class;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(3) | NO | | NULL | |
| name | varchar(30) | YES | | NULL | |
| class | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
<!--查看視圖的基本信息-->
mysql> show table status like 'stu_class'\G
*************************** 1. row ***************************
Name: stu_class
Engine: NULL
Version: NULL
Row_format: NULL
Rows: NULL
Avg_row_length: NULL
Data_length: NULL
Max_data_length: NULL
Index_length: NULL
Data_free: NULL
Auto_increment: NULL
Create_time: NULL
Update_time: NULL
Check_time: NULL
Collation: NULL
Checksum: NULL
Create_options: NULL
Comment: VIEW
1 row in set (0.01 sec)
<!--查看視圖的詳細信息-->
mysql> show create view stu_class\G
*************************** 1. row ***************************
View: stu_class
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `stu_class` AS select `student`.`s_id` AS `id`,`student`.`s_name` AS `name`,`stu_into`.`class` AS `class` from (`student` join `stu_into`) where (`student`.`s_id` = `stu_into`.`s_id`)
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)
<!--也可以直接查詢information_schema庫中的views表,來查看所有的視圖-->
mysql> select * from information_schema.views where TABLE_SCHEMA='test02'\G
<!--where後面指定的是一個庫名,也就是查看test02這個庫中的所有視圖-->
4、修改視圖
方式一:
<!--修改視圖-->
mysql> create or replace view view_t as select * from t;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from view_t; <!--查看修改後的視圖-->
+----------+-------+
| quantity | price |
+----------+-------+
| 3 | 50 |
+----------+-------+
1 row in set (0.00 sec)
方式二:
mysql> alter view view_t(abc) as select quantity from t; <!--修改時指定視圖的列名-->
Query OK, 0 rows affected (0.00 sec)
mysql> desc view_t; <!--查看修改後的表結構-->
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| abc | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
5、更新視圖
1)update指令更新
<!--查看錶以及視圖的數據,其中quantity對應視圖的abc字段-->
mysql> select * from t;
+----------+-------+
| quantity | price |
+----------+-------+
| 3 | 50 |
+----------+-------+
1 row in set (0.00 sec)
mysql> select * from view_t;
+------+
| abc |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
mysql> update view_t set abc=5;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from view_t; <!--查看更新後的視圖-->
+------+
| abc |
+------+
| 5 |
+------+
1 row in set (0.00 sec)
mysql> select * from t; <!--查看更新後的表-->
+----------+-------+
| quantity | price |
+----------+-------+
| 5 | 50 |
+----------+-------+
1 row in set (0.00 sec)
2)insert指令更新
mysql> select * from t; <!--查看錶的數據-->
+----------+-------+
| quantity | price |
+----------+-------+
| 5 | 50 |
+----------+-------+
1 row in set (0.00 sec)
mysql> select * from view_t; <!--查看視圖的數據-->
+------+
| abc |
+------+
| 5 |
+------+
1 row in set (0.00 sec)
mysql> insert into t values(3,5); <!--向表中插入數據-->
Query OK, 1 row affected (0.00 sec)
mysql> select * from view_t; <!--查看視圖的數據-->
+------+
| abc |
+------+
| 5 |
| 3 |
+------+
2 rows in set (0.00 sec)
mysql> select * from t; <!--查看錶的數據-->
+----------+-------+
| quantity | price |
+----------+-------+
| 5 | 50 |
| 3 | 5 |
+----------+-------+
2 rows in set (0.00 sec)
3) delete指令刪除表數據
<!--創建新的視圖-->
mysql> create view view_t2(qty,price,total) as select quantity,price,quantity*price from t;
mysql> select * from view_t2; <!--查看視圖的內容-->
+------+-------+-------+
| qty | price | total |
+------+-------+-------+
| 5 | 50 | 250 |
| 3 | 5 | 15 |
+------+-------+-------+
2 rows in set (0.00 sec)
mysql> delete from view_t2 where price=5; <!--刪除視圖的數據-->
Query OK, 1 row affected (0.00 sec)
mysql> select * from view_t2; <!--再次查看視圖的數據-->
+------+-------+-------+
| qty | price | total |
+------+-------+-------+
| 5 | 50 | 250 |
+------+-------+-------+
1 row in set (0.00 sec)
mysql> select * from t; <!--查看原表的數據-->
+----------+-------+
| quantity | price |
+----------+-------+
| 5 | 50 |
+----------+-------+
1 row in set (0.00 sec)
6、刪除視圖
mysql> drop view view_t; <!--刪除視圖-->