轉載
1.視圖
視圖又叫虛表。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。
視圖主要有以下作用:
1、安全,權限控制。一些數據表有着重要的信息。有些字段是保密的,不能讓用戶直接看到。這時就可以創建一個視圖,在這張視圖中只保留一部分字段。這樣,用戶就可以查詢自己需要的字段,不能查看保密的字段。
2、性能,快。關係數據庫的數據常常會分表存儲,使用外鍵建立這些表的之間關係。這時,數據庫查詢通常會用到連接(JOIN)。這樣做不但麻煩,效率相對也比較低。如果建立一個視圖,將相關的表和字段組合在一起,就可以避免使用JOIN查詢數據。
3、靈活,抽取即將廢棄表,產生有用價值。如果系統中有一張舊的表,這張表由於設計的問題,即將被廢棄。然而,很多應用都是基於這張表,不易修改。這時就可以建立一張視圖,視圖中的數據直接映射到新建的表。這樣,就可以少做很多改動,也達到了升級數據表的目的。
關於視圖的學習,我建議你參考mysql手冊。在網上找一些示例,很快就入門了。
2.分類
視圖在SQL中可以分爲三類
1 普通視圖(Regular View)
sql模板
- CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]
- [ WITH <view_attribute> [ ,...n ] ]
- AS select_statement
- [ WITH CHECK OPTION ] [ ; ]
- <view_attribute> ::=
- {
- [ ENCRYPTION ]
- [ SCHEMABINDING ]
- [ VIEW_METADATA ] }
解釋:
參數還是比較少的,現在解釋一下上面的參數:
ENCRYPTION:視圖是加密的,如果選上這個選項,則無法修改.創建視圖的時候需要將腳本保存,否則再也不能修改了
SCHEMABINDING:和底層引用到的表進行定義綁定。這個選項選上的話,則視圖所引用到的表不能隨便更改構架(比如列的數據類型),如果需要更改底層表構架,則先drop或者alter在底層表之上綁定的視圖.
VIEW_METADATA:這個是個很有意思的選項.正如這個選項的名稱所指示,如果不選擇,返回給客戶端的metadata是View所引用表的metadata,如果選擇了這個選項,則返回View的metadata.再通俗點解釋,VIEW_METADATA可以讓視圖看起來貌似表一樣。View的每一個列的定義等直接告訴客戶端,而不是所引用底層表列的定義。
WITH Check Option:這個選項用於更新數據做限制
限制條件
- 在View中,除非有TOP關鍵字,否則不能用Order By子句
- View在每個Schema中命名必須獨一無二
- View不要嵌套儘量
- Compute,compute by,INTO關鍵字不允許出現在View中
- View不能建立在臨時表上
- View不能對全文索引進行查詢
建立視圖
- CREATE VIEW v_Test
- AS
- SELECT TOP 10 * FROM table1
查詢視圖
SELECT * FROM v_Test
2索引視圖(Indexed View)----會自動同步(好也壞)
索引視圖可以看作是一個和表(Table)等效的對象!,是真實存在於物理數據中。
要求嚴格:(部分)
- 索引視圖涉及的基本表必須ANSI_NULLS設置爲ON
- 索引視圖只能引用基本表
- CREATE VIEW v_Test_Index
- WITH SCHEMABINDING
- AS
- SELECT Name,ID
- FROM CUSTOMER join NAME="PAUL"
- ADN ID>5
- GO
- --在視圖上建立索引
- CREATE UNIQUE CLUSTERED INDEX index
- ON v_Test_Index
底層直接聚集索引掃描----通過hash匹配,索引掃描,性能好
但是mysql沒有
注:對索引的操作類似於CML可以使用ALTER,UPDATE,DELETE
附錄:
mysql索引
1、什麼是索引
索引是一個單獨的、存儲在磁盤上的數據庫結構,它們包含着對數據庫表裏所有記錄的引用指針。
2、索引的好處
適當使用索引能提升數據庫查詢速度!
3、實例:
在創建表的時候創建索引
- CREATE TABLE 表名 [ 列名稱 數據類型 ]
- [ UNIQUE | FULLTEXT ] [ INDEX | KEY ] [ 索引名稱 ] ( 列名稱 [ length ] ) [ ASC | DESC ]
(1)、普通索引(index): 普通索引是MySQL的基本索引類型,允許在定義索引的列中插入重複值和空值
- CREATE TABLE book
- (
- bookid INT NOT NULL,
- bookname VARCHAR(100) NOT NULL,
- authors VARCHAR(100) NOT NULL,
- info VARCHAR(500) NULL,
- year_publication YEAR NOT NULL,
- INDEX(year_publication)
- );
(2)、唯一索引(unique):唯一索引列的值必須唯一,但允許有空值。主鍵索引是一種特殊的唯一索引,不允許有空值。
例:
- CREATE TABLE book
- (
- id INT NOT NULL,
- name CHAR(50) NOT NULL,
- UNIQUE INDEX UniqueIdx(id)
- );
(3)、聯合索引:組合索引即是在多個列上創建索引。查詢時,只有在查詢條件中使用了這些字段(創建組合索引的時候指定的哪些列)的最左邊字段時,索引纔會被使用。
- CREATE TABLE student
- (
- id INT NOT NULL,
- name CHAR(50) NOT NULL,
- age INT NOT NULL,
- info VARCHAR(200),
-
- INDEX MultiIdx(id,name,age)
- );
(4)、全文索引:MySQL只有MyISAM存儲引擎支持FULLTEXT索引,並且類類型爲CHAR、TEXT、VARCHAR。 並且需要指定表的存儲引擎爲MyISAM。
例:
- CREATE TABLE t4
- (
- id INT NOT NULL,
- name CHAR(50) NOT NULL,
- age INT NOT NULL,
- info VARCHAR(200),
- FULLTEXT INDEX FullindexName(info)
- ) ENGINE = MyISAM ;
在已經存在的表上創建索引:
語法:
- ALTER TABLE table_name ADD [ UNIQUE | FULLTEXT ] [ INDEX | KEY ]
- [ inex_name ] (col_name [ length ] ,...) [ASC | DESC ]
- (1)、普通索引:ALTER TABLE book ADD INDEX indexName( bookname(30) );
- (2)、唯一索引:ALTER TABLE book ADD UNIQUE INDEX UniqueIdx( bookid );
- (3)、組合索引:ALTER TABLE book ADD INDEX BkAndInfoIdx( authors(20), info(50) );
- (4)、全文索引:ALTER TABLE t6 ADD FULLTEXT INDEX infiIdx(info);(前提是這個表的存儲引擎爲 MyISAM)
使用 create index 創建索引:
語法:
- CREATE [ UNIQUE | FULLTEXT ] [ INDEX | KEY ] INDEX index_name
- ON table_name ( col_name[ length ] , ... ) [ASC | DESC ]
- 例:在表book的bookname字段上建立名爲BkNameIdx的索引。
- CREATE INDEX BkNameIdx ON book (bookname);
- 例: 在book表的bookId字段上建立唯一索引。
- CREATE UNIQUE INDEX UniqueIdx ON book (bookId);