数据库实验二
使用商用数据库 SQL Server 或 MySQL 实现教务系统的数据库设计
实验要求:
-
学习使用商用数据库SQL Server 或MySQL
-
基于实验一的概念模型和逻辑结构,实现数据库分析设计
-
理解和掌握关系数据库存取技术,关系数据操作,完整性约束机制
实验内容:
- 创建教务系统各数据库表,包括:Student, Course, SC等。设置主键和外键,以及用户定义的完整性约束条件。
- 输入数据,体验实体完整性,参照完整性,以及用户定义的完整性约束。
- 简单的数据浏览,数据增删改。
实验过程:
1. 安装 SQL Server 2016
2. 安装Microsoft SQL Server Management Studio (SSMS)
3. 创建数据库和表
选择数据库,右键新建查询,输入下面语句:
CREATE TABLE Department --系表
(
Dno CHAR(20) PRIMARY KEY,
Dname CHAR(20) UNIQUE,
Dean CHAR(10),
Classnum INT,
Crnum INT,
Adderss CHAR(20)
);
CREATE TABLE Classroom --教研室表
(
Crno CHAR(20) PRIMARY KEY,
Crname CHAR(10) UNIQUE,
Dno CHAR(20),
Adderss CHAR(20),
FOREIGN KEY (Dno) REFERENCES Department (Dno)
);
CREATE TABLE Class --班级表
(
Classno CHAR(20) PRIMARY KEY,
Classname CHAR(10) UNIQUE,
Dno CHAR(20),
Stunum INT,
FOREIGN KEY (Dno) REFERENCES Department (Dno)
);
CREATE TABLE Teacher --教员表
(
Tno CHAR(10) PRIMARY KEY,
Tname CHAR(10) UNIQUE,
Title CHAR(10),
TSex CHAR(4),
Crno CHAR(20),
FOREIGN KEY (Crno) REFERENCES Classroom (Crno)
);
CREATE TABLE Student --学生表
(
Sno CHAR(10) PRIMARY KEY,
Sname CHAR(10) UNIQUE,
Ssex CHAR(4),
Classno CHAR(20),
Tno CHAR(10),
FOREIGN KEY (Classno) REFERENCES Class (Classno),
FOREIGN KEY (Tno) REFERENCES Teacher (Tno)
);
CREATE TABLE Course --课程表
(
Cno CHAR(10) PRIMARY KEY,
Cname CHAR(20) UNIQUE,
Credit INT,
Chour INT
);
CREATE TABLE SC --选修表�ޱ�
(
Sno CHAR(10),
Cno CHAR(10),
Mark INT,
PRIMARY KEY(Sno,Cno),
FOREIGN KEY (Sno) REFERENCES Student (Sno),
FOREIGN KEY (Cno) REFERENCES Course (Cno)
);
4. 直接使用SSMS编辑各表数据
选中某一表,右键选择编辑前200行
系表:
班级表:
教研室表:
学生表:
选修表:
课程表:
5. 导出数据库数据字典
选择数据库,右键新建查询,语句如下:
SELECT
(case when a.colorder=1 then d.name else '' end)表名,
a. colorder 字段序号,
a.name 字段名,
(case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end) 标识,
(case when (SELECT count(*)
FROM sysobjects
WHERE (name in
(SELECT name
FROM sysindexes
WHERE (id = a.id) AND (indid in
(SELECT indid
FROM sysindexkeys
WHERE (id = a.id) AND (colid in
(SELECT colid
FROM syscolumns
WHERE (id = a.id) AND (name = a.name))))))) AND
(xtype = 'PK'))>0 then '√' else '' end) 主键,
b.name 类型,
a.length 占用字节数,
COLUMNPROPERTY(a.id,a.name,'PRECISION') as 长度,
isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as 小数位数,
(case when a.isnullable=1 then '√'else '' end) 允许空,
isnull(e.text,'') 默认值,
isnull(g.[value],'') AS 字段说明
FROM syscolumns a left join systypes b
on a.xtype=b.xusertype
inner join sysobjects d
on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
left join syscomments e
on a.cdefault=e.id
left join sys.extended_properties g
on a.id=g.major_id AND a.colid = g.major_id
order by a.id,a.colorder
得到结果:
数据关系图如图所示:
6. SQL语句编辑数据:
- 添加:
INSERT INTO Department values ('D4','张建','海技系','14','12','松岭路')
新增了一条记录:
- 删除:
DELETE FROM SC WHERE Sno = 'S1'
此处记录(‘S1’,’C1’,’79’)被删除
- 修改:
UPDATE Student set Ssex = '男' WHERE Sno = 'S1'
Sno为S1的记录性别修改为了‘男’
心得总结:
刚开始在使用SSMS编辑数据的时候,总忘记各表中的关系,学生表还没定义就编辑选修表,报了不少次错;由此看来,整体设计很重要,像编程之前的流程图一样,在建立各表之前也应该事先理清楚这些表之间的关系,这样数据库的思路更清晰。
经过这次实验,感觉SQL语句确实非常方便,而且操作很简单,很好上手,效率也比较高。