MySQL學習筆記之視圖
視圖是對磁盤上保存的表數據的抽象,即抽取一個表或多個表的部分行或列的數據,展示給使用者。
首先列舉下MySQL中最簡單的對視圖操作的語法:
1、創建視圖:
create view 視圖名 as
select語句
例如:
create view v_fruit as
select name,place,weight from t_fruit
where weight<=12;
據我所知,“as”後面的語句肯定都是以“select”開頭的,可以理解成視圖的創建結果就是一張新的表格,表格裡面有哪些東西呢,就是select語句的結果;另外這張新的“表格”的字段與“select”後面的名字對應,在上例中就是name,place,weight,但是也可以用as或省略as的別名形式,改變新“表格”的字段名,例如:
create view v_fruit as
select name myname,place as myplace,weight from t_fruit
where weight<=12;
這樣,“新表格”的包含的所有字段名就是myname,myplace,weight
另外,指定視圖的字段名可以不用在select後面加as的方法,直接在“視圖名”後面加上“(字段1,字段2,...)”的方法,但是括號裡面的個數必須跟實際select出來的字段個數一樣
例如以下實現一樣的字段名設定效果:
create view v_fruit(myname,myplace,weight) as
select name,place,weight from t_fruit
where weight<=12
with check option;
上面的視圖是在一張表的基礎上創建的,也可以根據多張表連接查詢,或者根據其他的視圖創建,即"from"後面可以跟表名,也可以跟視圖名,但是千萬不能跟子查詢!
例如下面的寫法是錯的:
create view v as
select id,name,place from (select * from t_fruit)
where id>3;
當然,“where”後面跟上子查詢是沒有問題的。
2、使用視圖:
視圖一旦創建,操作起來就跟表格一樣,愛怎麼玩就怎麼玩,至少你往編輯器裡面輸語句,肯定不會報錯。
實際執行階段就不一樣了,對於select from的查詢操作,肯定不會出任何問題;但是對於增、刪、改,因為視圖實際存儲的只是定義,這三個操作會改動底下的實際的表格,而你看到的view,裡面的數據可能來源於好幾個表格,也有可能是通過和、平均數等計算得到的,一旦insert、delete或者update,改動就會特別復雜。為了保險起見,對於一些情況,增刪改直接會被MySQL系統判定為誤操作,無法成功。這裡修改失敗的情況特別多,只列舉幾個,比如改動涉及到兩個或兩個以上的表會失敗,改動後not null的列沒有值會失敗,view的列值通過sum、count等計算得到的會失敗。
還有一個問題要注意,如果底下的table的字段發生變動,比如說字段被刪除、重命名等,視圖操作就很容易出現錯誤。因為視圖在定義時,select後面的字段名就定死了,不會隨著表格字段的變動而變動,即使是select *,也會把*直接替換為相應的固定字段。比如一個view裡面本來關聯了A,B,C三個字段,現在table把字段C重命名為D,那麼view對C字段的使用就會出錯。
3、修改視圖:
有兩種方法,一種是常規的alter,另一種可以跟創建視圖的共用
①alter方法,只需把創建時的create改成alter就行,比如:
alter view v_fruit as
select place as myplace,weight from t_fruit
where weight<=12;
②第1點創建視圖裡面漏了沒說,實際上存在創建和修改視圖可以共用的方法:create or replace,只要把create換成這3個單詞,其他不要變
create or replace view v_fruit as
select place as myplace,weight from t_fruit
where weight<=12;
4、刪除視圖:
drop view 視圖名;
或者
drop view 視圖1,視圖2,...
如果某個視圖不存在,則會報錯,但是其他存在的視圖會被正常刪除。
為了防止報錯,可以加上“if exists”關鍵字
drop view if exists 視圖名;
5、查看視圖各字段的定義:
describe 視圖名;
或者
desc 視圖名;