006-实验六T-索引与视图(实验报告内容)
- 格式:doc
- 大小:244.00 KB
- 文档页数:7
索引实验报告[精选5篇]第一篇:索引实验报告学生实验报告课程名称商务数据库应用实验成绩实验项目名称索引批阅教师实验者学号专业班级实验日期 2012-12-6 一、实验预习报告(实验目的、内容,主要设备、仪器,基本原理、实验步骤等)(可加页)实验目的 1)理解索引的概念和分类。
2)掌握在对象资源管理器中创建和管理索引。
3)掌握 T-SQL 语句创建和管理索引。
实验内容 1)在对象资源管理器中创建、修改和删除索引。
2)在对象资源管理器使用索引。
3)利用 T-SQL 语句创建、修改和删除索引。
4)利用 T-SQL 语句使用索引。
二、实验过程记录(包括实验过程、数据记录、实验现象等)(可加页)1.启动 SQL Server Management Studio,在对象资源管理器中,利用图形化的方法创建下列索引:λ对学生信息表 stu_info 的 name 列创建非聚集索引 idx_name。
λ对学生成绩表 stu_grade 的 stu_id、couse_id 列创建复合索引idx_stu_couse_id。
2.启动 SQL Server Management Studio,在对象资源管理器中,利用图形化的方法对索引idx_name 进行修改,使其成为唯一索引。
3.启动 SQL Server Management Studio,在对象资源管理器中,利用图形化的方法删除索引 idx_stu_couse_id。
4.启动 SQL Server Management Studio,在 SQL 编辑器中,利用 T-SQL 语句 CREATE INDEX命令创建下列索引:λ对课程信息表couse_info 的couse_name 列创建非聚集索引idx_couse_name。
λ对学生成绩表 stu_grade 的 stu_id、couse_id 列创建复合索引idx_stu_couse_id。
5.启动 SQL Server Management Studio,在 SQL 编辑器中,利用 T-SQL 语句对索引idx_couse_name 进行修改,使其成为唯一索引。
信息工程学院实验报告课程名称:《数据库原理》Array实验项目名称:视图和索引的创建和使用一、实验目的:(1)掌握创建视图的SQL语句的用法。
(2)掌握修改视图的方法。
(3)熟悉视图更新与基本表更新的区别与联系;认识视图的作用。
(4)熟悉索引的作用,以及不同类型索引的区别。
(5)学会用T-SQL语句对表创建和删除索引二、实验设备与器件Win7 +Sql server 2008三、实验内容与步骤利用备份文件school,还原数据库,然后完成以下实验内容:(1)用T-SQL语句,定义信息系学生基本情况视图V_IS。
(2)用T-SQL语句,将Student,Course 和SC表中学生的学号,姓名,课程号,课程名,成绩定义为视图V_S_C_G。
(3)用T-SQL语句,将各系学生人数,平均年龄定义为视图V_NUM_AVG。
(4)用T-SQL语句,定义一个反映学生出生年份的视图V_YEAR。
(5)用T-SQL语句,将各位学生学号、选修课程的门数及平均成绩定义为视图V_AVG_S_G。
(6)用T-SQL语句,将各门课程的课程号、选修人数及平均成绩定义为视图V_AVG_C_G。
(7)用T-SQL语句完成以下视图操作,查看结果,并分析原因。
①通过视图V_IS,将学号为“200215125”的学生姓名更改为“张小立”,并查看结果;②通过视图V_IS,新增加一个学生记录 ('200215126','黄笑',19, '男','IS'),并查看结果。
③通过视图V_IS,新增加一个学生记录 ('200215127','李霞',19, '女','MA'),并查看结果。
④通过视图V_IS,删除学号为“200215126”的学生信息,并查看结果。
⑤通过视图V_S_C_G,将学号“200215122”的姓名改为“刘晓晨”,能否实现?若无法实现说明原因。
实验六索引的创建和使用建议学时:2实验目的:1)了解索引的概念、优点及分类。
2)掌握在SQL Server Management Studio 中创建、修改和删除索引的操作。
3)掌握使用T-SQL语句创建、修改和删除索引的操作。
实验内容及步骤:(一)索引的概念数据库中的索引是一个列表,在这个列表中包含了某个表中一列或者若干列值的集合,以及这些值的记录在数据表中的存储位置的物理地址。
索引的优点:1.可以大大加快数据检索速度。
2.通过创建唯一索引,可以保证数据记录的唯一性。
3.在使用ORDER BY和GROUP BY子句进行检索数据时,可以显著减少查询中分组和排序的时间。
4.使用索引可以在检索数据的过程中使用优化隐藏器,提高系统性能。
5.可以加速表与表之间的连接,这一点在实现数据的参照完整性方面有特别的意义。
索引的分类:1.聚集索引聚集索引基于数据行的键值,在表内排序和存储这些数据行。
每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储,表中的物理顺序和索引中行的物理顺序是相同的。
2.非聚集索引非聚集索引具有完全独立于数据行的结构,使用非聚集索引不用将物理数据页中的数据按列排序。
非聚集索引包含索引键值和指向表数据存储位置的行定位器。
可以对表或索引视图创建多个非聚集索引。
设计非聚集索引是为了改善经常使用的、没有建立聚集索引的查询的性能。
3.唯一索引确保索引键不包含重复的值。
聚集索引和非聚集索引都可以是唯一索引,这种唯一性与主键约束是相关联的,在某种程度上,主键约束等于唯一性的聚集索引。
(二)SSMS中索引的管理1.新建索引【例1】为GZGL数据库中的employee表新建非聚集索引i_emp_age,要求按emp_age 升序完成。
①在【对象资源管理器】中,展开指定的服务器、数据库和要创建索引的表。
右键单击【索引】,然后单击【新建索引】→【非聚集索引】,如图3-45所示。
②出现的【新建索引】对话框,如图3-46所示。
7-1编程在teaching 数据库中的student 表的sname 列上创建唯一索引IDX_sname。
USE teachingGOCREATE UNIQUE INDEX IDX_sname ON student(sname)7-2 编程在teaching数据库中的student表的studentno和classno列上创建组合索引IDX_sc。
USE teachingIF EXISTS(SELECT name FROM sysindexes WHERE name='IDX_sc')DROP INDEX student.scGOCREATE INDEX IDX_sc ON student(studentno,classno)7-3 重新组织teaching 数据库中student 表上的IDX_sc 索引。
USE teachingALTER INDEX IDX_sc ON dbo.student REORGANIZE7-4 重新生成teaching 数据库中student 表上的IDX_sname 索引,设置填充索引,将填充因子设置为80%,设置将中间排序结果存储在tempdb中。
USE teachingALTER INDEX IDX_sname ON dbo.studentREBUILD WITH(PAD_INDEX =ON,FILLFACTOR= 80,SORT_IN_TEMPDB =ON)7-5 重新生成teaching 数据库中student 表上的C_studentno 索引,将其修改为聚集唯一索引,并指定该索引的叶级页的填充度为70%。
USE teachingGOCREATE UNIQUE CLUSTERED INDEX C_studentnoON dbo.student(studentno)WITH(PAD_INDEX =ON,FILLFACTOR= 70,DROP_EXISTING =ON)7-6 删除teaching 数据库中student 表上的聚集索引C_studentno 和非聚集索引UC_classno。
实验六视图和索引实验指导一、视图视图是SQL Server中重要的数据库对象。
视图常用于集中、简化和定制显示数据库的数据信息,为用户从多种角度观察数据库中的数据提方便。
为了屏蔽数据的复杂性、简化用户对数据的操作、控制用户访问数据的权限、保护数据安全,常为不同的用户创建不同的视图。
1. 视图的基本概念视图是从一个或多个表或视图导出的表;其结构和数据是建立在对表的查询基础上的。
和表一样,视图也是包括几个被定义的数据列和多个数据行。
但就本质而言,这些数据列和数据行来源于其所引用的表。
所以,视图不是真实存在的基础表,而是一张虚表。
视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。
视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样又在数据库中再存储一份。
通过视图看到的数据,只是存放在基本表中的数据。
对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。
当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。
可以将任何符合视图创建规定的SELCT语句命名和存储为视图。
在视图中北查询的表称为基表。
视图的常见实例如下。
●一个基表的行或列的于集。
●两个或多个表的合并。
●两个或多个表的联接。
●一个基表的统计总汇。
●另外一个视图的子集。
●视图和基表的混合。
2. 创建视图在SQL Server2008中创建视图,创建者必须拥有创建视图的权限,并且对视图中引用的基表或视图有许可权。
此外,创建视图前还应该注意以下几点:●只能在当前数据库中创建视图。
如果使用分布式查询,视图所引用的基表和视图可以存在于其他数据库或其他服务器中。
●在一个视图中最多引用1024列,视图中记录的行数限制由基表中的记录数目决定。
●视图的名称必须遵循标识符的命名规则,且对每个架构都必须唯一,并且该名称不得与该架构包含的任何表的名称相同。
《索引和视图》实验一、实验目的与要求1.学会使用SQL Server管理平台和Transact-SQL语句CREATE INDEX创建索引。
2.学会使用SQL Server管理平台查看索引。
3.学会使用SQL Server管理平台和Transact-SQL语句DROP INDEX 删除索引。
4.掌握使用SQL Server管理平台、向导等创建、管理和删除全文索引,并使用全文索引查询信息的方法。
5. 掌握使用SQL Server管理平台和Transact-SQL语句CREATE VIEW创建视图的用法。
6.掌握系统存储过程sp_rename的用法。
7.掌握使用Transact-SQL语句ALTER VIEW修改视图的方法。
二、实验平台1、操作系统:Windows XP或Windows 20032、数据库管理系统:SQL Server 2005三、实验内容1.分别使用SQL Server管理平台和Transact-SQL语句为教务管理系统数据库的《学生信息》和《课程信息》创建主键索引。
(1) 使用SQL Server管理平台为教务管理系统数据库的《学生信息》和《课程信息》创建主键索引。
(2) 使用Transact-SQL语句为教务管理系统数据库的《学生信息》和《课程信息》创建主键索引。
USE教务管理系统GOcreate unique nonclustered index学生信息_idxon学生信息(学号)GOUSE教务管理系统GOcreate unique nonclustered index课程信息_idxon课程信息(课程编号)GO2.使用SQL Server管理平台按《课程信息》的课程编号列创建唯一性索引。
3.分别使用SQL Server管理平台和Transact-SQL语句为studentsdb数据库的《成绩表》的“分数”字段创建一个非聚集索引,命名为《成绩_index》。
(1)使用SQL Server管理平台为教务管理系统数据库的《成绩表》的“分数”字段创建一个非聚集索引,命名为《成绩_index》。
GDOU-B-11-112广东海洋大学学生实验报告书实验名称实验六:使用索引、视图和批量课程名称数据库原理与设计成绩学院(系)软件学院专业计算机软件工程班级学生姓名学号实验地点实验日期实验目的:1.掌握索引的创建语法2.掌握视图的创建语法3.使用视图更新数据4.编写各种批量实验内容针对GlobalToyz和Recruitement,Student数据库,按要求完成下列题目。
1.对于Toys表,在玩具名称上建立一个唯一索引,写出相应的T-SQL语句。
2.对于Shipment表,我们会经常查看玩具的实际发送日期(dActualDeliveryDate),请问,我们应该建立什么索引加快每次查询该列的速度,并写出相应的T-SQL语句。
3.创建一个视图,由Toys表的vToyDescription和mToyRate列构成,要求限制用户查看该视图的生成脚本语句。
4.对于Recruitment数据库,创建一个视图名为vwCandidateContractRecruiter,其中包含了外部候选人的代码,姓名,测试成绩,以及其对应的合同招聘人员的代码和名称。
create view vwCandidateContractRecruiter as select andidatecode, a.vFirstname,a.vLastname, a.siTestScore,ontractRecruitercode,ame from Externalcandidate ajoin ContractRecruiter b on ontractREcruitercode=ontractRecruiterCod5.对于第4题中创建的视图vwCandidateContractRecruiter进行更新,修改外部候选人代码为‘000049’的候选人,更改其测验成绩为87分,并更改相对应的合同招聘人员的名称为‘Roger Federal’。
索引与视图学习报告一、学习目标:1、了解索引的概念和作用2、理解索引的创建的使用3、理解视图的基本概念和作用4、掌握视图的创建、查看及删除操作二、学习要求:1、了解索引和视图的含义,目的和作用,索引一经建立,就由系统使用和维护,无需用户干预。
2、通过看书和网上查阅资料,想同学多问多思考。
三、学习内容:1、索引:(1)索引定义:索引就是数据表中数据和相应的存储位置的列表,利用索引可以提高在表或视图中的查找数据的速度。
(2)数据库中索引主要分为两类:聚集索引和非聚集索引。
SQL Server 2005还提供了唯一索引、索引视图、全文索引、xml索引等等。
聚集索引和非聚集索引是数据库引擎中索引的基本类型,是理解其他类型索引的基础。
聚簇索引:聚集索引是值表中数据行的物理存储顺序和索引的存储顺序完全相同。
聚集索引根据索引顺序物理地重新排列了用户插入到表中的数据,因此,每个表只能创建一个聚集索引。
聚集索引经常创建在表中经常被搜索到的列或按顺序访问的列上。
在默认情况下,主键约束自动创建聚集索引。
非聚簇索引:非聚集索引不改变表中数据列的物理存储位置,数据与索引分开存储,通过索引指向的地址与表中的数据发生关系。
非聚集索引没有改变表中物理行的位置,索引可以在以下情况下使用非聚集索引:1、如果某个字段的数据唯一性比较高2、如果查询所得到的数据量比较少其他类型索引:除了以上索引,还有以下类型索引:A、唯一索引:如果希望索引键都不同,可以创建唯一索引。
聚集索引和非聚集索引都可以是唯一索引。
B、包含新列索引:索引列的最大数量是16个,索引列的字节总数的最高值是900。
如果当多个列的字节总数大于900,切又想在这些劣种都包含索引是,可以使用包含性列索引。
C、视图索引:提供视图查询效率,可以视图的索引物理化,也就是说将结果集永久存储在索引中,可以创建视图索引。
D、XML索引:是与xml数据关联的索引形式,是XML二进制blob的已拆分持久表示形式。
实验六索引与视图(实验报告)一、目的1.掌握索引和视图的基本概念和功能。
2.掌握利用SQL Server Management Studio和Transact-SQL语句创建、维护索引的方法。
3.掌握SQL Server Management Studio和Transact-SQL语句创建、修改视图的方法。
4.掌握通过视图查看和修改基本表中的数据。
二、实验内容(1)完成下列操作1.利用SQL Server Management Studio为student表的classno字段创建非聚集、非唯一索引UC_classno。
2.利用Transact-SQL语句在teaching数据库中teacher表的tname列上创建非聚集唯一索引UQ_tname。
若该索引已存在,则删除后重建。
3.利用SQL Server Management Studio查看索引被查询优化器使用的情况。
4.利用Transact-SQL语句修改UQ_tname的索引属性,当执行多行插入操作时出现重复键值,则忽略该记录,且设置填充因子为80%。
5.利用SQL Server Management Studio在teaching数据库中创建视图v_course_avg,查询没门课程的课程号、课程名及选修该课程的学生的期末平均成绩平均分,并且按平均分降序排列。
6.利用Transact-SQL语句,在teaching数据库中创建视图v_age,查询年龄在18岁及以上的学生的学号、姓名、性别、出生日期和班级编号。
若该视图已存在,则删除后重建。
7.利用Transact-SQL语句,在teaching数据库中创建视图v_teacher_course,包含教师编号、教师姓名、职称、课程号、课程名和任课班级。
8.利用Transact-SQL语句修改v_age的视图定义,添加WITH CHECK OPTION选项。
9.通过视图v_teacher_course将教师编号为‘t05017’的教师的职称更改为‘副教授’。
计算机与信息学院数据库原理实验报告专业:计算机科学与技术班级:2012级本科班学号:*****姓名:指导教师:2014年06月18 日实验项目列表计算机与信息学院实验报告纸实验一数据库创建与管理一、实验目的与要求1、熟练掌握SSMS中界面方式创建和管理数据库。
2、熟练掌握SSMS查询编辑器T-SQL语句创建和管理数据库。
3、熟练掌握备份和还原数据库。
二、实验内容1、界面方式创建和管理数据库(1)创建数据库(2)修改数据库(3)删除数据库2、利用企业管理器备份和还原数据库(1)备份数据库(2)还原数据库3、T-SQL语句方式创建和管理数据库(1)创建SPJ数据库:在SSMS中“新建查询”,输入以下语句并运行CREATE DATABASE SPJON(NAME=’SPJ_Data’,FELENAME='C:\Program Files\Microsoft SQL Server\MSSQL\data\SPJ_Data.MDF' ,SIZE = 3,MAXSIZE = 10,FILEGROWTH = 10%)LOG ON(NAME = 'SPJ_Log', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL\data\SPJ_Log.LDF' ,SIZE = 1,FILEGROWTH = 10%)(2)修改SPJ数据库:在查询分析器中输入以下语句并运行ALTER DATABASE SPJMODIFY FILE(NAME='SPJ_Data',SIZE=4,ALTER DATABASE SPJADD FILE(NAME='SPJ_Data_2', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL\Data\SPJ_Date_2.ndf',SIZE=1,MAXSIZE=10,FILEGROWTH=10%)(3)删除SPJ数据库:DROP DATABASE SPJ4、界面方式创建数据库XSBOOK,写出操作过程。
一、实验步骤(一)附加上次实验所创建的数据库“db_Library”,并回顾该数据库的数据表信息。
(二)练习创建和管理视图1、使用管理控制台创建一个名为“计算机系借阅信息_VIEW”的视图,要求显示计算机系读者2011-1-1以后借阅的图书信息,包括“读者姓名”、“图书编号”和“借阅日期”三个字段。
打开sql server管理控制台窗口,打开新建视图对话框。
在添加表中添加tb_borrow和tb_reader表,在选中输出复选框中选中:读者编号,图书编号,借阅日期。
use db_library goselect * from 读者借阅信息_VIEWwhere 所在系='计算机'and 借阅日期>'2011_1_1'2、使用T-SQL语句创建一个名为“读者借阅信息_VIEW”的视图,要求显示所有的读者借阅信息,包括“读者编号”、“姓名”、“系部”、“图书编号”、“图书名称”和“借阅日期”等字段。
use db_library gocreate view 读者借阅信息_VIEW asselect tb_readder.读者编号,tb_reader.姓名,tb_reader所在系,tb_book.图书编号,tb_book.书名,tb_borrow.借阅日期 from tb_reader,tb_borrow,tb_bookwhere tb_reader.读者编号=tb_borrow.读者编号and tb_book.图书编号=tb_borrow.图书编号Select * from读者借阅信息_VIEW3、使用管理控制台查看“读者借阅信息_VIEW”视图的定义信息和依赖的对象。
打开管理控制台,在数据库“db_Library”下的“视图”对象;在左边窗口右击“读者借阅息_VIEW”该视图,在在窗口中选中“查看依赖关系”选项。
4、使用系统存储过程查看“计算机系续借阅信息_VIEW”视图的定义信息和依赖的对象。
实验5 索引和视图一、实验目的1.掌握索引的使用方法2.掌握数据完整性的实现方法3.熟悉视图的概念和作用4.掌握视图的创建方法5.掌握如何查询和修改视图二、实验准备1.了解索引的作用与分类2.掌握索引的创建方法3.了解视图的概念4.了解创建视图的方法5.了解对视图的操作三、实验内容及要求1.创建索引1)在Employees表的Name列和Address列上建立复合索引。
2)对Departments表上的DepartmentName列建立唯一性索引。
3)使用CREATE INDEX语句能创建主键吗?4)向Employees表中的出生日期列添加一个唯一性索引,姓名列和性别列上添加一个复合索引。
5)假设Departments表中没有主键,使用ALTER TABLE语句将DepartmentID列设为主键。
6)添加主键和添加普通索引有什么区别?7)创建与Departments表相同结构的表Departments1,将DepartmentName设为主键,DepartmentsID上建立一个索引。
2.删除索引1)使用DROP INDEX语句删除表Employees上的索引depart_ind。
2)使用ALTER TABLE语句删除Departments上的主键和索引Dep_ind。
3.创建视图1)创建YGGL数据库上的视图DS_VIEW,视图包含Departments表的全部列。
2)创建YGGL数据库上的视图Employees_view,视图包含员工号码、姓名和实际收入。
4.查询视图1)从视图DS_VIEW中查询出部门号为3的部门名称。
2)从视图Employees_view查询出姓名为“王林”的员工的实际收入。
5.更新视图1)向视图DS_VIEW中插入一行数据:6,广告部,广告业务。
2)执行完该命令使用SELECT语句分别查看视图DS_VIEW和基本表Departments中发生的变化。
3)尝试向视图Employees_view中插入一行数据,看看会发生什么情况。
实验四索引和视图一、实验学时2学时二、实验目的(1)理解索引的概念与类型。
(2)掌握使用企业管理器创建与维护索引的方法。
(3)掌握T-SQL语句创建与维护索引的方法。
(4)理解视图的概念。
(5)掌握视图创建、更改的方法。
(6)掌握用视图管理数据的方法。
三、实验要求(1)硬件设备:奔腾II或奔腾II以上计算机,局域网。
SERVER、WINDOWS7、XP、WINDOWS9X/NT、WINDOWS(2)软件环境:WINDOWSSQL SERVER 2000/2005/2008中文版企业版或标准版。
(3)实验课前预习,课后及时完成实验内容。
(4)实验过程及记录按题目格式要求填写代码清单。
四、实验内容(一)索引索引分为两种:聚簇索引和非聚簇索引。
每张表只能有一个聚簇索引。
创建索引时的缺省设置是非聚簇索引。
1.使用企业管理器创建、管理索引(1)创建索引1)为Student表创建一个以Sno为索引关键字的惟一聚簇索引。
(若原已有,请删除,索引名为Sno_index)(提示:选择表后点击鼠标右键,选“设计”,窗口空白区域点击鼠标右键,选“索引/键”)基本步骤:2)为Student表创建以Sname,Sex为索引关键字的非聚簇索引(对Sname 以升序来排列,Sex以降序排列,并设置填充因子为70%)。
索引名为:SS_index。
(提示:填充因子为索引创建时索引里的数据页被填充的数量)基本步骤:(2)重命名索引将索引文件Sno_index重新命名为Sno_index1。
基本步骤:(3)删除索引将索引文件Sno_index1删除。
基本步骤:2.使用T-SQL语句创建、管理索引(1)创建索引1)为SC表创建一个非聚集索引Grade_index,索引关键字为Grade,升序,填充因子为80%。
(提示:with fillfactor=)T-SQL语句:create nonclustered index Grade_indexon SC(Grade)with fillfactor=80;2)为SC表创建一个唯一性聚集索引SC_index,索引关键字为Sno,Cno。
实验报告六图及图的操作实验一、实验目的:1、掌握图的基本概念和术语2、掌握图的存储结构及创建算法。
3、掌握图的遍历算法(递归或非递归算法)。
二、实验内容:1、图邻接矩阵存储结构表示及基本操作算法实现(1)邻接矩阵存储结构类定义:自定义如下:public interface LList<T> {boolean isEmpty();int length();T get(int i);void set(int i,T x);void insert(int i,T x);void append(T x);T remove(int i);void removeAll();}public class SeqList<T> implements LList<T> {private Object[] element;private int len;public SeqList(int size){this.element=new Object[size];this.len = 0;}public SeqList(SeqList<T> list){this(list.len);this.len=list.len;}public SeqList(){this(64);}public boolean isEmpty(){return this.len==0;}public int length(){return this.len;}public T get(int i){if(i>=0&&i<this.len)return (T)this.element[i];return null;}public void set(int i, T x){if(x==null)return;if(i>=0&&i<this.len)this.element[i] = x;elsethrow new IndexOutOfBoundsException(i+""); }public String toString(){String str = "(";if(this.len>0)str += this.element[0].toString();for(int i=1;i<this.len;i++)str +=","+this.element[i].toString();return str+")";}public void insert(int i, T x){if(x==null)return;if(this.len==element.length){Object[] temp = this.element;this.element=new Object[temp.length*2];for(int j=0;j < temp.length;i++)this.element[j]=temp[j];}if(i<0)i=0;if(i>this.len)i=this.len;for(int j=this.len-1;j>=i;j--)this.element[j+1] = this.element[j];this.element[i]=x;this.len++;}public void append(T x){insert(this.len,x);}public T remove(int i){if(this.len==0||i<0||i>=len)return null;T old = (T)this.element[i];for(int j=0;j<this.len-1;j++)this.element[j] = this.element[j+1];this.element[this.len-1]=null;this.len--;return old;}public void removeAll(){this.len=0;}}(2)创建邻接矩阵算法创建无向图邻接矩阵算法:public class MatrixGraph<T> {protected SeqList<T> vertexlist;protected int[][] adjmatrix;private final int Max=0;public MatrixGraph(int size){size=size<10?10:size;this.vertexlist=new SeqList<T>(size);this.adjmatrix=new int[size][size];for(int i=0;i<size;i++)for(int j=0;j<size;j++)this.adjmatrix[i][j]=(i==j)?0:Max;}public MatrixGraph(T[] vertices,Edge[] edges){ this(vertices.length);if(vertices==null)return;for(int i=0;i<vertices.length;i++)insertVertex(vertices[i]);if(edges!=null)for(int j=0;j<edges.length;j++)insertEdge(edges[j]);}public int vertexCount(){return this.vertexlist.length();}public T get(int i){return this.vertexlist.get(i);}public int getWeight(int i,int j){return this.adjmatrix[i][j];}public String toString(){String str="顶点集合:"+this.vertexlist.toString()+"\n 邻接矩阵:\n";int n=this.vertexCount();for(int i=0;i<n;i++){for(int j=0;j<n;j++)str+=this.adjmatrix[i][j]==Max?" 0":" "+this.adjmatrix[i][j];str+="\n";}return str;}public int insertVertex(T x){this.vertexlist.append(x);if(this.vertexCount()>this.adjmatrix.length){int temp[][]=adjmatrix,i,j;this.adjmatrix=new int[temp.length*2][temp.length^2];for(i=0;i<temp.length;i++){for(j=0;j<temp.length;j++)this.adjmatrix[i][j]=temp[i][j];for(j=temp.length;j<temp.length*2;i++)this.adjmatrix[i][j]=Max;}for(i=temp.length;i<temp.length*2;i++)for(j=0;j<temp.length*2;j++)this.adjmatrix[i][j]=(i==j)?0:Max;}return this.vertexlist.length()-1;}public void insertEdge(int i,int j,int weight){int n=this.vertexCount();if(i>=0&&i<n&&j>=0&&i!=j&&this.adjmatrix[i][j]==Max) this.adjmatrix[i][j]=weight;}public void insertEdge(Edge edge){this.insertEdge(edge.start,edge.dest,edge.weight);}}创建无向网邻接矩阵算法:public class MatrixGraph<T> {protected SeqList<T> vertexlist;protected int[][] adjmatrix;private final int Max=99999;public MatrixGraph(int size){size=size<10?10:size;this.vertexlist=new SeqList<T>(size);this.adjmatrix=new int[size][size];for(int i=0;i<size;i++)for(int j=0;j<size;j++)this.adjmatrix[i][j]=(i==j)?0:Max;}public MatrixGraph(T[] vertices,Edge[] edges){this(vertices.length);if(vertices==null)return;for(int i=0;i<vertices.length;i++)insertVertex(vertices[i]);if(edges!=null)for(int j=0;j<edges.length;j++)insertEdge(edges[j]);}public int vertexCount(){return this.vertexlist.length();public T get(int i){return this.vertexlist.get(i);}public int getWeight(int i,int j){return this.adjmatrix[i][j];}public String toString(){String str="顶点集合:"+this.vertexlist.toString()+"\n 邻接矩阵:\n";int n=this.vertexCount();for(int i=0;i<n;i++){for(int j=0;j<n;j++)str+=this.adjmatrix[i][j]==Max?" ∞":" "+this.adjmatrix[i][j];str+="\n";}return str;}public int insertVertex(T x){this.vertexlist.append(x);if(this.vertexCount()>this.adjmatrix.length){int temp[][]=adjmatrix,i,j;this.adjmatrix=new int[temp.length*2][temp.length^2];for(i=0;i<temp.length;i++){for(j=0;j<temp.length;j++)this.adjmatrix[i][j]=temp[i][j];for(j=temp.length;j<temp.length*2;i++)this.adjmatrix[i][j]=Max;}for(i=temp.length;i<temp.length*2;i++)for(j=0;j<temp.length*2;j++)this.adjmatrix[i][j]=(i==j)?0:Max;}return this.vertexlist.length()-1;}public void insertEdge(int i,int j,int weight){int n=this.vertexCount();if(i>=0&&i<n&&j>=0&&i!=j&&this.adjmatrix[i][j]==Max)this.adjmatrix[i][j]=weight;}public void insertEdge(Edge edge){this.insertEdge(edge.start,edge.dest,edge.weight);}}创建有向图邻接矩阵算法:(可使用前无向图邻接矩阵算法)创建有向网邻接矩阵算法:(可使用前无向图邻接矩阵算法)(3)输出邻接矩阵结果算法public static void main(String[] args){String[] vertices={"A","B","C","D","E"};Edge edges[]={new Edge(0,1,1),new Edge(0,3,1),new Edge(1,0,1),new Edge(1,2,1),new Edge(1,3,1),new Edge(2,1,1),new Edge(2,3,1),new Edge(2,4,1),new Edge(3,0,1),new Edge(3,1,1),new Edge(3,2,1),new Edge(3,4,1),new Edge(4,2,1),new Edge(4,3,1),};MatrixGraph<String> graph=new MatrixGraph<String>(vertices,edges);System.out.println("无向图:"+graph.toString());}public static void main(String[] args){String[] vertices={"A","B","C","D","E"};Edge edges[]={new Edge(0,1,5),new Edge(0,3,2),new Edge(1,0,5),new Edge(1,2,7),new Edge(1,3,6),new Edge(2,1,7),new Edge(2,3,8),new Edge(2,4,3),new Edge(3,0,2),new Edge(3,1,6),new Edge(3,2,8),new Edge(3,4,9),new Edge(4,2,3),new Edge(4,3,9)};MatrixGraph<String> graph=new MatrixGraph<String>(vertices,edges);System.out.println("无向网:"+graph.toString());}public static void main(String[] args){String[] vertices={"A","B","C","D","E"};Edge edges[]={new Edge(0,1,1),new Edge(0,3,1),new Edge(1,3,1),new Edge(2,3,1),new Edge(2,4,1),new Edge(3,1,1),new Edge(3,2,1),new Edge(4,2,1),new Edge(4,3,1)};MatrixGraph<String> graph=new MatrixGraph<String>(vertices,edges);System.out.println("有向图:"+graph.toString());}public static void main(String[] args){String[] vertices={"A","B","C","D","E"};Edge edges[]={new Edge(0,1,5),new Edge(0,3,2),new Edge(1,3,6),new Edge(2,3,8),new Edge(2,4,3),new Edge(3,1,9),new Edge(3,2,2),new Edge(4,2,3),new Edge(4,3,9)};MatrixGraph<String> graph=new MatrixGraph<String>(vertices,edges);System.out.println("有向网:"+graph.toString());}测试结果粘贴如下:2、图邻接表存储结构表示及基本操作算法实现(1)邻接表存储结构类定义:自定义如下:public class Vertex<T> {public T data;public SortedSinglyLinkedList<Edge> adjlink;public Vertex(T data){this.data=data;this.adjlink=new SortedSinglyLinkedList<Edge>();}public String toString(){return"\n"+this.data.toString()+": "+this.adjlink.toString();}}(2)创建邻接表算法创建无向网邻接表算法:(可使用下有向网邻接表算法)创建有向网邻接表算法:public class AdjListGraph<T> {protected SeqList<Vertex<T>> vertexlist;public AdjListGraph(int size){size=size<10?10:size;this.vertexlist=new SeqList<Vertex<T>>(size);}public AdjListGraph(T[] vertices,Edge[] edges){this(vertices.length*2);if(vertices==null)return;for(int i=0;i<vertices.length;i++)insertVertex(vertices[i]);if(edges!=null)for(int j=0;j<edges.length;j++)insertEdge(edges[j]);}public String toString(){return"出边表: \n"+this.vertexlist.toString()+"\n";}public int insertVertex(T x){this.vertexlist.append(new Vertex<T>(x));return this.vertexlist.length()-1;}public int vertexCount(){return this.vertexlist.length();}public void insertEdge(int i,int j,int weight){if(i>=0&&i<vertexCount()&&j>=0&&j<vertexCount()&&i!=j){Edge edge=new Edge(i,j,weight);SortedSinglyLinkedList<Edge>adjlink=this.vertexlist.get(i).adjlink;Node<Edge> front=adjlink.head,p=front.next;while(p!=null&&pareTo(edge)<0){front=p;p=p.next;}if(p!=null&&pareTo(edge)==0)return;front.next=new Node<Edge>(edge,p);}}public void insertEdge(Edge edge){this.insertEdge(edge.start,edge.dest,edge.weight);}(3)输出邻接表结果算法public static void main(String[] args){String[] vertices={"A","B","C","D","E"};Edge edges[]={new Edge(0,1,5),new Edge(0,3,2),new Edge(1,0,5),new Edge(3,0,2),new Edge(2,4,3),new Edge(4,2,3)};AdjListGraph<String> graph=new AdjListGraph<String>(vertices,edges);System.out.println("无向网:"+graph.toString());}public static void main(String[] args){String[] vertices={"A","B","C","D","E"};Edge edges[]={new Edge(0,1,5),new Edge(0,3,2),new Edge(1,0,6),new Edge(1,2,7),new Edge(2,4,3),new Edge(3,2,8),new Edge(3,4,9)};AdjListGraph<String> graph=new AdjListGraph<String>(vertices,edges);System.out.println("有向网:"+graph.toString());}测试结果粘贴如下:3、图的遍历递归算法(1)(存储结构为邻接表)深度优先遍历算法递归算法:public interface QQueue<T> {boolean isEmply();void enqueue(T x);T dequeue();}public class SeqQueue<T> implements QQueue<T>{private Object element[];private int front,rear;public SeqQueue(int length){if(length<64)length=64;this.element=new Object[Math.abs(length)];this.front=this.rear=0;}public SeqQueue(){this(64);}public boolean isEmply(){return this.front==this.rear;}public void enqueue(T x){if(x==null)return;if(this.front==(this.rear+1)%this.element.length){ Object[] temp = this.element;this.element=new Object[temp.length*2];int i=this.front,j=0;while(i!=this.rear){this.element[j]=temp[i];i=(i+1)%temp.length;j++;}this.front=0;this.rear=j;}this.element[this.rear]=x;this.rear=(this.rear+1)%this.element.length;}public T dequeue(){if(isEmply())return null;T temp=(T)this.element[this.front];this.front=(this.front+1)%this.element.length;return temp;}public String toString(){String str="(";if(!isEmply()){str+=this.element[this.front].toString();int i=(this.front+1)%this.element.length;while(i!=this.rear){str+=","+this.element[i].toString();i=(i+1)%this.element.length;}}return str+=")";}public int length(){return(this.element.length+this.rear-this.front)%(this.element.length);}}public abstract class AbstractGraph<T> {public abstract int vertexCount();public abstract T get(int i);public abstract int getNextNeighbor(int i,int j);public void DFSTraverse(int i){boolean[] visited= new boolean[this.vertexCount()];int j=i;do{if(!visited[j]){System.out.print("{");this.depthfs(j,visited);System.out.print("}");}j=(j+1)%this.vertexCount();}while(j!=i);System.out.println();}public void depthfs(int i,boolean[] visited){System.out.print(this.get(i)+" ");visited[i]=true;int j=this.getNextNeighbor(i, -1);while(j!=-1){if(!visited[j])depthfs(j,visited);j=this.getNextNeighbor(i, j);}}}public class AdjListGraph<T> extends AbstractGraph<T>{ protected SeqList<Vertex<T>> vertexlist;public AdjListGraph(int size){size=size<10?10:size;this.vertexlist=new SeqList<Vertex<T>>(size);}public T get(int i){return this.vertexlist.get(i).data;}public AdjListGraph(T[] vertices,Edge[] edges){this(vertices.length*2);if(vertices==null)return;for(int i=0;i<vertices.length;i++)insertVertex(vertices[i]);if(edges!=null)for(int j=0;j<edges.length;j++)insertEdge(edges[j]);}public String toString(){return"出边表: \n"+this.vertexlist.toString()+"\n";}public int insertVertex(T x){this.vertexlist.append(new Vertex<T>(x));return this.vertexlist.length()-1;}public int vertexCount(){return this.vertexlist.length();}public void insertEdge(int i,int j,int weight){if(i>=0&&i<vertexCount()&&j>=0&&j<vertexCount()&&i!=j){ Edge edge=new Edge(i,j,weight);SortedSinglyLinkedList<Edge>adjlink=this.vertexlist.get(i).adjlink;Node<Edge> front=adjlink.head,p=front.next;while(p!=null&&pareTo(edge)<0){front=p;p=p.next;}if(p!=null&&pareTo(edge)==0)return;front.next=new Node<Edge>(edge,p);}}public void insertEdge(Edge edge){this.insertEdge(edge.start,edge.dest,edge.weight);}public int getNextNeighbor(int i,int j){int n=this.vertexCount();if(i>=0&&i<n&&j>=-1&&j<n&&i!=j){Node<Edge> p=this.vertexlist.get(i).adjlink.head.next;while(p!=null){if(p.data.dest>j)return p.data.dest;p=p.next;}}return -1;}public static void main(String[] args){String[] vertices={"A","B","C","D","E"};Edge edges[]={new Edge(0,1,1),new Edge(0,3,1),new Edge(1,0,1),new Edge(1,2,1),new Edge(1,3,1),new Edge(3,0,1),new Edge(3,1,1),new Edge(3,2,1),newEdge(3,4,1),new Edge(2,3,1),new Edge(2,1,1),new Edge(2,4,1),new Edge(4,2,1),new Edge(4,3,1)};AdjListGraph<String> graph=new AdjListGraph<String>(vertices,edges);System.out.println(graph.toString());for(int i=0;i<graph.vertexCount();i++){graph.DFSTraverse(i);}}}public static void main(String[] args){String[] vertices={"A","B","C","D","E"};Edge edges[]={new Edge(0,1,1),new Edge(0,3,1),new Edge(1,0,1),new Edge(1,2,1),new Edge(3,2,1),new Edge(3,4,1),new Edge(2,4,1),};AdjListGraph<String> graph=new AdjListGraph<String>(vertices,edges);System.out.println(graph.toString());for(int i=0;i<graph.vertexCount();i++){graph.DFSTraverse(i);}}测试结果粘贴如下:有向网的测试结果:无向网的测试结果:(2)广度优先遍历算法非递归算法public abstract class AbstractGraph<T> {public abstract int vertexCount();public abstract T get(int i);public abstract int getNextNeighbor(int i,int j);public void BFSTraverse(int i){boolean[] visited=new boolean[this.vertexCount()];int j=i;do{if(!visited[j]){System.out.print("{");breadthfs(j,visited);System.out.print("}");}j=(j+1)%this.vertexCount();}while(j!=i);System.out.println();}public void breadthfs(int i,boolean[] visited){System.out.print(this.get(i)+" ");visited[i]=true;SeqQueue<Integer> que=new SeqQueue<Integer>(this.vertexCount());que.enqueue(new Integer(i));while(!que.isEmply()){i=que.dequeue().intValue();int j=this.getNextNeighbor(i, -1);while(j!=-1){if(!visited[j]){System.out.print(this.get(j)+"");visited[j]=true;que.enqueue(new Integer(j));}j=this.getNextNeighbor(i, j);}}}}public static void main(String[] args){String[] vertices={"A","B","C","D","E"};Edge edges[]={new Edge(0,1,1),new Edge(0,3,1),new Edge(1,0,1),new Edge(1,2,1),new Edge(3,2,1),new Edge(3,4,1),new Edge(2,4,1),};AdjListGraph<String> graph=new AdjListGraph<String>(vertices,edges);System.out.println(graph.toString());for(int i=0;i<graph.vertexCount();i++){graph.BFSTraverse(i);}}public static void main(String[] args){String[] vertices={"A","B","C","D","E"};Edge edges[]={new Edge(0,1,1),new Edge(0,3,1),new Edge(1,0,1),new Edge(1,2,1),new Edge(1,3,1),new Edge(3,0,1),new Edge(3,1,1),new Edge(3,2,1),newEdge(3,4,1),new Edge(2,3,1),new Edge(2,1,1),new Edge(2,4,1),new Edge(4,2,1),new Edge(4,3,1)};AdjListGraph<String> graph=new AdjListGraph<String>(vertices,edges);System.out.println(graph.toString());for(int i=0;i<graph.vertexCount();i++){graph.BFSTraverse(i);}}测试结果粘贴如下:有向网的测试结果:无向网的测试结果:三、实验心得(含上机中所遇问题的解决办法,所使用到的编程技巧、创新点及编程的心得)图这一章牵涉很广,仅是上三道题,就需要线性表、单链表、队列三种存储方式。
一、实验目的1. 理解索引的概念和作用。
2. 掌握创建、删除和管理索引的方法。
3. 通过实际操作,验证索引对数据库查询性能的影响。
二、实验环境1. 操作系统:Windows 102. 数据库管理系统:MySQL 5.73. 实验数据:模拟学生信息表(包含学生ID、姓名、年龄、性别、班级ID等字段)三、实验内容1. 创建索引2. 查询性能测试3. 删除索引4. 索引重建与优化四、实验步骤1. 创建索引(1)创建学生信息表```sqlCREATE TABLE student (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(20),age INT,gender ENUM('男', '女'),class_id INT);```(2)创建索引```sql-- 创建学生ID索引CREATE INDEX idx_student_id ON student(id);-- 创建学生姓名索引CREATE INDEX idx_student_name ON student(name);-- 创建学生年龄索引CREATE INDEX idx_student_age ON student(age);-- 创建学生性别索引CREATE INDEX idx_student_gender ON student(gender);-- 创建学生班级ID索引CREATE INDEX idx_student_class_id ON student(class_id); ```2. 查询性能测试(1)测试创建索引前的查询性能```sql-- 查询学生信息表中所有学生信息SELECT FROM student;-- 查询年龄大于18岁的学生信息SELECT FROM student WHERE age > 18;-- 查询班级ID为1的学生信息SELECT FROM student WHERE class_id = 1;```(2)测试创建索引后的查询性能```sql-- 查询学生信息表中所有学生信息SELECT FROM student;-- 查询年龄大于18岁的学生信息SELECT FROM student WHERE age > 18;-- 查询班级ID为1的学生信息SELECT FROM student WHERE class_id = 1;```3. 删除索引```sql-- 删除学生ID索引DROP INDEX idx_student_id ON student;-- 删除学生姓名索引DROP INDEX idx_student_name ON student;-- 删除学生年龄索引DROP INDEX idx_student_age ON student;-- 删除学生性别索引DROP INDEX idx_student_gender ON student; -- 删除学生班级ID索引DROP INDEX idx_student_class_id ON student;```4. 索引重建与优化(1)重建索引```sql-- 重建学生ID索引ALTER TABLE student DROP INDEX idx_student_id;ALTER TABLE student ADD INDEX idx_student_id(id);-- 重建学生姓名索引ALTER TABLE student DROP INDEX idx_student_name;ALTER TABLE student ADD INDEX idx_student_name(name);-- 重建学生年龄索引ALTER TABLE student DROP INDEX idx_student_age;ALTER TABLE student ADD INDEX idx_student_age(age);-- 重建学生性别索引ALTER TABLE student DROP INDEX idx_student_gender;ALTER TABLE student ADD INDEX idx_student_gender(gender);-- 重建学生班级ID索引ALTER TABLE student DROP INDEX idx_student_class_id;ALTER TABLE student ADD INDEX idx_student_class_id(class_id); ```(2)优化索引```sql-- 优化学生ID索引OPTIMIZE TABLE student;```五、实验结果与分析1. 实验结果(1)创建索引前后的查询性能对比通过实验可以发现,创建索引后,查询性能得到了显著提升。
索引实验报告学生实验报告课程名称商务数据库应用实验成绩实验项目名称索引批阅教师实验者学号专业班级实验日期2012-12-6一、实验预习报告(实验目的、内容,主要设备、仪器,基本原理、实验步骤等)(可加页)实验目的1)理解索引的概念和分类。
2)掌握在对象资源管理器中创建和管理索引。
3)掌握T-SQL语句创建和管理索引。
实验内容1)在对象资源管理器中创建、修改和删除索引。
2)在对象资源管理器使用索引。
3)利用T-SQL语句创建、修改和删除索引。
4)利用T-SQL语句使用索引。
二、实验过程记录(包括实验过程、数据记录、实验现象等)(可加页)1.启动SQLServerManagementStudio,在对象资源管理器中,利用图形化的方法创建下列索引:对学生信息表stu_info的name列创建非聚集索引idx_name。
对学生成绩表stu_grade的stu_id、couse_id列创建复合索引idx_stu_couse_id。
2.启动SQLServerManagementStudio,在对象资源管理器中,利用图形化的方法对索引idx_name进行修改,使其成为唯一索引。
3.启动SQLServerManagementStudio,在对象资源管理器中,利用图形化的方法删除索引idx_stu_couse_id。
4.启动SQLServerManagementStudio,在SQL编辑器中,利用T-SQL语句CREATEINDEX命令创建下列索引:对课程信息表couse_info的couse_name列创建非聚集索引idx_couse_name。
对学生成绩表stu_grade的stu_id、couse_id列创建复合索引idx_stu_couse_id。
5.启动SQLServerManagementStudio,在SQL编辑器中,利用T-SQL语句对索引idx_couse_name进行修改,使其成为唯一索引。
6.启动SQLServerManagementStudio,在SQL编辑器中,利用系统存储过程sp_helpindex查看索引idx_couse_name。
实验六索引与视图
(实验报告)
一、目的
1.掌握索引和视图的基本概念和功能。
2.掌握利用SQL Server Management Studio和Transact-SQL语句创建、维护索引的方法。
3.掌握SQL Server Management Studio和Transact-SQL语句创建、修改视图的方法。
4.掌握通过视图查看和修改基本表中的数据。
二、实验内容
(1)完成下列操作
1.利用SQL Server Management Studio为student表的classno字段创建非聚集、非唯一索引UC_classno。
2.利用Transact-SQL语句在teaching数据库中teacher表的tname列上创建非聚集唯一索引UQ_tname。
若该索引已存在,则删除后重建。
3.利用SQL Server Management Studio查看索引被查询优化器使用的情况。
4.利用Transact-SQL语句修改UQ_tname的索引属性,当执行多行插入操作时出现重复键值,则忽略该记录,且设置填充因子为80%。
5.利用SQL Server Management Studio在teaching数据库中创建视图v_course_avg,查询没门课程的课程号、课程名及选修该课程的学生的期末平均成绩平均分,并且按平均分降序排列。
6.利用Transact-SQL语句,在teaching数据库中创建视图v_age,查询年龄在18岁及以上的学生的学号、姓名、性别、出生日期和班级编号。
若该视图已存在,则删除后重建。
7.利用Transact-SQL语句,在teaching数据库中创建视图v_teacher_course,包含教师编号、教师姓名、职称、课程号、课程名和任课班级。
8.利用Transact-SQL语句修改v_age的视图定义,添加WITH CHECK OPTION选项。
9.通过视图v_teacher_course将教师编号为‘t05017’的教师的职称更
改为‘副教授’。
10.利用Transact-SQL语句删除创建的索引和视图。
(2)完成实验报告
三、实验环境
SQL2005。
四、实验原理
1.了解SQL2005的基本操作和运行环境。
2.掌握SQL基本语法。
五、实验报告
将实验内容作为实验报告完成。
六、实验小结。