資料庫MySQL-視圖
- 2020 年 3 月 27 日
- 筆記
1.4 視圖
1.4.1 概述
1、視圖是一張虛擬表,它表示一張表的部分數據或多張表的綜合數據,其結構和數據是建立在對錶的查詢基礎上
2、視圖中並不存放數據,而是存放在視圖所引用的原始表(基表)中
3、同一張原始表,根據不同用戶的不同需求,可以創建不同的視圖
1.4.2 作用
1、篩選表中的行
2、防止未經許可的用戶訪問敏感數據
3、隱藏數據表的結構
4、降低數據表的複雜程度
1.4.3 創建視圖
語法:
-- 創建視圖 create view 視圖名 as select 語句; -- 查詢視圖 select 列名 from 視圖
例題
-- 創建視圖 mysql> create view view1 -> as -> select * from stu where ch>=60 and math>=60; Query OK, 0 rows affected (0.00 sec) -- 查詢視圖 mysql> select * from view1; +--------+----------+--------+--------+---------+------------+------+------+ | stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | +--------+----------+--------+--------+---------+------------+------+------+ | s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 | | s25318 | 爭青小子 | 男 | 26 | 6 | 天津 | 86 | 92 | | s25319 | 梅超風 | 女 | 23 | 5 | 河北 | 74 | 67 | | s25320 | Tom | 男 | 24 | 8 | 北京 | 65 | 67 | | s25321 | Tabm | 女 | 23 | 9 | 河北 | 88 | 77 | +--------+----------+--------+--------+---------+------------+------+------+ 5 rows in set (0.02 sec) -- 視圖可以使得降低SQL語句的複雜度 mysql> create view view2 -> as -> select stuno,stusex,writtenexam,labexam from stuinfo natural join stumarks; Query OK, 0 rows affected (0.01 sec)
1.4.4 修改視圖
語法
alter view 視圖名 as select 語句
例題:
mysql> alter view view2 -> as -> select stuname from stuinfo; Query OK, 0 rows affected (0.00 sec)
1.4.5 刪除視圖
語法
drop view [if exists ] 視圖1,視圖,...
例題
mysql> drop view view2; Query OK, 0 rows affected (0.00 sec)
1.4.6 查看視圖資訊
-- 方法一; mysql> show tables; -- 顯示所有的表和視圖 -- 方法二:精確查找視圖(視圖資訊存儲在information_schema下的views表中) mysql> select table_name from information_schema.views; +------------+ | table_name | +------------+ | view1 | +------------+ 1 row in set (0.05 sec) -- 方法三:通過表的comment屬性查詢視圖 mysql> show table statusG; -- 查詢所有表和視圖的詳細狀態資訊 mysql> show table status where comment='view'G -- 只查找視圖資訊
查詢視圖的結構
mysql> desc view1;
查詢創建視圖的語法
mysql> show create view view1G
1.4.7 視圖演算法
場景:找出語文成績最高的男生和女生
方法一:
mysql> select * from (select * from stu order by ch desc) t group by stusex; +--------+----------+--------+--------+---------+------------+------+------+ | stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | +--------+----------+--------+--------+---------+------------+------+------+ | s25321 | Tabm | 女 | 23 | 9 | 河北 | 88 | 77 | | s25318 | 爭青小子 | 男 | 26 | 6 | 天津 | 86 | 92 | +--------+----------+--------+--------+---------+------------+------+------+ 2 rows in set (0.00 sec)
方法二:
mysql> create view view3 -> as -> select * from stu order by ch desc; Query OK, 0 rows affected (0.00 sec) mysql> select * from view3 group by stusex; +--------+---------+--------+--------+---------+------------+------+------+ | stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | +--------+---------+--------+--------+---------+------------+------+------+ | s25301 | 張秋麗 | 男 | 18 | 1 | 北京 | 80 | NULL | | s25303 | 李斯文 | 女 | 22 | 2 | 北京 | 55 | 82 | +--------+---------+--------+--------+---------+------------+------+------+ 2 rows in set (0.00 sec)
結論:方法一和方法二的結果不一樣,這是因為視圖的演算法造成的。
視圖的演算法有:
1、merge:合併演算法(將視圖語句和外層語句合併後再執行)
2、temptable:臨時表演算法(將視圖作為一個臨時表來執行)
3、undefined:未定義演算法(用哪種演算法有MySQL決定,這是默認演算法,視圖一般會選merge演算法)
重新通過視圖實現
-- 創建視圖,指定演算法為臨時表演算法 mysql> create or replace algorithm=temptable view view3 -> as -> select * from stu order by ch desc; Query OK, 0 rows affected (0.00 sec) mysql> select * from view3 group by stusex; +--------+----------+--------+--------+---------+------------+------+------+ | stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | +--------+----------+--------+--------+---------+------------+------+------+ | s25321 | Tabm | 女 | 23 | 9 | 河北 | 88 | 77 | | s25318 | 爭青小子 | 男 | 26 | 6 | 天津 | 86 | 92 | +--------+----------+--------+--------+---------+------------+------+------+ 2 rows in set (0.00 sec)
結論:和子查詢結果一致。