視圖是什麼?遊標是什麼?

答:
視圖是一種虛擬表,虛擬表具備和物理表相同的功能,能夠對虛擬表進行增該查操做;
視圖一般是一個或多個表的行或列的子集;
視圖的結果更容易理解(修改視圖對基表不影響),獲取數據更容易(相比多表查詢更方便),限制數據檢索(好比須要隱藏某些行或列),維護更方便。
遊標對查詢出來的結果集做爲一個單元來有效的處理,遊標能夠定位在結果集的特定行、從結果集的當前位置檢索一行或多行、能夠對結果集中當前位置進行修改、數據庫

視圖的基礎知識安全

視圖是從一個或多個表中查詢數據的另一種方式。利用試圖,用戶能夠集中、簡化、定製數據庫,同時還能夠提供安全保證。若是咱們常常須要從多個表中獲取特定列的數據,並須要將這些數據組織在一塊兒使用,就須要使用到視圖。函數

視圖簡介性能

視圖是一個虛擬表。也就是說,對於用戶來講,視圖在外觀和行爲上都相似於表,但他不須要實際的物理存儲。試圖其實是由預約義查詢形式的表組成的。舉例來講,從表EMPLOYEE裏建立一個視圖,它只包含僱員的姓名和地址,而不是表裏的所有字段。試圖能夠包含表的所有或部分記錄,能夠由一個表或多個表建立。ui

視圖是從一個或多個表中導出的表,其結構和數據是創建在對標的查詢基礎上的。和表同樣,視圖也是包括幾個被定義個數據列和多個數據行,但就本質而言,這些數據列和數據行來源於它所引用的表。因此視圖不是真實存在的基礎表,而是一張虛表。spa

經過視圖看到的數據只是存放在基本表中的數據。對視圖的操做與對錶的操做同樣,咱們能夠對其進行查詢、修改(有必定的限制)和刪除設計

當咱們對視圖中國的數據進行修改時,相應的基本表數據也要發生變化;同時,若是基本表的數據發生變化,那麼這種變化也能夠自動地反應到視圖中。指針

視圖是一種數據庫對象,它是從一個或多個表或視圖中導出的虛表,即它能夠從一個或多個表中的一個或多個列中提取器數據,並按照表的組成行和列來顯示這些信息。code

視圖在數據庫中存儲的是視圖的定義,而不是查詢的數據。經過這個視圖的定義,對視圖的查詢最後轉化對基本表的查詢。對象

視圖的數據並非實際地以視圖結構存儲在數據中的,而是在試圖所引用的表中。試圖被定義後,便存儲在數據庫中,經過試圖看到的數據只是存放在數據庫表中的數據,其結構和數據都是創建在對錶的查詢的基礎上的。

視圖的優缺點

視圖有不少優勢,主要體如今簡化操做、定製數據、合併分割數據、安全性等方面。

簡化操做。試圖大大地簡化了用戶對數據的操做。在帝國一視圖時,試圖自己就能夠是一個複雜的結果集。所以,在每一次執行相同的查詢時,沒必要從新寫這些複雜的查詢語句,只要一條簡單的查詢語句便可。

定製數據。試圖可以讓不一樣的用戶,以不一樣的方式看到不一樣或相同的數據集。所以,當許多不一樣水平的用戶共用同一數據庫時,這顯得極爲重要。好比,咱們想讓公司的用戶訪問某些職員記錄,但不想讓這些用戶得到諸如醫療卡號或工資之類的信息,那麼就能夠建立一個視圖,只爲他們提供應該看到的信息。

合併分割數據。在有些狀況下,因爲表中數據量太大,在表的設計時,常將表進行水平分割,但表的結構的變化卻會對應用程序產生不良的影響。使用視圖就能夠從新保持原有的結構關係,從而使外模式保持不變,原有的應用程序仍能夠經過視圖來重載數據。

安全性。試圖能夠做爲一種安全機制。經過視圖,用戶只能查看和修改他們所能看到的數據。其餘數據庫或表及不可見,也不可訪問。若是某一用戶想要訪問視圖的結果集,必須授予其訪問權限。視圖所引用表的訪問權限與視圖權限的設置互不影響。

使用視圖主要有兩個缺點:

性能。因爲視圖是虛擬的表,在使用包括視圖引用的SQL語句時,數據庫除了執行所鍵入的SQL語句中的查詢或更新以外,還要告訴DBMS執行定義視圖的查詢,這就影響了查詢效率。

