mysql 视图sql_SQL的视图
1、什么是視圖
視圖是虛擬的表,是一個(gè)存儲(chǔ)的查詢,雖然不需要實(shí)際的物理存儲(chǔ),但是也被看作是一個(gè)數(shù)據(jù)庫對(duì)象;它與包含數(shù)據(jù)的表不一樣,它不包含任何列或數(shù)據(jù),它只是包含使用時(shí)動(dòng)態(tài)檢索數(shù)據(jù)的查詢,并且只包含一個(gè)SELECT語句(不限制子查詢)。視圖實(shí)際上是由預(yù)定義查詢形式的表所組成的。
視圖與表之間的主要區(qū)別在于:表占據(jù)物理空間,包含實(shí)際的餓數(shù)據(jù);而視圖不需要物理空間,不包含數(shù)據(jù),它只是從表里引用數(shù)據(jù)。
視圖只保存在內(nèi)存里,而且只需要保存其定義本身(查詢語句),也就是說視圖所需的空間只是定義語句所需要的。
2、視圖的用途
(1)簡化數(shù)據(jù)訪問,簡化復(fù)雜的SQL,對(duì)數(shù)據(jù)庫里的數(shù)據(jù)進(jìn)行歸一化處理,達(dá)到重用SQL語句;
(2)對(duì)數(shù)據(jù)進(jìn)行保護(hù),起到安全的作用,例如只讓用戶訪問部分字段信息;
(3)維護(hù)摘要數(shù)據(jù);
(4)更改數(shù)據(jù)格式和表示,視圖僅僅是用來查看存儲(chǔ)在別處數(shù)據(jù)的一種設(shè)施。
3、視圖的使用
在數(shù)據(jù)庫里,視圖的使用方式與表是一樣的;當(dāng)創(chuàng)建一個(gè)視圖時(shí),實(shí)際上是在數(shù)據(jù)庫里執(zhí)行了一個(gè)SELECT語句。
(1)表創(chuàng)建視圖
CREATE VIEW view_name AS
SELECT *
FROMtable_name[WHERE exp1]
[WITH CHECK OPTION]
[GROUP BY]
WITH CHECK OPTION選項(xiàng)的目的是確保全部的UPDATE和INSERT語句滿足視圖定義里的WHERE條件子句,這樣保證了引用的完整性。WITH CHECK OPTION有兩個(gè)選項(xiàng),CASCADED和LOCAL,其中CASCADED是默認(rèn)選項(xiàng)。這兩個(gè)屬性都會(huì)檢查視圖的完整性約束和新視圖的定義條件,但是LOCAL不檢查底層的表,而CASCADED會(huì)檢查。所以,現(xiàn)對(duì)于來說CASCADED更安全些。
(2)視圖創(chuàng)建視圖
CREATE view2 AS
SELECT * FROM view1;
如果從基表和從另一個(gè)視圖創(chuàng)建視圖具有一樣的難度和效率,那么首選從基表創(chuàng)建視圖。
(3)視圖創(chuàng)建表
CREATE TABLE table_name AS
SELECTcol1,col2FROM view_name;
(4)刪除視圖
DROP VIEW view_name;
(5)更改視圖
雖然ANSI SQL不包含ALTER VIEW語句,但是某些實(shí)現(xiàn)也會(huì)支持它,例如:MySQL\SQL Server\Oracle,在MySQL的舊版本中還可以通過REPLACE VIEW來修改視圖。
(6)使用視圖
通過視圖來檢索數(shù)據(jù)的時(shí)候,若是該條檢索語句存在WHERE子句,并且視圖定義中也存在WHERE子句,那么前一個(gè)WHERE子句會(huì)被添加到視圖查詢中已有的WHERE子句中,以便正確過濾數(shù)據(jù)。也即是說,一個(gè)WHERE子句在視圖定義中,另外一個(gè)WHERE子句在傳遞給視圖的中,那么這兩組WHERE子句會(huì)自動(dòng)合并,并且會(huì)放置在視圖定義中。
(7)嵌套視圖對(duì)性能的影響
因?yàn)樗阉饕嫘枰治雒恳粚拥囊晥D,所以若視圖嵌套的層數(shù)越多,那么搜索引擎需要進(jìn)行更多的分析工作,這樣導(dǎo)致性能降低,故最好控制視圖的嵌套層數(shù)。實(shí)際上,大多數(shù)搜索引擎無法 確保獲得一個(gè)完美的執(zhí)行計(jì)劃,而只能保證執(zhí)行一個(gè)耗時(shí)最短的計(jì)劃。
4、視圖的規(guī)則
(1)視圖名必須唯一,并在只能創(chuàng)建不存在的視圖,視圖數(shù)目沒有限制;
(2)視圖可以嵌套,但是要注意性能問題;
(3)視圖不能有索引,也不能有關(guān)聯(lián)的觸發(fā)器或默認(rèn)值;
(4)有些DBMS禁止在視圖中使用ORDER BY子句;
(5)有些DBMS把視圖作為只讀的查詢,禁止將數(shù)據(jù)寫會(huì)底層表;
(6)有些DBMS要求返回的列進(jìn)行命名,若是計(jì)算字段的話,那么必須要使用別名;
(7)有些DBMS可以創(chuàng)建這樣的視圖,即不能進(jìn)行導(dǎo)致行不再屬于視圖的插入或更新;
(8)視圖權(quán)限:
創(chuàng)建視圖必須要有足夠的權(quán)限;
視圖由創(chuàng)建者或規(guī)劃所有者所擁有,視圖所有者自動(dòng)擁有視圖的全部權(quán)限,并且可以把視圖的權(quán)限授予其他用戶;
總結(jié)
以上是生活随笔為你收集整理的mysql 视图sql_SQL的视图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 目录所属组设置,Linux系
- 下一篇: java线程删除文件,线程“main”j