1. 引入
- 視圖是一張虛擬表,它表示一張表的部分或多張表的綜合的結構。
- 視圖僅僅是表結構,沒有表數據。視圖的結構和數據建立在表的基礎上。
2. 視圖
2.1 創建視圖
語法:
create [or replace] view 視圖的名稱
as
select 語句
例題:
mysql> create view vw_stu
-> as
-> select stuname,stusex,writtenexam,labexam from stuinfo inner join stumarks using(stuno);
Query OK, 0 rows affected (0.01 sec)
多學一招:因為視圖是一個表結構,所以創建視圖后,會在數據庫文件夾中多一個與視圖名同名的.frm文件
2.2 使用視圖
視圖是一張虛擬表,視圖的用法和表的用法是一樣的。
mysql> select * from vw_stu;
+--------------+--------+-------------+---------+
| stuname | stusex | writtenexam | labexam |
+--------------+--------+-------------+---------+
| 李斯文 | 女 | 80 | 58 |
| 李文才 | 男 | 50 | 90 |
| 歐陽俊雄 | 男 | 65 | 50 |
| 張秋麗 | 男 | 77 | 82 |
| 爭青小子 | 男 | 56 | 48 |
+--------------+--------+-------------+---------+
2.3 查看視圖的結構
語法:
desc 視圖名
例題:
mysql> desc vw_stu;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| stuname | varchar(10) | NO | | NULL | |
| stusex | char(2) | NO | | NULL | |
| writtenexam | int(11) | YES | | NULL | |
| labexam | int(11) | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+
2.4 查看創建視圖的語法
語法:
show create view 視圖名
例題:
mysql> show create view vw_stu\G;
*************************** 1. row ***************************
View: vw_stu
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `vw_stu` AS select `stuinfo`.`stuName` AS `stuname`,`stuinfo`.`stuSex` AS `stusex`,`stumarks`.`writtenExam` AS `writtenexam`,`stumarks`.`labExam` AS `labexam` from (`stuinfo` join `stumarks` on((`stuinfo`.`stuNo` = `stumarks`.`stuNo`)))
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)
2.5 顯示所有視圖
#方法一:
mysql> show tables;
+------------------+
| Tables_in_itcast |
+------------------+
| stu |
| stuinfo |
| stumarks |
| t1 |
| t2 |
| vw_stu |
# 方法二
mysql> select table_name from information_schema.views;
+------------+
| table_name |
+------------+
| vw_stu |
+------------+
1 row in set (0.05 sec)
+------------------+
#方法三
mysql> show table status where comment='view' \G
*************************** 1. row ***************************
Name: vw_stu
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.00 sec)
2.6 更改視圖
語法:
alter view 視圖名
as
select 語句
例題:
mysql> alter view vw_stu
-> as
-> select * from stuinfo;
Query OK, 0 rows affected (0.00 sec)
2.7 刪除視圖
語法:
drop view [if exists] 視圖1,視圖2,…
例題:
mysql> drop view vw_stu;
Query OK, 0 rows affected (0.00 sec)
2.8 視圖的作用
- 篩選數據,放置未經許可訪問敏感數據
- 隱藏表結構
- 降低SQL語句的復雜度
2.9 視圖的算法
場景:找出語文成績最高的男生和女生
我們可以將子查詢封裝到視圖中:
mysql> create view vw_stu
-> as
-> select * from stu order by ch desc;
Query OK, 0 rows affected (0.00 sec)
可以將上面的子查詢更改成視圖,但是結果不對:
mysql> select * from vw_stu group by stusex;
+--------+---------+--------+--------+---------+------------+------+------+
| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |
+--------+---------+--------+--------+---------+------------+------+------+
| s25301 | 張秋麗 | 男 | 18 | 1 | 北京 | 80 | NULL |
| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | 55 | 82 |
+--------+---------+--------+--------+---------+------------+------+------+
原因:這是因為視圖的算法造成的
- merge:合并算法,將視圖的語句和外層的語句合并后在執行。
- temptable:臨時表算法,將視圖生成一個臨時表,再執行外層語句
- undefined:未定義,MySQL到底用merge還是用temptable由MySQL決定,這是一個默認的算法,一般視圖都會選擇merge算法,因為merge效率高。
解決:在創建視圖的時候指定視圖的算法
create algorithm=temptable view 視圖名
as
select 語句
指定算法創建視圖
mysql> create algorithm=temptable view vw_stu
-> as
-> select * from stu order by ch desc;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from vw_stu group by stusex; # 結果是一致的
+--------+----------+--------+--------+---------+------------+------+------+
| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |
+--------+----------+--------+--------+---------+------------+------+------+
| s25321 | Tabm | 女 | 23 | 9 | 河北 | 88 | 77 |
| s25318 | 爭青小子 | 男 | 26 | 6 | 天津 | 86 | 92 |
+--------+----------+--------+--------+---------+------------+------+------+