天天看點

資料庫索引-視圖-觸發器-存儲過程

我們應該從這四點中學到什麼。(個人總結)

關于索引

在資料庫裡面建立索引是為了加快資料的查詢速度,但是索引在資料庫中會占用一小部分存儲空間來存儲索引資訊,是以,利用索引提高查詢效率是以占用空間和增加資料更改的時間為代價的。

索引分為兩大類:聚集索引和非聚集索引。兩者的差別:1.資料不按非聚集索引關鍵字的順序排序和存儲。2.非聚集索引的葉節點不是存放資料的資料頁。

對于索引,要知道,建立非聚集索引:

CREATE INDEX Sname_ind ON Student ( Sname )

建立唯一聚集索引:

CREATE UNIQUE CLUSTERED INDEX Sname_ind ON Student ( Sname )

建立聚集索引:

CREATE CLUSTERED INDEX Ename_ind ON Employee( FirstName, LastName )

删除索引:

DROP INDEX <表明>.<索引名>

視圖

視圖就像一個視窗,透過它就可以看到資料庫中用使用者自己感興趣的資料。

視圖有兩個好處,第一是視圖裡面的資料始終與基本表裡面的資料保持一緻,第二是節省了存儲空間,當資料量非常大時,重複資料的存儲是非常耗費時間的。

我們要學到什麼。

學會建立視圖。

CREATE VIEW <視圖名>

AS

SELECT語句

舉例:

建立查詢資訊管理系學生的學号,姓名,性别和年齡的視圖X。

CREATE VIEW IS_Student

AS

SELECT Sno, Sname, Ssex, Sage

FROM Student WHERE Sdept = ‘資訊管理系’

在視圖下定義視圖。

利用上面的視圖X,建立查詢資訊管理系年齡小于20的學生的學号、姓名和年齡的視圖。

CREATE VIEW IS_Student_Sage

AS

SELECT Sno, Sname, Sage

FROM IS_Student WHERE Sage < 20

定義一個查詢每個學生的學号及平均成績的視圖Y。

CREATE VIEW S_G

AS

SELECT Sno, AVG(Grade) AverageGrade FROM SC

GROUP BY Sno**

通過視圖查詢資料

上面已經說到,視圖像一個視窗,其實那就像是多個表精煉之後的一張表。通過視圖查詢資料,文法用SELECT 視圖 即可。

例子:利用上面的視圖X,查詢資訊管理系男生的資訊。

SELECT * FROM 視圖X WHERE Ssex = ‘男’

再來一個多表聯合查詢吧。

查詢資訊管理系學生的學号、姓名、所選課程的課程名。

思路:視圖X裡面沒有課程資訊,是以要和SC表和Course表相聯合。

SELECT x.Sno, Sname,Cname

FROM 視圖X x JOIN SC ON x.Sno = SC.Sno

JOIN Course c ON c.Cno = SC.Cno

修改和删除視圖

  • 修改示例:ALTER關鍵字

修改上面視圖Y使其統計每個學生的考試平均成績和選修課程的總門數。

ALTER VIEW S_G (Sno, AverageGrade, Count_Cno)

AS

SELECT Sno, AVG(Grade), Count(*) FROM SC

GROUP BY Sno

  • 删除示例:DROP關鍵字

删除IS_Student視圖。

DROP VIEW IS_Student

視圖的作用:

1.簡化了資料查詢語句。

2.使使用者從多角度看待同一資料。

3.提高了資料的安全性。

4.提供了一定程度上程式的邏輯獨立性。

觸發器

觸發器(TRIGGER)

意義:是一段由對資料的更改操作引發的自動執行的代碼。這些更改操作包括UPDATE、INSERT、DELETE。

文法:

CREATE TRIGGER 觸發器名

ON 表名或視圖名

FOR或AFTER或INSTEAD OF

AS

SQL語句

根據上述文法第三行關鍵字的不同可以将觸發器可分為後觸發性觸發器(FOR或AFTER)和前觸發性觸發器(INSTEAD OF)。

後觸發性觸發器示例:限制每個學生總的選課門數不能超過10門。

思路:當條件達到10門以上之後,執行復原操作。

CREATE Trigger tri_Total_AFT

ON SC AFTER INSERT

AS

IF (SELECT COUNT(*)FROM SC WHERE Sno IN (SELECT Sno FROM INSTERTED))>10

ROLLBACk

前觸發性觸發器示例:限制每個學生總的選課門數不能超過10門。

思路:當條件達到10門以上之後,執行重做操作(代碼最後一句便是重做操作)。

CREATE Trigger tri_Total_INS

ON SC INSTED OF INSERT

AS

IF (SELECT COUNT(*)FROM SC WHERE Sno IN (SELECT Sno FROM INSTERTED))>10

INSERT INTO SC SELECT * FROM INSERTED

删除觸發器

不用想肯定用DROP關鍵字。

DROP TRIGGER 觸發器名

存儲過程

持續更新。。。