1 create view語句介紹
create view
語句是將某個查詢數據的定義保留下來,以便隨時調用,這就是所謂的視圖。視圖本身不存儲查詢結果,只是一個定義。
Syntax:
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
or replace
關鍵詞表示當創建的視圖已經存在時,執行替換命令;
select_statement
子句則是創建視圖的select
語句,可以是從表中查詢數據,也可以從其他視圖中查詢數據;
2 create view語句注意事項
當視圖被創建之后,則其定義就已經固定不會再改變,比如一個視圖是由select *
創建的,則后續對表增加的字段不會成為視圖的一部分,而后續對表刪除字段則會導致查詢視圖失敗;
創建的視圖默認情況下是屬於當前數據庫的,當要創建到另外的數據庫是則要在視圖名前面加上數據庫名:
CREATE VIEW test.v AS SELECT * FROM test2.t;
order by
子句在創建視圖過程中是允許的,但當后續的查詢視圖的語句中有自己 的order by
子句時則會被忽略掉;
視圖在滿足特定條件時是可以執行insert/update/delete
語句的,條件就是視圖中的每一行和視圖對應的表中的每行數據都能一一對應起來。
mysql> insert into v_students_male values(3,'ddd',0);
Query OK, 1 row affected (0.00 sec)
mysql> update v_students_male set sname='eee' where sid=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> delete from v_students_male where sid=3;
Query OK, 1 row affected (0.01 sec)
3 create view語句的應用
CREATE VIEW v_today (today) AS SELECT CURRENT_DATE; ##指定字段名
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql> create view v_students_male as select sid,sname from students where sex=0;
Query OK, 0 rows affected (0.00 sec)
Select * from v_students_male
+------+-------+
| sid | sname |
+------+-------+
| 1 | aaa |
mysql> create view v_students_female as select sid,sname from students where sex=1;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from v_students_female where sid>1;
+------+-------+
| sid | sname |
+------+-------+
| 2 | ccc |
mysql> create view v_students_male as select sid,sname,sex from students where sex=0; ##創建相同名稱的視圖會事變
ERROR 1050 (42S01): Table 'v_students_male' already exists
mysql> create or replace view v_students_male as select sid,sname,sex from students where sex=0; ##添加or replace參數后,原視圖被替換
Query OK, 0 rows affected (0.00 sec)
mysql> select * from v_students_male;
+------+-------+------+
| sid | sname | sex |
+------+-------+------+
| 1 | aaa | 0 |
mysql> create view v_test as select * from students;
mysql> alter table students add test int; ##表增加一個字段
mysql> select * from v_test; ##查詢視圖依然是之前的三個字段結果
+------+-------+------+
| sid | sname | sex |
+------+-------+------+
| 1 | aaa | 0 |
| 2 | ccc | 1 |
mysql> alter table students drop column sex; ##表刪除原來的一個字段
mysql> select * from v_test; ##查詢視圖失敗
ERROR 1356 (HY000): View 'test.v_test' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them