一、視圖介紹 視圖(View):是一種虛擬存在的表,視圖中的數據並不在資料庫中實際存在,行和列數據來自,定義視圖時查詢使用的表,並且是在使用視圖時動態生成的。通俗的講,視圖只保存了查詢的SQL邏輯,不保存查詢的結果。 二、創建視圖 2.1 語法 create [or replace] view 視圖 ...
一、視圖介紹
視圖(View):是一種虛擬存在的表,視圖中的數據並不在資料庫中實際存在,行和列數據來自,定義視圖時查詢使用的表,並且是在使用視圖時動態生成的。通俗的講,視圖只保存了查詢的SQL邏輯,不保存查詢的結果。
二、創建視圖
2.1 語法
create [or replace] view 視圖名稱 [(列明列表)] as select語句 [with [cascaded | local] check option]
2.2 示例
create or replace view emp_view1 as select id,name,age from emp where id < 10;
說明1:create or replace view 創建或者替換一個視圖
說明2:emp_view1 視圖名
說明3:as 關鍵字,as後面是視圖的數據來源語句
說明4:select id,name,age from emp where id <10;是將id小於10的,emp表中的數據的id,name,age欄位的數據作為視圖的源數據。
三、查詢視圖
3.1 查看創建視圖語句
show create view 視圖名稱;
示例
mysql> show create view emp_view1; +-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | View | Create View | character_set_client | collation_connection | +-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | emp_view1 | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `emp_view1` AS select `emp`.`id` AS `id`,`emp`.`name` AS `name`,`emp`.`age` AS `age` from `emp` where (`emp`.`id` < 10) | utf8mb4 | utf8mb4_0900_ai_ci | +-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ 1 row in set (0.00 sec)
3.2 查看視圖數據
select * from 視圖名稱 ...;
說明1:...是查詢條件,視圖是一張虛擬的表,完全可以使用表的語法
mysql> select * from emp_view1; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | 張三 | 43 | | 2 | 李四 | 38 | | 3 | 問問 | 22 | | 4 | 芳芳 | 24 | | 5 | 珊珊 | 22 | | 6 | 娜娜 | 25 | | 7 | 咔咔 | 25 | | 8 | 靜靜 | 27 | +----+--------+------+ 8 rows in set (0.00 sec)
說明2:完全可以將視圖當做一張表來使用
四、修改視圖
4.1 方式一
create [or replace] view 視圖名稱[(列名列表)] as select語句 [with [cascaded | local] check option]
mysql> create or replace view emp_view1 as select id,name,age, job from emp where id < 10; Query OK, 0 rows affected (0.00 sec) mysql> select * from emp_view1; +----+--------+------+--------------+ | id | name | age | job | +----+--------+------+--------------+ | 1 | 張三 | 43 | 董事長 | | 2 | 李四 | 38 | 項目經理 | | 3 | 問問 | 22 | 開發 | | 4 | 芳芳 | 24 | 開發 | | 5 | 珊珊 | 22 | 開發 | | 6 | 娜娜 | 25 | 財務 | | 7 | 咔咔 | 25 | 出納 | | 8 | 靜靜 | 27 | 人事 | +----+--------+------+--------------+ 8 rows in set (0.00 sec)
說明1:原來的 emp_view1 裡面沒有 job 欄位,現在通過 or replace 的操作,新增加了 job 欄位,達到了修改的效果
4.2 方式二
alter view 視圖名稱[(列名列表)] as select語句 [with [cascaded | local] check option]
mysql> alter view emp_view1 as select id, name, job from emp where id <10; Query OK, 0 rows affected (0.01 sec) mysql> select * from emp_view1; +----+--------+--------------+ | id | name | job | +----+--------+--------------+ | 1 | 張三 | 董事長 | | 2 | 李四 | 項目經理 | | 3 | 問問 | 開發 | | 4 | 芳芳 | 開發 | | 5 | 珊珊 | 開發 | | 6 | 娜娜 | 財務 | | 7 | 咔咔 | 出納 | | 8 | 靜靜 | 人事 | +----+--------+--------------+ 8 rows in set (0.00 sec)
說明1:通過上面的修改,將age欄位的數據,刪除了。
五、刪除視圖
5.1 語法
drop view [if exists] 視圖名稱 [,視圖名稱] ...
mysql> drop view emp_view1; Query OK, 0 rows affected (0.00 sec)
六、檢查選項
視圖是一張虛擬的表,除了創建和查詢之後還可以往裡面添加數據,重新創建視圖 emp_view1
mysql> create or replace view emp_view1 as select id,name,age from emp where id < 10; Query OK, 0 rows affected (0.01 sec) mysql> select * from emp_view1; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | 張三 | 43 | | 2 | 李四 | 38 | | 3 | 問問 | 22 | | 4 | 芳芳 | 24 | | 5 | 珊珊 | 22 | | 6 | 娜娜 | 25 | | 7 | 咔咔 | 25 | | 8 | 靜靜 | 27 | +----+--------+------+ 8 rows in set (0.00 sec)
案例1:往視圖中insert 插入數據
mysql> insert into emp_view1 values(9, "九號",30); Query OK, 1 row affected (0.00 sec) mysql> select * from emp; +----+--------+------+--------------+--------+------------+-----------+---------+ | id | name | age | job | salary | entrydate | managerid | dept_id | +----+--------+------+--------------+--------+------------+-----------+---------+ | 1 | 張三 | 43 | 董事長 | 48000 | 2017-07-20 | NULL | 5 | | 2 | 李四 | 38 | 項目經理 | 23900 | 2016-08-20 | 1 | 1 | | 3 | 問問 | 22 | 開發 | 18000 | 2022-07-20 | 2 | 1 | | 4 | 芳芳 | 24 | 開發 | 21000 | 2019-08-18 | 2 | 1 | | 5 | 珊珊 | 22 | 開發 | 15000 | 2021-04-10 | 3 | 1 | | 6 | 娜娜 | 25 | 財務 | 24000 | 2023-07-16 | 1 | 3 | | 7 | 咔咔 | 25 | 出納 | 8000 | 2021-07-10 | 6 | 3 | | 8 | 靜靜 | 27 | 人事 | 5000 | 2021-07-11 | 1 | NULL | | 9 | 九號 | 30 | NULL | NULL | NULL | NULL | NULL | +----+--------+------+--------------+--------+------------+-----------+---------+ 9 rows in set (0.00 sec) mysql> select * from emp_view1; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | 張三 | 43 | | 2 | 李四 | 38 | | 3 | 問問 | 22 | | 4 | 芳芳 | 24 | | 5 | 珊珊 | 22 | | 6 | 娜娜 | 25 | | 7 | 咔咔 | 25 | | 8 | 靜靜 | 27 | | 9 | 九號 | 30 | +----+--------+------+ 9 rows in set (0.00 sec)
說明1:插入id = 9 的數據,因為視圖本身不存儲數據,所以通過視圖添加的數據會被添加到原始數據表中。
案例2:再次通過視圖添加一個id=15的數據,驗證是否成功
mysql> insert into emp_view1 values(15, "十五 號",15); Query OK, 1 row affected (0.00 sec) mysql> select * from emp; +----+-----------+------+--------------+--------+------------+-----------+---------+ | id | name | age | job | salary | entrydate | managerid | dept_id | +----+-----------+------+--------------+--------+------------+-----------+---------+ | 1 | 張三 | 43 | 董事長 | 48000 | 2017-07-20 | NULL | 5 | | 2 | 李四 | 38 | 項目經理 | 23900 | 2016-08-20 | 1 | 1 | | 3 | 問問 | 22 | 開發 | 18000 | 2022-07-20 | 2 | 1 | | 4 | 芳芳 | 24 | 開發 | 21000 | 2019-08-18 | 2 | 1 | | 5 | 珊珊 | 22 | 開發 | 15000 | 2021-04-10 | 3 | 1 | | 6 | 娜娜 | 25 | 財務 | 24000 | 2023-07-16 | 1 | 3 | | 7 | 咔咔 | 25 | 出納 | 8000 | 2021-07-10 | 6 | 3 | | 8 | 靜靜 | 27 | 人事 | 5000 | 2021-07-11 | 1 | NULL | | 9 | 九號 | 30 | NULL | NULL | NULL | NULL | NULL | | 15 | 十五號 | 315 | NULL | NULL | NULL | NULL | NULL | +----+-----------+------+--------------+--------+------------+-----------+---------+ 10 rows in set (0.00 sec) mysql> select * from emp_view1; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | 張三 | 43 | | 2 | 李四 | 38 | | 3 | 問問 | 22 | | 4 | 芳芳 | 24 | | 5 | 珊珊 | 22 | | 6 | 娜娜 | 25 | | 7 | 咔咔 | 25 | | 8 | 靜靜 | 27 | | 9 | 九號 | 30 | +----+--------+------+ 9 rows in set (0.00 sec)
說明1:十五號數據添加成功,在emp的原始數據表中添加成功
說明2:但是emp_view1中未查詢到15號數據,說明數據未在視圖中
說明3:因為創建視圖的時候有限制id<10,所以id=15的數據能在原始表中添加成功,但是並未添加是視圖中
說明4:其中這種視圖操作和視圖創建的條件已經相違背了,這個時候我們就可以使用視圖的檢查選項來規避這種項目
七、cascaded級聯檢查
當使用 with check option 子句創建視圖時,Mysql會通過視圖檢查正在更改的每一行,例如:插入,更新,刪除,以及使其符合視圖的