簡介
MySQL視圖是一種虛擬的表,本身不包含任何資料,可以看作是對SQL查詢的封裝,它的資料都是動態執行SQL查詢的結果,
MySQL視圖常見應用主要有以下兩種:
-
重用SQL陳述句,簡化復雜SQL的操作,
-
保護資料,可以給用戶授予表特定部分的訪問權限,而不是整個表的訪問權限,
視圖的使用
創建視圖
語法:CREATE VIEW <視圖名> AS <SELECT陳述句>
CREATE VIEW student_class_view AS SELECT
t.*, c.class_name
FROM
tb_student t
LEFT JOIN tb_class c ON t.class_id = c.class_id;
如上創建了一個名為student_class_view的視圖,它包含一個tb_student表和tb_class表的聯結查詢,現在我們就可以操作表一樣操作student_class_view視圖了:
SELECT * FROM student_class_view;
輸出:
+----+------+-----+-------------+-----------+----------+------------+
| id | name | age | phone | address | class_id | class_name |
+----+------+-----+-------------+-----------+----------+------------+
| 1 | 小明 | 18 | 188xxxx1234 | xxxxxxxxx | 1 | IT2班 |
| 2 | 小米 | 28 | 188xxxx1234 | xxxxxxxxx | 2 | IT3班 |
| 3 | 小看 | 28 | 188xxxx1234 | xxxxxxxxx | 3 | IT1班 |
| 4 | 小阿 | 38 | 188xxxx1234 | xxxxxxxxx | 3 | IT1班 |
+----+------+-----+-------------+-----------+----------+------------+
CREATE VIEW完整語法:
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
查看創建視圖的陳述句
語法:SHOW CREATE VIEW <視圖名>
SHOW CREATE VIEW student_class_view;
輸出:
+--------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View | character_set_client | collation_connection |
+--------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| student_class_view | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `student_class_view` AS select `t`.`id` AS `id`,`t`.`name` AS `name`,`t`.`age` AS `age`,`t`.`phone` AS `phone`,`t`.`address` AS `address`,`t`.`class_id` AS `class_id`,`c`.`class_name` AS `class_name` from (`tb_student` `t` left join `tb_class` `c` on((`t`.`class_id` = `c`.`class_id`))) | utf8 | utf8_general_ci |
+--------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
Create View列為該視圖的創建陳述句,
洗掉視圖
語法:DROP VIEW <視圖名>
DROP VIEW student_class_view;
再次查詢該視圖,視圖已被洗掉:
[SQL]SELECT * FROM student_class_view;
[Err] 1146 - Table 'resource.student_class_view' doesn't exist
DROP VIEW完整語法:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
修改視圖定義
修改視圖定義可以使用以下方式:
1.先DROP洗掉視圖,然后重新使用CREATE VIEW創建視圖,
2.使用CREATE OR REPLACE VIEW,如果原視圖不存在,則會創建新的視圖,如果原視圖存在,則會替換原視圖,
CREATE OR REPLACE VIEW student_class_view AS
SELECT
...
3.使用ALTER VIEW,原視圖必須要存在,
ALTER VIEW student_class_view AS
SELECT
...
ALTER VIEW完整語法:
ALTER
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
視圖的更新
更新視圖是指對視圖使用INSERT、UPDATE、DELETE陳述句,對視圖的更新都是直接更新基礎表的資料,
并非所有視圖都能更新,如果MySQL不能確定要更新的基礎資料,則不允許更新,
如果視圖定義中包含以下操作,則不允許更新:
- 分組
- 聯結
- 子查詢
- 并
- 聚集函式
- DISTINCT
- 匯出(計算)列
更新視圖的限制挺多,其實影響不大,因為MySQL視圖主要用于資料查詢,很少會直接更新視圖,
參考:MySQL必知必會
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/271840.html
標籤:其他
上一篇:執行緒池底層原理你真的懂嗎?
