数据库原理实验四——视图与索引

Posted Alfred young

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库原理实验四——视图与索引相关的知识,希望对你有一定的参考价值。

实验目的

  1. 熟练掌握使用图形用户界面和SQL语言创建、操作和删除视图。
  2. 熟练掌握使用图形用户界面和SQL语言创建和删除索引。
  3. 理解与验证索引的作用。

实验内容

  1. 在Student数据库中,用SQL语句创建一个选修了“数据库”课程并且是2001年出生的学生的视图,视图中包括学号,姓名,性别,成绩。(5分)
CREATE VIEW STUDENT_2001(SNO,SNAME,SGENDER,SBIRTH)
AS 
SELECT S.SNO,SNAME,SGENDER,GRADE FROM S,SC,C
WHERE S.SNO = SC.SNO AND C.CNO = SC.CNO AND CNAME = '数据库' AND SBIRTH LIKE '2001%';
  1. 在SPJ_MNG数据库中,用两种不同的SQL语句为工程项目名是“三建”的工程项目建立一个供应情况视图,包括供应商代码(SNO),零件代码(PNO),供应数量(QTY)创建以下视图(视图名:V_SPJ)。(10分)

方法一

CREATE VIEW V_SPJ
AS
SELECT SNO,PNO,QTY FROM SPJ
WHERE JNO IN
(
	SELECT JNO FROM J
    WHERE JNAME = '三建'
);

方法二

CREATE VIEW V_SPJ
AS
SELECT SNO,PNO,QTY FROM SPJ,J
WHERE SPJ.JNO = J.JNO AND JNAME = '三建';
  1. 用SQL语句针对第2小题的V_SPJ完成下面的视图查询。(10分)

(1) 找出“三建”工程项目使用的各种零件代码及其数量。

SELECT PNO,SUM(QTY) 
FROM V_SPJ
GROUP BY PNO;

(2) 找出供应商S1的供应情况。

SELECT * FROM V_SPJ
WHERE SNO = 'S1';
  1. 用SQL语句针对第2小题的V_SPJ完成视图的数据更新。(15分)

(1) 给视图V_SPJ中增加一条数据。
根据提示信息或无法显示或需要触发器,因此不需要实现
(2) 修改视图V_SPJ中的任意一条数据的供应数量。

UPDATE V_SPJ
SET QTY = 400
WHERE SNO = 'S3' AND PNO = 'P1';

(3) 删除视图V_SPJ中的任意一条数据。

DELETE 
FROM V_SPJ
WHERE SNO = 'S3' AND PNO = 'P1';
  1. 用图形用户界面对Student数据库中C表的Cno字段创建一个降序排列的索引,索引名称IX_CNo。(5分)


索引创建位置如图所示

  1. 使用SQL语句对Student数据库完成以下的索引操作。(15分)

(1) 在C表的CName属性上创建一个非唯一性的普通索引,索引名IX_CName。

CREATE INDEX IX_CName
ON C(CNAME);

(2) 在S表上创建一个名为IX_ngd的复合索引,该索引是针对sname, sgender, sdept属性集建立的升序索引。

CREATE INDEX IX_ngd
ON S(SNAME ASC,SGENDER ASC,SDEPT ASC);

(3) 删除C表的索引IX_CNo。

DROP INDEX IX_CNo ON C; 

(4) 基于以上的索引(c表:cno的主键索引,cname的普通索引;S表:sno的主键索引,IX_nga复合索引),用explain得到的查询计划观察每个查询语句中索引的使用情况。

DROP INDEX IX_CNo ON C; 

① explain select * from c;
未使用索引
② explain select * from c where cno = ‘1’;
使用主键索引
③ explain select * from c where cname=’数据库’ ;
使用主键索引
④ explain select * from c where cname like ‘%数据库%’;
未使用索引
⑤ explain select * from c where cname like ‘数据库%’;
未使用索引
⑥ explain select * from s where sname =‘张立’ and sno=‘2001’;
使用复合索引
⑦ explain select * from s where sname =‘张立’ and sgender=‘男’ and sdept=‘IS’;
使用复合索引
⑧ explain select * from s where sname =‘张立’ and sgender=‘男’;
使用复合索引
⑨ explain select * from s where sname =‘张立’;
使用复合索引
⑩ explain select * from s where sgender =‘男’;
未使用索引
⑪ explain select * from s where sgender =‘男’ and sdept=‘IS’;
未使用索引

  1. 假设有一个如下的基本表userinfo,自己设计一个实验验证索引对数据库查询效率的提升作用。(40分)
    create table userinfo
    (
    user_id int primary key, //用户ID
    username varchar(10), //用户名
    gender char(1), //性别
    age int, //年龄
    c_id int //学院编号
    )

(1) 验证有索引和无索引的查询效率差异。
在age上创建一个索引,并按照如下语句进行查询

EXPLAIN SELECT *   
FROM userinfo   
WHERE age = 25; 

(2) 验证单字段窄索引和多字段构成的宽索引的查询效率异,注意理解宽索引中的最左匹配原则。
首先在age上创建一个窄索引
然后查询

EXPLAIN SELECT username,age,gender,c_id   
FROM userinfo   
WHERE gender = 'm' AND age = 25 AND c_id = 1; 

然后在age,gender,c_id创建一个宽索引
然后同上查询即可知道查询效率的差异。

以上是关于数据库原理实验四——视图与索引的主要内容,如果未能解决你的问题,请参考以下文章

编译原理系列 实验四语义分析与中间代码生成

数据库原理实验(openGauss)视图

数据库原理实验(openGauss)创建数据库表和索引

数据库原理与应用实验6--[数据库的视图定义与应用]

oracle视图与索引

20179223《Linux内核原理与分析》第十一周学习笔记