視點集中sql
簡化操做數據庫
定製數據安全
合併分割數據app
安全性spa
視圖是存儲在數據庫中的查詢的sql 語句,它主要出於兩種緣由:code
安全緣由,視圖能夠隱藏一些數據,如社會保險基金錶,能夠用視圖只顯示姓名,地址,而不顯示社會保險號和工資數等,htm
可以使複雜的查詢易於理解和使用。get
CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
[注]:視圖老是顯示最近的數據。每當用戶查詢視圖時,數據庫引擎經過使用 SQL 語句來重建數據。qt
CREATE OR REPLACE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
DROP VIEW view_name
product 表it
create table product ( product_id int not null, name varchar(50) not null, price double not null ); insert into product values(1, 'apple ', 5.5);
purchase 表
create table purchase ( id int not null, product_id int not null, qty int not null default 0, gen_time datetime not null ); insert into purchase values(1, 1, 10, now());
create view purchase_detail as select product.name as name, product.price as price, purchase.qty as qty, product.price * purchase.qty as total_value from product, purchase where product.product_id = purchase.product_id;
select * from purchase_detail;
注意事項
運行建立視圖的語句須要用戶具備建立視圖(crate view)的權限,若加了[or replace]時,還須要用戶具備刪除視圖(drop view)的權限;
select語句不能包含from子句中的子查詢;
select語句不能引用系統或用戶變量;
select語句不能引用預處理語句參數;
在存儲子程序內,定義不能引用子程序參數或局部變量;
在定義中引用的表或視圖必須存在。可是,建立了MySQL視圖後,可以捨棄定義引用的表或視圖。要想檢查視圖定義是否存在這類問題,可以使用check table語句;
在定義中不能引用temporary表,不能建立temporary視圖;
在視圖定義中命名的表必須已存在;
不能將觸發程序與視圖關聯在一塊兒;
在視圖定義中容許使用order by,可是,若是從特定視圖進行了選擇,而該視圖使用了具備本身order by的語句,它將被忽略。
使用 alter view
alter view purchase_detail as select product.name as name, product.price as price, product.price * purchase.qty as total_value from product, purchase where product.product_id = purchase.product_id;