更新限制。不是全部的視圖都是可更新的。目前,SQL將可更新的視圖限制爲基於單個表的,而且沒有GROUP BY 或者HAVING子句的查詢。除此以外,爲了使視圖時可更新的,試圖不能使用匯集函數,計算的列或SELECT DISTINCE子句。

因爲SQL對更新視圖的限制,用戶不能老是用視圖來代替表。另外,在使用視圖的狀況下,咱們要綜合考慮使用視圖的優點和DBMS每次執行建立視圖的SQL語句引發的性能損失。

注意:

必須是sysadmin、db_owner、db_ddladmin角色的成員,或擁有建立視圖的權限

只能在當前數據庫中建立視圖,在視圖中最多隻能引用1024列。

若是視圖引用的基表或者視圖被刪除,則該視圖將不能再被使用

若是視圖中的某一列是函數、數學表達式、常量或者與來自多個表的列名相同,則必須爲列定義名稱

不能在規則、默認、觸發器的定義中使用視圖。

當經過視圖圖查詢數據時,SQL Server要檢查以確保語句中涉及的全部數據庫對象存在

視圖的名稱必須遵循標識符的規則,是惟一的

視圖的建立和銷燬

CREATE VIEW/DROP VIEW

基本建立語法

視圖的建立主要由CREATE VIEW關鍵字實現,其數據則由SELECT語句定義。視圖建立後,在數據字典中只存放視圖的定義,而其中的SELECT語句並不執行。只有當用戶對視圖進行操做時,才按照視圖的定義將數據從基本表中取出。

建立簡單的視圖

建立與表具備相同信息的視圖

CREATE VIEW StudentInfo_View AS SELECT * FROM StudentInfo
--查看視圖的數據
SELECT * FROM StudentInfo_View

clipboard.png

爲試圖建立視圖
實際上,咱們也能夠把試圖當作是一個表,還能夠爲視圖建立視圖。

CREATE VIEW Boy_View AS SELECT * FROM StudentInfo_View WHERE sex=’男’

查看視圖的數據

SELECT * FROM Boy_View

clipboard.png

因爲視圖是一個虛表,當表被刪除時,由該表建立的視圖,或視圖的視圖都不可用。

爲表中的一列或者幾列信息建立視圖

CREATE VIEW NameAddress_View AS SELECT sname,address FROM StudentInfo
--查看視圖的數據
SELECT * FROM NameAddress_View

clipboard.png

用戶能夠經過建立視圖進行數據查詢。例如,一個表有5列,有成千上萬行,而用戶須要使用表中的兩行數據,這時,咱們能夠爲這兩列建立一個試圖,在視圖中查詢須要的數據,這樣會大大提升查詢效率。

建立與表具備不一樣字段名的視圖

前面實例建立的視圖,並無指明視圖的字段名,系統就默認爲表相同的字段名。實際上,建立視圖時,咱們也能夠爲表中的數據定義新的字段名。

實際應用時,咱們要注意新定義的字段名與表中數據的對應關係

使用視圖簡化表的複雜鏈接

視圖的一個重要用途就是進行復雜的SQL數據處理。經過建立視圖,咱們能夠實現多表之間的複雜鏈接。將頻繁使用的鏈接定義成視圖後,用戶就沒必要每次使用時都要指定複雜的鏈接條件了。

CREATE VIEW Join_View AS SELECT sname,dname,score FROM StudentInfo,Department,RecruitInfo WHERE StudentInfo.address=RecruitInfo.address AND StudentInfo.dno=Department.dno
--查看使徒的數據
SELECT * FROM Join_View

clipboard.png

CREATE VIEW Boys_View AS SELECT * FROM StudentInfo WHERE sex='男'
SELECT * FROM Boys_View

clipboard.png

CREATE VIEW Score_View(sno,sname,sex,address,dno) 
AS 
SELECT StudentInfo.* FROM StudentInfo,RecruitInfo WHERE StudentInfo.address=RecruitInfo.address AND RecruitInfo.score>550

SELECT * FROM Score_View

clipboard.png

CREATE VIEW BoyScore_View
AS 
SELECT * FROM Score_View WHERE sno IN (SELECT sno FROM Boy_View)
SELECT * FROM BoyScore_View

clipboard.png

