1. 程式人生 > 其它 >資料庫實驗四 使用檢視

資料庫實驗四 使用檢視

技術標籤:課程學習記錄

實驗四 使用檢視

一、實驗目的

熟悉SQL語言有關檢視的操作,能夠熟練使用SQL語句來建立需要的檢視,定義資料庫外模式,並能使用所建立的檢視實現資料管理。

二、實驗內容和要求

1.建立檢視
2.查詢檢視
3.檢視更新
要求:針對給定的資料庫模式,以及相應的應用需求,建立檢視並驗證with check option選項的有效性。理解和掌握檢視消解的執行原理,掌握可更新檢視和不可更新檢視的區別。

三、實驗過程

1.準備實驗資料
建立資料庫s_t和spj,建立學生表student、課程表course、選修表sc、供應商表s、零件表p、工程專案表j、供應情況表spj,向表中新增適量資料。

2.練習教材第3章【例3.84】——【例3.97】(這一部分內容不用寫入實驗報告)
3.在spj資料庫中,完成教材第3章習題9
首先建立檢視:

CREATE VIEW gy_spj
AS
SELECT sno,pno,qty
FROM spj;

(1)

SELECT pno,qty
FROM gy_spj;

(2)

SELECT *
FROM gy_spj
WHERE sno='s1';

4.在s_t資料庫中,完成以下操作
(1)建立一個學生“張立”選修課程的檢視“v_zhangli”,要求包含課程號、課程名、學分和成績。

CREATE VIEW v_zhangli
AS
SELECT
course.Cno,Cname,Ccredit,Grade FROM course,sc WHERE course.Cno=sc.Cno AND Sno IN (SELECT Sno FROM student WHERE Sname='張立');

(2) 建立一個學生選課統計檢視“v_student”,要求包含學號、選課數量、平均成績。
錯誤: 一開始想著一步建立檢視v_student,但是調了很久都沒有建立成功,能明顯的看出來所建立的檢視是錯誤的。
CREATE VIEW v_student
As
SELECT Sno,count(*),AVG(Grade)
FROM sc,course

GROUP BY Sno;
正確: 後來想著或許可以分佈建立,在一個檢視的基礎上建立v_student檢視,首先建立一個檢視hh,然後在此基礎上建立檢視v_student

CREATE VIEW hh
AS
SELECT course.Cno,Sno,Grade
FROM course,sc
WHERE course.Cno=sc.Cno;
CREATE VIEW v_student
As
SELECT Sno,COUNT(*),AVG(Grade)
FROM hh
GROUP BY Sno;

在做實驗六一個相似的建表問題時,發現自己把這道題想複雜了,直接建立是可以的

CREATE VIEW v_student
As
SELECT Sno,count(*),AVG(Grade)
FROM sc
GROUP BY Sno;

(3)建立一個帶有with check option選項的檢視v_os1,要求包含選修了“作業系統”課程的學生的學號、課程號和成績。

CREATE view v_os1
AS
SELECT sno, cno, grade
FROM sc
WHERE cno = (SELECT cno
             FROM course
             WHERE cname=’作業系統’)
WITH CHECK OPTION;

通過該檢視進行插入、刪除、修改操作驗證with check option選項是否起作用:
插入一個選課記錄(‘201215122’,‘4’,82),觀察操作是否成功。

insert into v_os1
values('201215122','4',82);

插入成功
插入一個選課記錄(‘201215122’,‘1’,80),觀察操作是否成功。
插入失敗,原因課程號為1的課程名不是作業系統。
將學生’201215122’的’4’號課程的成績增加5分,觀察操作能否成功。

UPDATE v_osl
SET Grade=Grade+5
WHERE Sno='201215122';

操作成功
將學生’201215122’選修’4’號課程的選課記錄更改為’3’號課,觀察操作能否成功。

UPDATE v_osl
SET Cno=4
WHERE Sno='201215122';

操作失敗
刪除學生’201215122’的選課記錄,觀察操作能否成功。

UPDATE v_osl
SET Cno=4
WHERE Sno='201215122';

操作成功
(4)建立一個不帶with check option選項的行列子集檢視v_os2,要求包含選修了“作業系統”課程的學生的學號、課程號和成績。

CREATE view v_os1
AS
SELECT sno, cno, grade
FROM sc
WHERE cno = (SELECT cno
             FROM course
             WHERE cname=’作業系統’)

通過該檢視進行插入、刪除、修改操作驗證檢視是否可更新:
插入一個選課記錄(‘201215117’,‘4’,92),觀察操作是否成功。
在mysql中操作失敗
插入一個選課記錄(‘201215117’,‘5’,88),觀察操作是否成功。
在mysql中操作失敗
將學生’201215117’的’4’號課程的成績增加5分,觀察操作能否成功。

UPDATE v_os2
SET Grade=Grade+5
WHERE Sno='201215117';

成功
將學生’201215117’的’5’號課程的成績增加5分,觀察操作能否成功。

UPDATE v_os2
SET Grade=Grade+5
WHERE Sno='201215117' AND Cno='6';

操作能執行
刪除學生’201215117’的選課記錄,觀察操作能否成功。
成功
(5)不可更新檢視
檢視“v_student”是否可更新,通過SQL更新語句加以驗證,並說明原因。

UPDATE v_student
SET Sno=Sno+1;

執行失敗,“v_student”不可更新
(6)刪除檢視
首先基於檢視(2)中的檢視建立新檢視“v_zhangli_avg”,要求新檢視包含張立的學號、選課數量、平均成績。

CREATE VIEW v_zhangli_avg
AS
SELECT *
FROM v_student
WHERE Sno IN(SELECT Sno
             FROM student
             WHERE Sname='張立');

然後,刪除(2)中的檢視,並觀察檢視“v_zhangli_avg”是否存在。
Mysql中刪除(2)中的檢視後,檢視“v_zhangli_avg”存在

四、實驗總結(遇到的問題及解決方法)

在練習教材第3章【例3.84】——【例3.97】時發現的一些在mqsql中操作與課本上結果不同的地方
例3.91中在mysql中直接執行DROP VIEW IS_S1;可以執行,但執行後再開啟IS_S2錯誤。級聯刪除DROP VIEW IS_S1 CASCADE;在mysql中cascade無作用!
例3.96 INSERT
INTO is_student
VALUES(‘201215129’,‘趙新’,20);
課本上顯示會但在Mysql不會自動將系名’IS’放入Values子句中
在建立要求的檢視時,如果一步建不出來,或者不好建立時,可以採用分步的方法,先建立一個檢視完成要求的一部分做個過渡。