數據庫原理及應用.實驗4.視圖和索引的創建和使用


實驗報告

  課程名稱:數據庫原理及應用
  實驗項目名稱:視圖和索引的創建和使用
  實驗時間:2021年5月10日


實 驗 目 的:

  (1)掌握創建視圖的SQL語句的用法。
  (2)掌握修改視圖的方法。
  (3)熟悉視圖更新與基本表更新的區別與聯系;認識視圖的作用。
  (4)熟悉索引的作用,以及不同類型索引的區別。
  (5)掌握SQL語句對索引的創建使用和刪除索引

實 驗 環 境:

  MySQL、SQLyog

實 驗 內 容 及 過 程:

一、創建課本P79頁的學生-課程數據庫,完成以下實驗內容:

  • DROP DATABASE ST
    CREATE DATABASE ST
    USE ST
    CREATE TABLE Student
    	(Sno CHAR(9) PRIMARY KEY,
    	Sname CHAR(20) UNIQUE,
    	Ssex CHAR(2),
    	Sage SMALLINT,
    	Sdept CHAR(20)
    	);
    CREATE TABLE Course
    	(Cno CHAR(4) PRIMARY KEY,
    	Cname CHAR(40) NOT NULL,
    	Cpno CHAR(4),
    	Ccredit SMALLINT
    	#FOREIGN KEY (Cpno) REFERENCES Course(Cno)
    	);
    CREATE TABLE SC
    	(Sno CHAR(9),
    	Cno CHAR(4),
    	Grade SMALLINT,
    	PRIMARY KEY (Sno,Cno),
    	FOREIGN KEY (Sno) REFERENCES Student(Sno),
    	FOREIGN KEY (Cno) REFERENCES Course(Cno)
    	);
    INSERT Student(Sno, Sname, Ssex, Sage, Sdept) 
    VALUES	(201215121,'李勇','男',20,'CS'),
    	(201215122,'劉晨','女',19,'CS'),
    	(201215123,'王敏','女',18,'MA'),
    	(201215125,'張立','男',19,'IS')
    INSERT Course(Cno,Cname,Cpno,Ccredit)
    VALUES	('1','數據庫','5',4),
    	('2','數學',' ',2),
    	('3','信息系統','1',4),
    	('4','操作系統','6',3),
    	('5','數據結構','7',4),
    	('6','數據處理',' ',2),
    	('7','PASCAL語言','6',4)
    INSERT SC(Sno, Cno, Grade) 
    VALUES	(201215121,1,92),
    	(201215121,2,85),
    	(201215121,3,88),
    	(201215122,2,90),
    	(201215122,3,80)
    
  1. 定義信息系學生基本情況視圖V_IS,並查看視圖結構,通過該視圖可以將其他系學生信息屏蔽掉。

    CREATE VIEW V_IS AS
    SELECT * FROM Student
    WHERE Sdept='IS'
    
  2. 定義視圖V_Student_Grade,能夠顯示學生學號,姓名,課程號,課程名,成績。

    CREATE VIEW V_Student_Grade AS
    SELECT Student.Sno AS '學號',
    Student.Sname AS '姓名',
    Course.Cno AS '課程號',
    Course.Cname AS '課程名',
    SC.Grade AS '成績'
    FROM Student,Course,SC
    WHERE Student.Sno=SC.Sno AND Course.Cno = SC.Cno
    
  3. 將各系學生人數,平均年齡定義為視圖V_COUNT_AVG,並查看視圖創建信息。

    CREATE VIEW V_COUNT_AVG AS
    SELECT Sdept AS '系名',
    COUNT(*) AS '人數',
    AVG(Sage) AS '平均年齡'
    FROM Student
    GROUP BY Sdept
    
    SELECT * FROM V_COUNT_AVG
    
  4. 定義一個反映學生出生年份的視圖V_BIRTH,使用CREATE OR REPLACE
    VIEW語句創建,多次執行該創建語句並查看結果。

    CREATE OR REPLACE VIEw V_BIRTH AS
    SELECT Sname as '姓名',
    (2021-Sage) as '出生年份'
    FROM Student
    
    SELECT * FROM V_BIRTH
    
  5. 將各位學生學號、選修課程的門數及平均成績定義為視圖V_AVG_STUDENT。

    CREATE VIEW V_AVG_STUDENT AS
    SELECT Sno AS '學號',
    COUNT(*) AS '選修課門數',
    AVG(Grade) AS '平均成績'
    FROM SC
    GROUP BY Sno
    
  6. 將各門課程的課程號、選修人數及平均成績定義為視圖V_AVG_COURSE。

    CREATE VIEW V_AVG_COURSE AS
    SELECT Cno AS '課程號',
    COUNT(*) AS '選修人數',
    AVG(Grade) AS '平均成績'
    FROM SC
    GROUP BY Cno
    
  7. 使用SQL語句完成以下視圖操作,查看結果,並分析原因。

    ①通過視圖V_IS,將學號為"201215125"的學生姓名更改為"張小立",並查看結果;

    UPDATE V_IS
    SET Sname='張小立'
    WHERE Sno=201215125;
    SELECT * FROM V_IS;
    

    ②通過視圖V_IS,新增加一個學生記錄 ('201215126','黃笑',19,
    '男','IS'),並查看結果。

    INSERT INTO V_IS(Sno,Sname,Sage,Ssex,Sdept)
    VALUES (201215126,'黃笑',19, '男','IS');
    SELECT * FROM V_IS
    WHERE Sno=201215126;
    

    ③通過視圖V_IS,新增加一個學生記錄 ('201215127','李霞',19,'女','MA'),並查看結果。

    INSERT INTO V_IS(Sno,Sname,Sage,Ssex,Sdept)
    VALUES ('201215127','李霞',19, '女','MA');
    SELECT * FROM Student
    WHERE Sno=201215127;
    

    ④通過視圖V_IS,刪除學號為"201215126"的學生信息,並查看結果。

    DELETE
    FROM V_IS
    WHERE Sno='201215126';
    SELECT * FROM V_IS
    WHERE Sno=201215126;
    

    ⑤通過視圖V_Student_Grade,將學號"201215122"的姓名改為"劉曉晨",能否實現?若無法實現說明原因。

    UPDATE V_Student_Grade
    SET 姓名='劉曉晨'
    WHERE 學號=201215122;
    SELECT * FROM V_Student_Grade
    WHERE 學號=201215122;
    #可以實現
    

    ⑥通過視圖V_AVG_STUDENT,將學號"201215121"的平均成績改為90,能否實現?若無法實現
    說明原因。

    • 無法實現,MySQL無法修改各科數據使其平均成績為90

    ⑦修改視圖V_IS定義,添加WITH CHECK OPTION語句,然后用update語句修改"201215125" 的學生所在系,改為'MA',能否實現?若無法實現說明原因。

    ALTER VIEW V_IS AS
    SELECT * FROM STUDENT
    WHERE SDEPT='IS'
    WITH CHECK OPTION
    UPDATE V_IS
    SET SDEPT='MA'
    WHERE SNO='200215125'
    

    無法實現此操作,原因是目標視圖所跨越的某一視圖指定了WITH CHECK
    OPTION,而該操作的一個或多個結果又不符合WITH CHECK OPTION約束的條件。

  8. 利用表和前面所建視圖V_AVG_STUDENT,查詢平均成績為85分以上的學生學號、姓名和成績。

    SELECT V_AVG_STUDENT.學號,Student.Sname,V_AVG_STUDENT.平均成績
    FROM V_AVG_STUDENT,Student
    WHERE Student.Sno=V_AVG_STUDENT.學號 AND V_AVG_STUDENT.平均成績>85
    
  9. 利用表和前面所建視圖V_AVG_COURSE,查詢成績大於課程平均成績的學生學號、課程號和成績。

    SELECT sc.sno 學號,sc.cno 課程號,sc.grade 成績
    FROM sc,V_AVG_COURSE
    WHERE sc.cno=V_AVG_COURSE.課程號 AND sc.grade>V_AVG_COURSE.平均成績
    
  10. 利用表和前面所建視圖V_AVG_STUDENT,按系分組統計平均成績80分以上的人數,降序排列。

    SELECT DISTINCT SDEPT,COUNT(*)SUM
    FROM Student,V_AVG_STUDENT
    WHERE Student.SNO=V_AVG_STUDENT.學號 AND 平均成績>80
    GROUP BY STUDENT.SDEPT
    ORDER BY SUM DESC
    
  11. 刪除以上所有視圖。

    DROP VIEW V_IS;
    DROP VIEW V_Student_Grade;
    DROP VIEW V_COUNT_AVG;
    DROP VIEW V_BIRTH;
    DROP VIEW V_AVG_STUDENT;
    DROP VIEW V_AVG_COURSE;
    