CREATE VIEW Result_View(sname,dname) AS SELECT BoyScore_View.sname,Department.dname 
FROM BoyScore_View,Department WHERE BoyScore_View.dno=Department.dno

SELECT * FROM Result_View

clipboard.png

因而可知,經過建立視圖層層分解,多表的複雜查詢變得簡潔、清楚

視圖的銷燬

DROP VIEW view_name

強調一點,視圖在物理上是不存在的,它實際上只是一個查詢結果,是一個被存儲的查詢。與建立表CREATE TABLE語句不一樣,CREATE TABLE語句在系統目錄中保存表,而CREATE VIEW語句只保存視圖的定義。因此DROP VIEW語句刪除試圖時,刪除的也只是視圖的定義,對實際表中的數據並無任何影響。

原則

和表同樣,視圖必須有惟一的的名字。不只視圖之間不容許有相同的名字,而且視圖和表也不容許擁有相同的名字。

視圖的建立個數不受限制,用戶能夠建立任意多個視圖。

用戶要建立視圖,必須從數據庫管理員那裏獲得建立權限

試圖能夠嵌套,便可以建立視圖的視圖

一些數據庫管理系統禁止用戶在查詢語句中使用ORDER BY子句。

WITH CHECK OPTION

這是CREATE VIEW語句裏的一個選項,其目的是確保所有的UPDATE和INSERT語句知足視圖定義裏的條件。若是他們不知足條件,UPDATE或INSERT語句就會返回錯誤。WITH CHECK OPTION自己具備兩個選項:CASCADED和LOCAL。其中,CASCADED是默認選項。在基於視圖建立另外一個視圖時,在對基表進行更新時,CASCADED選項會檢查全部底層視圖、全部完整性約束,以及新視圖的定義條件。LOCAL選項只檢查兩個試圖的完整性約束和新視圖的定義條件,不檢查底層的表。WITH CHECK OPTION實際上經過查看視圖定義是否被破壞來確保引用完整性

CREATE VIEW Stu_sname_View AS SELECT * StudentInfo WHERE sname  IS NOT NULL WITH CHECK OPTION

在這個範例中,WITH CHECK OPTION 會確保視圖的sname字段裏不包含NULL值,由於視圖定義所依賴的數據裏不容許在sname字段裏包含NULL。

從視圖建立表

CREATE TABLE TABLE_NAME AS SELECT COLUMN1,COLUMN2 FROM VIEW_TABLE

視圖與ORDER BY子句

CREATE VIEW語句裏不能包含ORDER BY子句,可是GROUP BY子句用於CREATE VIEW語句時,能夠起到相似ORDER BY子句的做用。

CREATE VIEW NAME2 AS SELECT LAST_NAME ....FROM EM_TABLE GROUP BY LAST_NAME

什麼是異名

異名就是表或視圖的另外一個名稱。咱們建立別名一般是爲在訪問其餘用戶的表或視圖時沒必要使用完整限制名。異名能夠建立爲PUBLIC或PARIVATE,PUBLIC的異名能夠被數據庫裏的其餘用戶使用,而PRIVATE異名只能被全部者和擁有權限的用戶使用。

異名由數據庫管理員(或某個指定的人員)或我的用戶管理。通常來講,所有不擁護均可以建立PRIVATE異名,而只有數據庫管理員(DBA)或被受權的用戶能夠建立PUBLIC異名。

建立異名|刪除異名

CREATE PUBLIC|PRIVATE SYSNONYM S_NAME FOR TABLE|VIEW

DROP PUBLIC|PRIVATE SYSNONYM S_NAME

理解SQL遊標

SQL中的一個定義特徵時SQL數據庫中的數據十一級和的方式來進行管理的。實際上SELECT語句的查詢結果就是結果集。它由從一個或多個數據表中提取的一行或多行組成。

應用程序語言通常來講並不可以處理以集合形式返回的數據,這樣在SQL和程序設計語言之間聚會存在阻抗失配。阻抗失配是指SQL和其餘的程序設計語言之間的差異。SQL解決這類阻抗失配的方法就是使用遊標。

遊標充當指針的做用,使應用程序語言一次只能處理查詢結果中的一行。儘管遊標能遍歷查詢結果中的全部行。但它一次只指一行。遊標返回一個完整的結果集,但容許程序設計語言只調用集合中的一行。

相關文章
相關標籤/搜索