MySQL基礎系列之 檢視詳解
1.檢視的概念
檢視是虛表,是從一個或幾個基本表(或檢視)中匯出的表,在系統的資料字典中僅存放了檢視的定義,不存放檢視對應的資料,是一條SELECT語句執行後返回的結果集。
2.檢視的特性
檢視看上去非常像資料庫的物理表,對它的操作同任何其它的表一樣。當通過檢視修改資料時,實際上是在改變基表中的資料;相反地,基表資料的改變也會自動反映在由基表產生的檢視中。由於邏輯上的原因,有些檢視可以修改對應的基表,而有些則不能(僅僅能查詢)。
3.檢視的作用
方便操作,特別是查詢操作,減少複雜的SQL語句,增強可讀性;
更加安全,資料庫授權命令不能限定到特定行和特定列,但是通過合理建立檢視,可以把許可權限定到行列級別。
4.使用場景
(1)多個地方用到同樣的查詢結果
(2)查詢結果使用的SQL語句比較複雜
(3)關鍵資訊來源於多個複雜關聯表,可建立檢視提取需要資訊,簡化操作
5.建立檢視及查詢資料操作
首先建立一些測試表和資料
#1.建立使用者表 drop table if exists tb_user; create table tb_user( id int not null auto_increment, username varchar(32), relaname varchar(32), primary key(id) ); #2.建立角色表 drop table if exists tb_role; create table tb_role( id int not null auto_increment, rolename varchar(32), primary key(id) ); #3.建立使用者角色管理表 drop table if exists tb_user_role; create table tb_user_role( id int not null auto_increment, userid int, roleid int, primary key(id) ); #4.插入資料 insert into tb_user(id,username,relaname) values (1,'小君','君奉天'),(2,'小墨','墨傾池'); insert into tb_role(id,rolename) values (1,'管理員'),(2,'普通使用者'); insert into tb_user_role(id,userid,roleid) values (1,1,1),(2,2,2);
從上文的測試資料,如果我們要查詢某個使用者的角色名稱,那麼我們需要連表查詢,這裡建立的測試資料不算複雜,實際開發中比這複雜多了,這裡理解應用檢視的思想。查詢語句如下:
select a.username,b.rolename
from tb_user a
left join tb_user_role c on c.userid = a.id
left join tb_role b on c.roleid = b.id
where a.username = '小墨'
我們可以建立檢視來簡化上面的操作,建立檢視的標準語法:
CREATE [REPLACE] [ALGORITHM [檢視演算法]] VIEW view_name [column_list] AS SELECT_statement [WITH [許可權範圍] ]
ALGORITHM檢視演算法:
(1)undefined 自動選擇演算法
(2)merge 將使用的檢視語句與檢視定義合併起來,
使得檢視定義的某一部分取代語句對應的部分
(3)temptable 將檢視的結果存入臨時表
WITH[許可權範圍]:許可權範圍有
(1)cascaded 預設值表示更新檢視時要滿足所有的相關檢視和表條件
(2)local 表示更新檢視時滿足該檢視本身定義的條件即可
建立我們需要的檢視,如下:
drop view if exists view_user_role;
create view view_user_role as(
select a.id,a.username,b.rolename
from tb_user a
left join tb_user_role c on c.userid = a.id
left join tb_role b on c.roleid = b.id
);
建立好檢視之後,我們需要查詢某個使用者的角色名稱的時候直接用以下SQL語句在檢視上查詢小墨的角色名稱,同樣可以得到所需結果:
select username,rolename from view_user_role;
6.增刪改資料操作
我們可以嘗試在檢視view_user_role上做增刪改資料操作
update view_user_role set username='小墨2',rolename='普通用2' where id = 2;
遺憾的是操作失敗,提示錯誤資訊如上圖所示,因為不能在一張由多張關聯表連線而成的檢視上做同時修改兩張表的操作。可操作的情況是檢視與表是一對一關係情況:如果沒有其它約束(在基本表必填等),是可以進行增刪改資料操作。
drop view if exists view_user;
create view view_user as(
select a.id,a.username
from tb_user a
);
進行增刪改操作如下,操作成功(注意user表中的其它欄位要允許為空,否則操作失敗):
插入
insert into view_user(id,username) values(3,'小天');
查詢基礎表驗證
select * from tb_user;
繼續我們進行更新和刪除操作
更新
update view_user set username='小天2' where id = 3;
刪除
delete from view_user where id = 3;
可自行驗證(哈哈)。