二、在學生-課程數據庫上創建索引並使用索引:

  1. 使用CREATE INDEX語句為student表創建一個組合索引id_sno_sdept,以學號降序、院系升序。

    CREATE INDEX id_sno_sdept
    ON Student(Sno DESC ,Sdept ASC);
    
  2. 刪除student 上原先的唯一索引,使用ALTER TABLE語句在sname列上重新建立普通降序索引 id_sname。

    DROP INDEX Sname ON Student;
    ALTER TABLE Student ADD UNIQUE INDEX id_sname(Sname DESC);
    
  3. 在course表的cname列上建立唯一索引id_cname。

    CREATE UNIQUE INDEX id_cname
    ON Course(Cname);
    
  4. 用三種方式查看student表中的索引。

    SHOW INDEX FROM Student;
    DESC Student;
    SHOW CREATE TABLE Student;
    
  5. 用DROP INDEX語句刪除索引id_sno_sdept。

    DROP INDEX id_sno_sdept ON Student;
    
  6. 用ALTER TABLE語句刪除索引id_sname。

    ALTER TABLE Student DROP INDEX id_Sname;
    

實 驗 心 得:

  通過本次實驗,我掌握了創建(CREATE VIEW)修改視圖的方法,熟悉了視圖更新與基本表更新的區別與聯系,了解了視圖的作用。同時我還熟悉索引的作用,以及不同類型索引的區別。最后,我掌握了SQL語句對索引的創建使用和刪除索引的方法。

附 錄:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM