MySQL數據庫視圖view

1. 引入

  1. 視圖是一張虛擬表,它表示一張表的部分或多張表的綜合的結構。
  2. 視圖僅僅是表結構,沒有表數據。視圖的結構和數據建立在表的基礎上。

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 視圖的作用

  1. 篩選數據,放置未經許可訪問敏感數據
  2. 隱藏表結構
  3. 降低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 |
+--------+---------+--------+--------+---------+------------+------+------+

原因:這是因為視圖的算法造成的

  1. merge:合并算法,將視圖的語句和外層的語句合并后在執行。
  2. temptable:臨時表算法,將視圖生成一個臨時表,再執行外層語句
  3. 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 |
+--------+----------+--------+--------+---------+------------+------+------+
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容