1. 程式人生 > 其它 >從0到1學資料庫:其他資料庫物件

從0到1學資料庫:其他資料庫物件

技術標籤:0-1資料庫

點選上方“羅曉勝”,馬上關注,您的支援對我幫助很大

上期文章

/ 前言 /

其實除了表和資料,資料庫還有一些其他物件,比方說檢視、索引,這也是資料庫中很重要的組成部分。

/ 正文 /

要點

• 檢視
• 序列
• 索引
• 同義詞

檢視

• 檢視的概念 – 檢視是虛表。是一個命名的查詢,用於改變基表資料的顯 示,簡化查詢。檢視的訪問方式與表的訪問方式相同。

– 檢視的好處:• 可以限制對基表資料的訪問,只允許使用者通過檢視看到 表中的一部分資料 • 可以使複雜的查詢變的簡單 • 提供了資料的獨立性,使用者並不知道資料來自於何處 • 提供了對相同資料的不同顯示

• 簡單檢視和複雜檢視 * – 簡單檢視:只涉及到一個表,而且SELECT子句中不包含函表示式列(包括單行函式和分組函式)。* – 複雜檢視:涉及到一個或多個表,SELECT子句中包含函式 表示式列(單行函式或分組函式)。* 最主要的區別在:通過檢視實現DML操作上,簡單檢視可以,複雜檢視不一定

建立檢視

• 建立檢視 CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(alias[, alias]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY [CONSTRAINT constraint]];

– 在子查詢中可以加入複雜的SELECT. – 子查詢中能使用ORDER BY子句,如果想排序,可以在執行查詢 檢視時使用。

• 建立檢視 – OR REPLACE:如果所建立的檢視已經存在,會自動重建該檢視 – FORCE:不管基表是否存在,都會建立該檢視 – NOFORCE:只有基表都存在,才會建立該檢視 – view:檢視的名稱 – alias:為檢視所產生的列定義別名,別名的數量必須和檢視所產生列的 數量相等 – subquery:一條完整的SELECT語句,在該語句中同樣可以定義別名 – WITH CHECK OPTION:通過檢視做DML操作時,必須要保證所插入 或修改或刪除的資料行必須滿足檢視所定義的約束,也就是說插入或更新後的結果必須仍然可以通過該檢視查詢得到 。

– constraint:CHECK OPTION中的約束名 – WITH READ ONLY:確保在該檢視上不能進行任何DML操作,預設可 以通過檢視執行DML操作。

• 建立檢視示例 – 查詢id為1的使用者檢視

CREATE OR REPLACE VIEW student_view AS SELECT id id_view, name name_view,age*10 age_view
FROM student
WHERE id = 1;
DESC id;

SELECT * FROM student_view;

檢視執行DML操作

– 建立檢視v_student1,是個簡單檢視。CREATE OR REPLACE VIEW v_student1 AS SELECT id,age FROM student;

– 通過檢視進行DML操作。UPDATE v_student1 SET age=age+100;

• 不能通過檢視刪除記錄的條件 – 檢視中包含分組函式 – 檢視中含有GROUP BY子句 – 檢視中含有DISTINCT關鍵字

• 不能通過檢視修改記錄的條件 – 檢視中包含分組函式 – 檢視中含有GROUP BY子句 – 檢視中含有DISTINCT關鍵字 – 檢視中要修改的列包含表示式

• 不能通過檢視新增記錄的條件 – 檢視中包含分組函式 – 檢視中含有GROUP BY子句 – 檢視中含有DISTINCT關鍵字 – 檢視中要修改的列包含表示式 – 檢視中沒有表的NOT NULL列。

檢視的管理

• WITH CHECK OPTION – WITH CHECK OPTION實質是給檢視加一個“CHECK”約束,該CHECK約束的條件就是檢視中的子查詢的WHERE 條件,以後如果想通過該檢視執行DML操作,不允許違反 該CHECK約束。

例 WITH CHECK OPTION例子

CREATE OR REPLACE VIEW v_emp3 AS SELECT id,age FROM student WHERE id=1 WITH CHECK OPTION CONSTRAINT v_emp3_ck;

– 該約束的條件為檢視中WHERE條件,即 “id=1”,如檢視v_emp3想執行DML操作,不 id(只能是1), 如果違反了,執行出錯,會出現錯誤提示。

• WITH READ ONLY – WITH READ ONLY的檢視是隻讀的,不允許通過該檢視執行DML語句。

例 WITH READ ONLY例子,建立一個檢視v_emp4

CREATE OR REPLACE VIEW v_emp4 AS SELECT id,age FROM student WITH READ ONLY;

– 通過該檢視進行更新操作 UPDATE v_emp4 SET salary=salary+100;

• 刪除檢視 – 刪除檢視的語法 DROP VIEW view;

內聯檢視

• 內聯檢視

– 內聯檢視(Inline View),是一個在SQL語句內可以使用的 子查詢的別名。是一個命名的SQL語句,但不是真正的數 據庫的檢視物件。最常見的內聯檢視的例子就是主查詢中 的FROM子句中,包含的是一個命名的子查詢。

– 例 內聯檢視的例子

SELECT a.name,b.name FROM student a, (SELECT id,name FROM t_class) b WHERE a.c_class=b.id;

分頁

分頁(limit-N) – limit-N分頁查詢主要是實現查詢表中最大或最小的N條記錄功能。

– Top-N分析語法:SELECT [列名] FROM 表名 limit n

索引

• 索引是: – 方案(schema)中的一個數據庫物件 – 在 資料庫中用來加速對錶的查詢速度 – 通過使用快速路徑訪問方法快速定位資料,減少了磁碟的I/O – 與表獨立存放,但需要依附於表,是在表的基礎上建立的 – 由 資料庫自動維護

建立索引

• 建立索引有兩種方式:自動或者手動 • 自動: 當在表上定義一個PRIMARY KEY 或者UNIQUE 約束條 件時,資料庫自動建立一個對應的唯一索引. • 手動: 使用者可以建立索引以加速查詢,在需要建立索引的欄位 上建立需要的索引。

• 在一列或者多列上建立索引. CREATE INDEX indexname ON table (column[, column]...);

• 例:下面的索引將會提高對student表基於 name 字 段的查詢速度.

CREATE INDEX emp_last_name_idx ON student(name);

注:可通過執行計劃檢視索引命中及查詢所用時長

索引分析

• 適合建立索引情況 – 查詢列的資料範圍很廣泛 – 查詢列中包含大量的NULL值 – WHERE條件中的列或者多表連線的列適合建立索引 – 欲查詢的表資料量很大,而且大多數的查詢得到結果集的 數量佔總記錄量的2%~4%

• 不適合建立索引的情況 – 很小資料量的表 – 在查詢中不常用來作為查詢條件的列 – 查詢最終得到的結果集很大 – 頻繁更新的表(索引對於DML操作是有部分負面影響的) – 索引列作為表示式的一部分被使用時(比如常查詢的條件 是age*12,此時在SALARY列上建立索引是沒有效果 的)

刪除索引

• 刪除索引的語法 DROP INDEX index;

• 刪除索引後,索引中的資料及定義被刪除,索引所佔的資料空 間被釋放,但表中的資料仍然存在。

/ 總結 /

本文主要講了資料庫中檢視、索引等物件,索引是資料庫中非常重要的部分,對加快查詢速度有著至關重要的影響,面試中也會經常問到索引調優等問題。

往期推薦:

如何入門做軟體開發

為什麼我不推薦入行程式設計師

做全棧開發很難嗎

關注我的公眾號,學習技術或投稿

圖片

長按上圖,識別圖中二維碼即可關注