一.mysql視圖的創建
作用:提高了重用性,就像一個函數。如果要頻繁獲取user的name和goods的name。就應該使用以下sql語言。示例:
先創建3張表
1.1user表
1.2goods表
1.3ug表,比如某某人有哪些食物
1.4創建視圖 目的:查詢某人有某食物
create view 視圖名稱 as 普通的查詢語句;
create view other as select a.name as username, b.name as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id;
利用navicat創建視圖
右鍵新建視圖:
SELECT
PK_SR_MAIN AS pk_id,
wthdbj AS wthdbj,
HDTHYY AS hdthyy,
MDJLX AS mdjlx,
FK_HDGL_ID AS fk_hdgl_id,
'sr_main' AS tname,
SYS_XZQH AS sys_xzqh,
SYS_BMID AS sys_bmid,
'0' AS type,
msyhd AS msyhd,
mgshd AS mgshd,
gs_hdthyy AS gs_hdthyy,
fk_gs_hdgl_id AS fk_gs_hdgl_id
FROM
sr_main a,sr_dbbz b
WHERE substr(a.sys_xzqh,1,6) = b.sjid and mdjlx = b.sdjlx and replace(a.MJTHKXZ,'0','') = b.syj7 and a.SYS_SPZT = 99 and mdjlx in ('db_jz','kn_jz','wb_jz') AND a.SYS_SCBJ = 0 and b.sys_scbj = 0 AND b.bz_str1 = '1'
UNION ALL
SELECT
PK_SR_MAIN AS pk_id,
wthdbj AS wthdbj,
HDTHYY AS hdthyy,
MDJLX AS mdjlx,
FK_HDGL_ID AS fk_hdgl_id,
'sr_main' AS tname,
SYS_XZQH AS sys_xzqh,
SYS_BMID AS sys_bmid,
'0' AS type,
msyhd AS msyhd,
mgshd AS mgshd,
gs_hdthyy AS gs_hdthyy,
fk_gs_hdgl_id AS fk_gs_hdgl_id
FROM
sr_main
WHERE SYS_SPZT = 99 and mdjlx in ('ls_jz','yl_jz') AND SYS_SCBJ = 0
UNION ALL
SELECT
PK_SR_MAIN AS pk_id,
wthdbj AS wthdbj,
HDTHYY AS hdthyy,
MDJLX AS mdjlx,
FK_HDGL_ID AS fk_hdgl_id,
'sr_main_bg' AS tname,
SYS_XZQH AS sys_xzqh,
SYS_BMID AS sys_bmid,
'1' AS type,
msyhd AS msyhd,
mgshd AS mgshd,
gs_hdthyy AS gs_hdthyy,
fk_gs_hdgl_id AS fk_gs_hdgl_id
FROM
sr_main_bg a,sr_dbbz b
WHERE substr(a.sys_xzqh,1,6) = b.sjid and replace(mdjlx,'_bg','_jz') = b.sdjlx and replace(a.MJTHKXZ,'0','') = b.syj7 and a.SYS_SPZT = 99 and mdjlx in ('db_bg','kn_bg','wb_bg') AND a.SYS_SCBJ = 0 and b.sys_scbj = 0 AND b.bz_str1 = '1'
然后保存,輸入視圖名稱 如:tcc_view_demo
1.5查詢視圖
select * from other;
二:
對數據庫重構,卻不影響程序的運行。假如因為某種需求,需要將user拆房表usera和表userb,該兩張表的結構如下:
測試表:usera有id,name,age字段
測試表:userb有id,name,sex字段
這時如果php端使用sql語句:select * from user;那就會提示該表不存在,這時該如何解決呢。解決方案:創建視圖。以下sql語句創建視圖:
create view user as select a.name,a.age,b.sex from usera as a, userb as b where a.name=b.name;
以上假設name都是唯一的。此時php端使用sql語句:select * from user;就不會報錯什么的。這就實現了更改數據庫結構,不更改腳本程序的功能了。
三:
提高了安全性能,權限設置。可以對不同的用戶,設定不同的視圖。例如:某用戶只能獲取user表的name和age數據,不能獲取sex數據。則可以這樣創建視圖。示例如下:
create view other as select a.name, a.age from user as a;
這樣的話,使用sql語句:select * from other; 最多就只能獲取name和age的數據,其他的數據就獲取不了了。
四:
讓數據更加清晰。想要什么樣的數據,就創建什么樣的視圖。經過以上三條作用的解析,這條作用應該很容易理解了吧
五.查詢mysql有多少視圖
show table status where comment ='view';
六.如何刪除視圖
drop view視圖名稱;
七.對視圖的dml操作
7.1增刪改(dml):只能是單表操作
INSERT INTO other (username , goodsname) VALUES ("張三" , "蘋果");
報錯:> 1393 - Can not modify more than one base table through a join view 'test.other'
原因:無法通過聯接視圖“test.other”修改多個基表
八.視圖的實質
虛擬表