從為知筆記粘過來格式不太對,沒有修改了
視圖是從一個或者多個表中導出來的表,是一種虛擬存在的表,視圖就像一個窗口,通過它可以看到系統專門提供的數據。
視圖可以使用戶的操作方便,保證並且數據庫系統的安全。
內容:
視圖的作用
創建視圖
查看視圖
修改視圖
更新視圖
刪除視圖
視圖簡介
視圖從已經存在的表中導出,還可以從已經存在的視圖導出,數據庫只保存視圖的定義,而沒有存放視圖的數據。視圖的數據還是保存在原來的表中。視圖的數據依賴於原來的表,一旦原來的表發生改變,視圖的數據也相應變化。
如果需要經常查詢多個表的制定字段的數據,可以在這些表上建立一個視圖
MySQL的視圖不支持輸入參數的功能。
視圖的作用:可以起到篩選器的作用,那些對用戶沒有用或者用戶沒有權限了解的信息可以直接屏蔽掉,歸納為:
使操作簡化,增加數據的安全性,提高表的邏輯獨立性
創建視圖
mysql通過create view實現創建視圖,語法:
create [algorithm
={undifined|merge|temptable}]
view view_name [(properties)]
as
select
* [
with [
CASCADED|
LOCAL]
check
option];
解析:
algorithm是可選參數,表示視圖選擇的算法,undefined表示mysql自動選擇算法,merge表示將使用視圖的語句與視圖定義合並,使視圖的定義部分取代語句的對應部分,temptable表示視圖的結構保存到臨時表,然后使用臨時表執行語句。
view_name表示要創建的視圖的名字。
properties是可選參數,指定視圖中各屬性的名詞,默認與select中查詢的相同。
select是一個完整的查詢語句從某個表中查詢某些滿足條件的記錄並導入視圖中。
with check option是可選參數,表示更新視圖是要保證在視圖的權限范圍之內。
最好使用with cascaded check option參數
權限查詢:在mysql數據庫的user表中保存着權限信息,使用如下語句查詢
select select_priv, create_view_priv
from mysql.
user whrer
user
=
'username';
其中‘username’是數據庫用戶的用戶名。
查詢結果:
mysql
>
select select_priv, create_view_priv
from mysql.
user
where
user
=
'root';
+ -------------+------------------+
| select_priv | create_view_priv |
+ -------------+------------------+
| Y | Y |
| Y | Y |
+ -------------+------------------+
2 rows in set ( 0. 09 sec)
+ -------------+------------------+
| select_priv | create_view_priv |
+ -------------+------------------+
| Y | Y |
| Y | Y |
+ -------------+------------------+
2 rows in set ( 0. 09 sec)
在單表創建視圖:
mysql
> use login;
Database changed
mysql > select * from login;
+ -----+----------+----------------------------------+
| uid | username | password |
+ -----+----------+----------------------------------+
| 1 | test | 098f6bcd4621d373cade4e832627b4f6 |
| 2 | test1 | 5a105e8b9d40e1329780d62ea2265d8a |
| 3 | test2 | ad0234829205b9033196ba818f7a872b |
| 4 | user | ee11cbb19052e40b07aac0ca060c23ee |
| 5 | testk | f2fc2720249d97db37e2a5a3330baa4e |
+ -----+----------+----------------------------------+
5 rows in set ( 0. 05 sec)
mysql > create view login_view as select * from login where uid > = 2 and uid < = 4;
Query OK, 0 rows affected ( 0. 12 sec)
mysql > desc login_view;
+ ----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+ ----------+-------------+------+-----+---------+-------+
| uid | int( 11) | NO | | 0 | |
| username | varchar( 32) | NO | | NULL | |
| password | varchar( 32) | NO | | NULL | |
+ ----------+-------------+------+-----+---------+-------+
3 rows in set ( 0. 07 sec)
mysql > select * from login_view;
+ -----+----------+----------------------------------+
| uid | username | password |
+ -----+----------+----------------------------------+
| 2 | test1 | 5a105e8b9d40e1329780d62ea2265d8a |
| 3 | test2 | ad0234829205b9033196ba818f7a872b |
| 4 | user | ee11cbb19052e40b07aac0ca060c23ee |
+ -----+----------+----------------------------------+
3 rows in set ( 0. 04 sec)
Database changed
mysql > select * from login;
+ -----+----------+----------------------------------+
| uid | username | password |
+ -----+----------+----------------------------------+
| 1 | test | 098f6bcd4621d373cade4e832627b4f6 |
| 2 | test1 | 5a105e8b9d40e1329780d62ea2265d8a |
| 3 | test2 | ad0234829205b9033196ba818f7a872b |
| 4 | user | ee11cbb19052e40b07aac0ca060c23ee |
| 5 | testk | f2fc2720249d97db37e2a5a3330baa4e |
+ -----+----------+----------------------------------+
5 rows in set ( 0. 05 sec)
mysql > create view login_view as select * from login where uid > = 2 and uid < = 4;
Query OK, 0 rows affected ( 0. 12 sec)
mysql > desc login_view;
+ ----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+ ----------+-------------+------+-----+---------+-------+
| uid | int( 11) | NO | | 0 | |
| username | varchar( 32) | NO | | NULL | |
| password | varchar( 32) | NO | | NULL | |
+ ----------+-------------+------+-----+---------+-------+
3 rows in set ( 0. 07 sec)
mysql > select * from login_view;
+ -----+----------+----------------------------------+
| uid | username | password |
+ -----+----------+----------------------------------+
| 2 | test1 | 5a105e8b9d40e1329780d62ea2265d8a |
| 3 | test2 | ad0234829205b9033196ba818f7a872b |
| 4 | user | ee11cbb19052e40b07aac0ca060c23ee |
+ -----+----------+----------------------------------+
3 rows in set ( 0. 04 sec)
在多表上建立視圖
在多表創建視圖類似單表操作,只在select語句使用多表查詢即可。
查看視圖
1:使用desc語句
2:show table status語句查詢視圖基本信息。
show table status like 'view_name';
mysql
>
show
table status
like
'login_view' \
G;
* * * * * * * * * * * * * * * * * * * * * * * * * * * 1. row * * * * * * * * * * * * * * * * * * * * * * * * * * *
Name: login_view
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 * * * * * * * * * * * * * * * * * * * * * * * * * * *
Name: login_view
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
這條語句用於查看表信息:
mysql
>
show
table status
like
'login' \
G;
* * * * * * * * * * * * * * * * * * * * * * * * * * * 1. row * * * * * * * * * * * * * * * * * * * * * * * * * * *
Name: login
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 5
Avg_row_length: 3276
Data_length: 16384
Max_data_length: 0
Index_length: 16384
Data_free: 7340032
Auto_increment: 6
Create_time: 2012 - 10 - 28 18: 28: 57
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set ( 0. 01 sec)
* * * * * * * * * * * * * * * * * * * * * * * * * * * 1. row * * * * * * * * * * * * * * * * * * * * * * * * * * *
Name: login
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 5
Avg_row_length: 3276
Data_length: 16384
Max_data_length: 0
Index_length: 16384
Data_free: 7340032
Auto_increment: 6
Create_time: 2012 - 10 - 28 18: 28: 57
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set ( 0. 01 sec)
從上面兩個查詢結構可以直觀看出視圖和表的區別。
雖然show table status可以查看視圖的基本信息,但是不推薦使用,因為能提供的信息太少。
3.show create view語句查看視圖信息
mysql
>
show
create
view login_view \
G;
* * * * * * * * * * * * * * * * * * * * * * * * * * * 1. row * * * * * * * * * * * * * * * * * * * * * * * * * * *
View: login_view
Create View: CREATE ALGORITHM =UNDEFINED DEFINER =`root`@`localhost` SQL SECURITY DEFINER VIE
W `login_view` AS select `login`.`uid` AS `uid`,`login`.`username` AS `username`,`login`.` password`
AS ` password` from `login` where ((`login`.`uid` > = 2) and (`login`.`uid` < = 4))
character_set_client: gbk
collation_connection: gbk_chinese_ci
1 row in set ( 0.00 sec)
* * * * * * * * * * * * * * * * * * * * * * * * * * * 1. row * * * * * * * * * * * * * * * * * * * * * * * * * * *
View: login_view
Create View: CREATE ALGORITHM =UNDEFINED DEFINER =`root`@`localhost` SQL SECURITY DEFINER VIE
W `login_view` AS select `login`.`uid` AS `uid`,`login`.`username` AS `username`,`login`.` password`
AS ` password` from `login` where ((`login`.`uid` > = 2) and (`login`.`uid` < = 4))
character_set_client: gbk
collation_connection: gbk_chinese_ci
1 row in set ( 0.00 sec)
4:在view表中查看視圖的詳細信息。
select
*
from information_schema.views \
G;
information_schema是mysql自帶的一個數據庫。查詢結果如下:
mysql
>
select
*
from information_schema.views \
G;
* * * * * * * * * * * * * * * * * * * * * * * * * * * 1. row * * * * * * * * * * * * * * * * * * * * * * * * * * *
TABLE_CATALOG: def
TABLE_SCHEMA: login
TABLE_NAME: login_view
VIEW_DEFINITION: select `login`.`login`.`uid` AS `uid`,`login`.`login`.`username` AS `username`
,`login`.`login`.` password` AS ` password` from `login`.`login` where ((`login`.`login`.`uid` > = 2) a
nd (`login`.`login`.`uid` < = 4))
CHECK_OPTION: NONE
IS_UPDATABLE: YES
DEFINER: root@localhost
SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: gbk
COLLATION_CONNECTION: gbk_chinese_ci
1 row in set ( 0. 10 sec)
* * * * * * * * * * * * * * * * * * * * * * * * * * * 1. row * * * * * * * * * * * * * * * * * * * * * * * * * * *
TABLE_CATALOG: def
TABLE_SCHEMA: login
TABLE_NAME: login_view
VIEW_DEFINITION: select `login`.`login`.`uid` AS `uid`,`login`.`login`.`username` AS `username`
,`login`.`login`.` password` AS ` password` from `login`.`login` where ((`login`.`login`.`uid` > = 2) a
nd (`login`.`login`.`uid` < = 4))
CHECK_OPTION: NONE
IS_UPDATABLE: YES
DEFINER: root@localhost
SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: gbk
COLLATION_CONNECTION: gbk_chinese_ci
1 row in set ( 0. 10 sec)
修改視圖
create or replace view語句與alter語句修改
1.create or replace view
語法:
create
or replace [algorithm
={undefined|merge|temptable}]
view view_name [(propertise)]
as selecte
* [
with [
cascaded|
local]
check
option];
有點像create view,create or replace在視圖不存在的情況下創建視圖,視圖已存在則修改視圖。
2.alter語句
alter [algorithm
={undefined|merge|temptable}]
view view_name [(propertise)]
as selecte
* [
with [
cascaded|
local]
check
option];
參數和create view相同。
更新視圖
update,注意不要寫成updata。
語法:
update view_name
set property_1
=a[, property_2
=b..];
注意:更新會修改源表,而不只是修改視圖,因為視圖沒有存儲,實際操作都是針對源表。主鍵字段不能update。update會修改視圖中的所有數據。
不能更新視圖的情況
- 視圖包含sum(),count(),max(),min()等函數。
- 視圖包含union,union all,distinct,group by, having等關鍵字。
- 常量視圖
- 創建視圖的select語句包含select子句。
- 由不可更新的視圖導出的視圖。//視圖可以繼續導出視圖。
- 創建視圖是algorithm參數為temptable。
- 視圖對應的表上沒有默認值的列,並且該列不再視圖里。
- 除此外with check option可能決定視圖鞥否更新。
刪除視圖
刪除視圖時只刪除視圖的定義,而不刪除視圖源表的數據。
語法:
drop
view [if exits] view_name_list [
restrict|cascad];
解析:
if exits判斷視圖是否存在,存在則執行刪除,不存在則不執行。
可以一次刪除多個視圖。
mysql
>
drop
view if exits login_view;
ERROR 1064 ( 42000): You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'exits login_view' at line 1
mysql > drop view if exists login_view;
Query OK, 0 rows affected ( 0.00 sec)
mysql > desc login_view;
ERROR 1146 ( 42S02): Table 'login.login_view' doesn 't exist
ERROR 1064 ( 42000): You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'exits login_view' at line 1
mysql > drop view if exists login_view;
Query OK, 0 rows affected ( 0.00 sec)
mysql > desc login_view;
ERROR 1146 ( 42S02): Table 'login.login_view' doesn 't exist
刪除視圖需要權限允許。查看是否有刪除權限的命令:
select Drop_priv
from mysql.
user
where
user
=
'username';
結果為:
mysql
>
select drop_priv
from mysql.
user
where
user
=
'root';
+ -----------+
| drop_priv |
+ -----------+
| Y |
| Y |
+ -----------+
2 rows in set ( 0.00 sec)
+ -----------+
| drop_priv |
+ -----------+
| Y |
| Y |
+ -----------+
2 rows in set ( 0.00 sec)
<完>