MySQL入門很簡單-檢視
阿新 • • 發佈:2019-01-23
1、檢視是從一個或多個表中匯出的表,是虛擬的表。通過檢視可以看到系統專門提供的資料,作用是方便使用者對資料的操作。
檢視可以從存在的檢視的基礎上定義。資料庫只存放檢視的定義,不存放檢視中的資料,資料存放在原來的表。使用檢視查詢資料時,資料庫系統從原來的表中取出對應的資料。
如果經常需要從多個表查詢指定欄位的資料,可以在表上建立檢視,通過這個檢視顯示資料。如果表中修改了與檢視相關的欄位的名稱,可以修改檢視。
MySQL檢視不支援輸入引數的功能。
2、檢視的作用:
使操作簡單化,達到所見即所需的目的。檢視可以簡化對資料的操作。
增加資料的安全性,通過檢視,使用者只能查詢和修改指定的資料。資料庫授權命令可以限制使用者的操作許可權,但不能限制到特定行和列上,使用檢視則可以將使用者的許可權限制到特定的行和列上,以保證敏感資訊不被沒有許可權的人看到。
提高表的邏輯獨立性,可以遮蔽原有表結構變化帶來的影響。原有表增加列和刪除未被引用的列,對檢視不造成影響;如果修改了表中的列,可修改檢視來解決這些列帶來的影響。
3、建立檢視
create [algorithm={undefined | merge | temptable}]
view 檢視名 [(屬性清單)]
as select 語句 [with [cascaded | local ] check option];
algorithm是可選引數,表示檢視的選擇演算法。undefined選項表示mysql將自動選擇使用的演算法;merge選項表示將使用檢視的語句和檢視的定義合併起來,使檢視定義的某一部分取代語句的對應部分;temptable選項表示將檢視的結果存入臨時表,使用臨時表執行語句。
檢視名是要建立的檢視的名稱,屬性清單是可選引數,指定了檢視中各個屬性的名詞,預設與select語句中查詢的屬性相同。
select語句引數是一個完整的查詢語句,表示從某個表中查出滿足條件的記錄,將這些記錄匯入檢視中。
with check option是可選引數,表示更新檢視時要保證在該檢視的許可權範圍內。
cascaded是可選引數,表示更新檢視時要滿足所有相關檢視和表的條件,該引數是預設值;Local表示更新檢視時,要滿足該檢視本身的定義的條件即可。
使用create view語句建立檢視時,最好加上with check option並且加上cascaded引數,以便於在檢視上派生出新檢視後,更新檢視需要考慮其父檢視的約束條件。
建立檢視時需要有相應的許可權,MySQL的user表儲存了許可權資訊,查詢語句為: select Select_priv,Create_view_priv from mysql.user where user ='使用者名稱'
select Select_priv,Create_view_priv from mysql.user where user ='root'; //
4、在單表上建立檢視
create view department_view1 as select * from department; //檢視是虛擬表,可以使用desc查詢表結構
create view department_view2(name, function, location) as select d_name, function, address from department;
create algorithm=merge view worker_view1(name,department,sex,age,address) as select name, department.d_name, sex, 2009-birthday, address from worker, department where worker.d_id=department.d_id with local
check option; //建立多表檢視
5、檢視檢視
檢視資料庫中已存在的檢視的定義。檢視檢視必須要有show view許可權,也在user表中。方法包括describe語句,show table status語句,show create view語句 和查詢information_schema資料庫下的views表等。
describe worker_view1; //或者是 desc worker_view1; describe語句用於檢視檢視中各個欄位的簡單資訊
show table status like 'worker_view1'; //該語句顯示檢視的基本資訊,但各屬性值顯示的是NULL,comment屬性顯示值是view;很少使用
show create view worker_view1\G //可以檢視檢視的詳細資訊,包括各個屬性, with check option條件和字元編碼(character_set_client)等資訊
select * from information_schema.views; //所有的檢視都是儲存在information_schema資料庫下的views表中
6、修改檢視
修改檢視是指修改資料庫中已存在的表的定義,當基本表的某些欄位發生改變時,可以通過修改檢視來保持檢視和基本表之間一致。
create or replace [algorithm={undefined | merge | temptable}]
view 檢視名 [(屬性清單)]
as select 語句 [with [cascaded | local ] check option]; //存在檢視時對檢視進行修改,不存在則建立檢視
create or replace algorithm=temptable view department_view1(department, function, location) as select d_name, function, address from department;
alter [algorithm={undefined | merge | temptable}]
view 檢視名 [(屬性清單)]
as select 語句 [with [cascaded | local ] check option];
alter view department_view2(department, name, sex, location) as select d_name, worker.name, worker.sex, address from department, worker where department.d_id=worker.d_id with check option;
7、更新檢視
是指通過檢視來插入、更新和刪除表中的資料。通過檢視更新時,都是轉換到基本表來更新。更新檢視時,只能更新許可權範圍內的資料。
create view depertment_view3(name, function, address) as select d_name, function, address from department where d_id = 1001;
update department_view3 set name ='科研部', function='新產品研發', address='3號樓5層';
不是所有的檢視都可以更新:
create view worker_view4(name, sex, total) as selct name, sex, count(name) from worker; //包含SUM,COUNT,MAX,MIN等函式
create view worker_view5(name, sex, address) as selct name, sex, address from worker group by d_id; //包含UNION, UNION ALL, DISTINCT, GROUP BY和HAVING等關鍵字
create view worker_view6 as select 'Aric' as name; //常量檢視也不能更新
create view worker_view7(name) as select (select name from worker); //檢視中的SELECT包含子查詢
create view worker_view8 as select * from worker_view7; //由不可更新的檢視匯出的檢視
create algorithm=temptable view worker_view9 as select * from worker; // 建立檢視時,ALGORITHM為TEMPTABLE型別的檢視也不能更新,系統預設臨時表不能更新
檢視對應的表上存在沒有預設值的列,且該列沒有包含在視圖裡,則檢視不能更新。在更新檢視時,沒有預設值的記錄將沒有值插入也不插入NULL,系統不允許
with [cascaded | local] check option也能決定檢視能否更新,更新檢視時需要滿足檢視或表定義的條件。
8、刪除檢視
刪除資料庫中已存在的檢視,刪除檢視必須具有drop許可權,不刪除資料。
drop view [if exists] 檢視名列表 [restrict | cascade]; //if exists判斷檢視是否存在,存在則執行
select Drop_priv from mysql.user where user = '使用者名稱';
9、MySQL中檢視和表的區別和聯絡
區別:檢視是按照SQL語句生成的虛擬表,不佔用物理空間;表中的記錄需要佔用物理空間。建立和刪除檢視隻影響檢視本身,不影響實際的記錄。建立和刪除表會影響實際的記錄。
聯絡:檢視是基本表上建立的表,欄位和記錄都來自基本表,依賴基本表存在。一個檢視可以對應一個基本表也可以對應多個表。檢視是基本表的抽象,在邏輯意義上建立新關係。