sql——視圖
為什麽使用視圖
當我們在使用多表查詢時, 我們的sql語句可能會非常的復雜,如果每次都編寫一遍sql‘的話無疑是一件麻煩的事情,這時候就可以使用視圖來避免多次編寫sql的問題;
簡答的說可以幫我們節省sql的編寫,
視圖的另一個作用是,可以不同的視圖來展示開放不同數據的訪問
例如,同一張工資表,老板可以查看全部,部門主管可以查看該部門所有人,員工只能看自己的一條記錄。
使用方法
創建視圖
CREATE [OR REPLACE] VIEW view_name [(column_list)] AS select_statement
加上or replace 時如果已經存在相同的視圖則替換原有視圖
column_list 指定那些字段要出現在視圖中
註意:由於視圖是一張虛擬表,視圖中的數據實際來源其他表,所以視圖中的數據不會出現在硬盤上。
使用視圖
視圖是一張虛擬表,所以使用正常的表沒有任何區別
查看視圖
1.desc view_name; 查看數據結構
2.show create view view_name; 查看創建語句
修改視圖
alter view_name as select_statement
刪除視圖
drop view view_name
實例
#準備數據 create database db02 charset utf8; use db02 create table student( s_idint(3), name varchar(20), math float, chinese float ); insert into student values(1,‘tom‘,80,70),(2,‘jack‘,80,80),(3,‘rose‘,60,75); ? create table stu_info( s_id int(3), class varchar(50), addr varchar(100) ); insert into stu_info values(1,‘二班‘,‘安徽‘),(2,‘二班‘,‘湖南‘),(3,‘三班‘,‘黑龍江‘);
創建視圖
#創建視圖包含 編號 學生的姓名 和班級
create view view_stu (學號,姓名,班級) as select student.s_id,student.name,stu_info.class from student join stu_info on student.s_id = stu_info.s_id;
查看創建的視圖
select * from view_stu;
案例2: 隔離數據
準備數據
create table salarys( id int primary key, name char(10), salary double, dept char(10) ); insert into salarys values (1,"劉強東",900000,"市場"), (2,"馬雲",800090,"市場"), (3,"李彥宏",989090,"財務"), (4,"馬化騰",87879999,"財務");
創建市場部專用的工資視圖
create view view_shichang as select * from salarys where dept = "市場";
查看視圖
select * from view_shichang;
同時註意:對視圖數據的insert update delete會同步到原表中,但是由於視圖可能是部分字段,很多時候會失敗。
修改原表中的數據,視圖的數據會隨之該表。這是建議修改數據的方式,不建議直接對視圖中的數據進行修改。
mysql> select * from view_shichang;
+----+--------+--------+------+
| id | name | salary | dept |
+----+--------+--------+------+
| 1 | 劉強東 | 900000 | 市場 |
| 2 | 馬雲 | 800090 | 市場 |
+----+--------+--------+------+
update salarys set salary = 10000 where name = "劉強東";
mysql> select * from view_shichang;
+----+--------+--------+------+
| id | name | salary | dept |
+----+--------+--------+------+
| 1 | 劉強東 | 10000 | 市場 |
| 2 | 馬雲 | 800090 | 市場 |
+----+--------+--------+------+
總結:mysql可以分擔程序中的部分邏輯,但這樣一來後續的維護會變得更麻煩
如果需要改表結構,那意味著視圖也需要相應的修改,沒有直接在程序中修改sql來的方便
sql——視圖