視圖是從一個(gè)或者多個(gè)表中導(dǎo)出來(lái)的表,是一種虛擬存在的表,視圖就像一個(gè)窗口,通過(guò)它可以看到系統(tǒng)專(zhuān)門(mén)提供的數(shù)據(jù)。 視圖可以使用戶(hù)的操作方便,保證并且數(shù)據(jù)庫(kù)系統(tǒng)的安全。 內(nèi)容: 視圖的作用 創(chuàng)建視圖 查看視圖 修改視圖 更新視圖 刪除視圖 視圖簡(jiǎn)介視圖從已經(jīng)存在的表中導(dǎo)出,還可以從已經(jīng)存在的視圖導(dǎo)出,數(shù)據(jù)庫(kù)只保存視圖的定義,而沒(méi)有存放視圖的數(shù)據(jù)。視圖的數(shù)據(jù)還是保存在原來(lái)的表中。視圖的數(shù)據(jù)依賴(lài)于原來(lái)的表,一旦原來(lái)的表發(fā)生改變,視圖的數(shù)據(jù)也相應(yīng)變化。 如果需要經(jīng)常查詢(xún)多個(gè)表的制定字段的數(shù)據(jù),可以在這些表上建立一個(gè)視圖 MySQL的視圖不支持輸入?yún)?shù)的功能。 視圖的作用:可以起到篩選器的作用,那些對(duì)用戶(hù)沒(méi)有用或者用戶(hù)沒(méi)有權(quán)限了解的信息可以直接屏蔽掉,歸納為: 使操作簡(jiǎn)化,增加數(shù)據(jù)的安全性,提高表的邏輯獨(dú)立性 創(chuàng)建視圖mysql通過(guò)create view實(shí)現(xiàn)創(chuàng)建視圖,語(yǔ)法: create [algorithm={undifined|merge|temptable}] view view_name [(properties)] as select * [with [CASCADED|LOCAL] check option]; 解析: algorithm是可選參數(shù),表示視圖選擇的算法,undefined表示mysql自動(dòng)選擇算法,merge表示將使用視圖的語(yǔ)句與視圖定義合并,使視圖的定義部分取代語(yǔ)句的對(duì)應(yīng)部分,temptable表示視圖的結(jié)構(gòu)保存到臨時(shí)表,然后使用臨時(shí)表執(zhí)行語(yǔ)句。 view_name表示要?jiǎng)?chuàng)建的視圖的名字。 properties是可選參數(shù),指定視圖中各屬性的名詞,默認(rèn)與select中查詢(xún)的相同。 select是一個(gè)完整的查詢(xún)語(yǔ)句從某個(gè)表中查詢(xún)某些滿(mǎn)足條件的記錄并導(dǎo)入視圖中。 with check option是可選參數(shù),表示更新視圖是要保證在視圖的權(quán)限范圍之內(nèi)。 最好使用with cascaded check option參數(shù) 權(quán)限查詢(xún):在mysql數(shù)據(jù)庫(kù)的user表中保存著權(quán)限信息,使用如下語(yǔ)句查詢(xún) select select_priv, create_view_priv from mysql.user whrer user='username'; 其中‘username’是數(shù)據(jù)庫(kù)用戶(hù)的用戶(hù)名。 查詢(xún)結(jié)果: 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) 在單表創(chuàng)建視圖: 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)
查看視圖1:使用desc語(yǔ)句 2:show table status語(yǔ)句查詢(xún)視圖基本信息。 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
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)
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)
select * from information_schema.views \G; information_schema是mysql自帶的一個(gè)數(shù)據(jù)庫(kù)。查詢(xún)結(jié)果如下: 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) 修改視圖create or replace view語(yǔ)句與alter語(yǔ)句修改 1.create or replace view 語(yǔ)法:
create or replace [algorithm={undefined|merge|temptable}] view view_name [(propertise)] as selecte * [with [cascaded|local] check option]; 有點(diǎn)像create view,create or replace在視圖不存在的情況下創(chuàng)建視圖,視圖已存在則修改視圖。 2.alter語(yǔ)句 alter [algorithm={undefined|merge|temptable}] view view_name [(propertise)] as selecte * [with [cascaded|local] check option]; 參數(shù)和create view相同。 更新視圖update,注意不要寫(xiě)成updata。 語(yǔ)法:update view_name set property_1=a[, property_2=b..]; 注意:更新會(huì)修改源表,而不只是修改視圖,因?yàn)橐晥D沒(méi)有存儲(chǔ),實(shí)際操作都是針對(duì)源表。主鍵字段不能update。update會(huì)修改視圖中的所有數(shù)據(jù)。 不能更新視圖的情況
刪除視圖刪除視圖時(shí)只刪除視圖的定義,而不刪除視圖源表的數(shù)據(jù)。 語(yǔ)法: drop view [if exits] view_name_list [restrict|cascad]; 解析: if exits判斷視圖是否存在,存在則執(zhí)行刪除,不存在則不執(zhí)行。 可以一次刪除多個(gè)視圖。 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 刪除視圖需要權(quán)限允許。查看是否有刪除權(quán)限的命令: select Drop_priv from mysql.user where user='username'; 結(jié)果為: mysql> select drop_priv from mysql.user where user = 'root'; +-----------+ | drop_priv | +-----------+ | Y | | Y | +-----------+ 2 rows in set (0.00 sec)
|
|
來(lái)自: 暖風(fēng)醉伊人 > 《數(shù)據(jù)庫(kù)》