整理自博主本科《数据库系统原理》专业课自己完成的实验报告,以便各位学习数据库系统概论的小伙伴们参考、学习。
专业课本:
————
本次实验使用到的图形化工具:Heidisql
目录
1、熟练使用SQL语句创建表和修改表,巩固数据定义语句。
2、通过SQL语句验证数据库的三类完整性约束,尤其是参照完整性,加深对于完整性的理解。
3、初步掌握数据更新语句:插入,删除和更新记录。
创建一个名为TEST数据库,要求如下:
(下面三个表中属性的数据类型需要自己设计合适的数据类型)

代码:
- #建立专业表speciality,它由专业号specno、专业名specname组成,其中专业号为主键,采用列级定义主键,专业名不能为空。
- CREATE TABLE speciality(
- specno INT PRIMARY KEY,
- specname CHAR(20) NOT NULL
- );
-
- #建立院系表department,它由院名dname、院长dean、院职工人数dnum组成。其中院名为主属性,采用表级定义主键。
- CREATE TABLE department(
- dname CHAR(20) ,
- dean CHAR(10) ,
- dnum INT ,
- PRIMARY KEY (dname)
- );
-
- #建立一个“学生”表Student,它由学号sno、姓名sname、性别ssex、年龄sage、所在院系sdname、专业spec六个属性组成。采用表级定义主键。
- CREATE TABLE student(
- sno CHAR(9),
- sname CHAR(20),
- ssex CHAR(2),
- sage SMALLINT,
- sdname CHAR(20),
- spec INT,
- PRIMARY KEY (sno)
- )


代码:
- #姓名不能为空
- ALTER TABLE student
- MODIFY COLUMN sname CHAR(20) NOT NULL;


代码:
- #性别默认为‘男’
- ALTER TABLE student
- MODIFY COLUMN ssex CHAR(2) DEFAULT '男';


代码:
- #性别取值只能为‘男’、‘女’
- ALTER TABLE student
- ADD CONSTRAINT CHECK (ssex='男'OR ssex='女');


代码:
- #学生年龄大于10、小于40
- ALTER TABLE student
- ADD CONSTRAINT CHECK (sage>10 AND sage<40);


代码:
- ALTER TABLE student
- ADD FOREIGN KEY (sdname) REFERENCES department(dname) ON DELETE CASCADE ON UPDATE NO ACTION ;

代码:
- ALTER TABLE student
- ADD FOREIGN KEY (spec) REFERENCES speciality(specno) ON DELETE SET NULL ON UPDATE CASCADE ;
(1)用SQL语句,在学生表中插入一条学号为空的记录和重复学号的记录,观察运行的情况。说明为什么。
代码:
- #实体完整性检验
- INSERT INTO student (sno) VALUES (NULL);#用SQL语句,在学生表中插入一条学号为空的记录
- INSERT INTO student (sno) VALUES (493);
- INSERT INTO student (sno) VALUES (493);#插入重复学号的记录


说明:关系模型的实体完整性用primary key定义,主码任一主属性不可为空且主码值必须唯一。定义了关系主码后,每当用户程序对基本表插入一条记录或对主码进行更新操作时,关系数据库按照实体完整性规则进行检查。若主码值不唯一,则拒绝插入或修改;若有一个主属性为空,则拒绝插入或修改。
(1)用SQL语句,在每个表中分别插入两条合法记录。
代码:
- #用户定义完整性检验
- #用SQL语句,先在每个表中分别插入两条合法记录。
- INSERT INTO speciality VALUES (1001,'软件工程');
- INSERT INTO speciality VALUES (1002,'汉语言文学');
- #在专业表中插入两条记录
-
- #department,它由院名dname、院长dean、院职工人数dnum组成。其中院名为主属性,采用表级定义主键。
- INSERT INTO department VALUES ('软件学院','张三',50);
- INSERT INTO department VALUES ('文学院','李四',25);
- #在院系表中插入两条记录
-
- #Student,它由学号sno、姓名sname、性别ssex、年龄sage、所在院系sdname、专业spec六个属性组成。采用表级定义主键
- INSERT INTO student VALUES (30001,'喜羊羊',DEFAULT,15,'软件学院',1001);
- INSERT INTO student VALUES (30002,'魔法少女小樱','女',17,'文学院',1002);

(2)用SQL语句,非法的记录来检验第4题中的用户定义完整性约束条件。
代码:
- #插入非法的记录来检验第4题中的用户定义完整性约束条件。
- INSERT INTO speciality(specname) VALUES (NULL);#令专业表专业名为空
- INSERT INTO student(ssex) VALUES ('未知');#令学生表性别为除“男”与“女”之外的“未知”
- INSERT INTO student(sage) VALUES (100);#令学生表年龄为100,不在预设范围内



(1)用SQL语句,插入:分别在三个表中插入若干条记录。在学生表中插入记录时,注意sdname要参照院系表,spec要参照专业表。
代码:
- #参照完整性检验
- #分别在三个表中插入若干条记录。在学生表中插入记录时,注意sdname要参照院系表,spec要参照专业表。
- #学生表中的所在院系sdname参照department表的dname,删除规则是级联,更新规则是拒绝;
- #学生表中的专业spec参照speciality表的specno,删除规则是设置为空,更新规则是级联.
- INSERT INTO student(sdname,spec) VALUES ('外语学院',6666);#在参照表学生表中插入的元组的sdname,spec在被参照表中不存在
(2)用SQL语句,删除和修改:删除专业表中的,被学生表参照的一个专业记录,观察学生表中发生了什么变化,为什么?
代码:
- #用SQL语句,删除和修改:删除专业表中的,被学生表参照的一个专业记录,观察学生表中发生了什么变化,为什么?
- DELETE FROM speciality WHERE specno=1001;
说明:
学生表中所有包含专业号“1001”的元组都被删除。
在参照完整性中定义了级联删除。学生表是参照表,专业表是被参照表。当删除被参照表的一个元组导致与参照表不一致时,删除参照表中所有导致不一致的元组。

(3)修改专业表中的,被学生表参照的一个专业号,观察学生表中发生了什么变化,为什么?
代码:
- #修改专业表中的,被学生表参照的一个专业号,观察学生表中发生了什么变化,为什么?
- UPDATE speciality SET specno=9999 WHERE specno=1001;
说明:
学生表中所有包含专业号“1001”的元组都被修改为“9999”。
在参照完整性中定义了级联修改。学生表是参照表,专业表是被参照表。当修改被参照表的一个元组导致与参照表不一致时,修改参照表中所有导致不一致的元组。

(4)用SQL语句,删除和修改:删除院系表中的,被学生表参照的一条记录,观察学生表中发生了什么变化,为什么?
代码:
- #删除院系表中的,被学生表参照的一条记录,观察学生表中发生了什么变化,为什么?
- DELETE FROM department WHERE dname='软件学院';
说明:
院系表中所有包含院系名“软件学院”的元组都被删除。
在参照完整性中定义了级联删除。学生表是参照表,专院系表是被参照表。当删除被参照表的一个元组导致与参照表不一致时,删除参照表中所有导致不一致的元组。

(5)修改院系表中的,被学生表参照的一条记录的院系名,观察学生表中发生了什么变化,为什么?
代码:
- #修改院系表中的,被学生表参照的一条记录的院系名,观察学生表中发生了什么变化,为什么?
- UPDATE department SET dname='历史学院' WHERE dname='文学院';

说明:定义了拒绝执行。当修改导致参照表与被参照表不一致时,不允许该操作的执行。
- CREATE DATABASE test;
- USE test;
- SELECT DATABASE();
-
- #建立专业表speciality,它由专业号specno、专业名specname组成,其中专业号为主键,采用列级定义主键,专业名不能为空。
- CREATE TABLE speciality(
- specno INT PRIMARY KEY,
- specname CHAR(20) NOT NULL
- );
-
- #建立院系表department,它由院名dname、院长dean、院职工人数dnum组成。其中院名为主属性,采用表级定义主键。
- CREATE TABLE department(
- dname CHAR(20) ,
- dean CHAR(10) ,
- dnum INT ,
- PRIMARY KEY (dname)
- );
-
- #建立一个“学生”表Student,它由学号sno、姓名sname、性别ssex、年龄sage、所在院系sdname、专业spec六个属性组成。采用表级定义主键。
- CREATE TABLE student(
- sno CHAR(9),
- sname CHAR(20),
- ssex CHAR(2),
- sage SMALLINT,
- sdname CHAR(20),
- spec INT,
- PRIMARY KEY (sno)
- )
-
- #对3题中创建的Student表,增加以下约束:
- #姓名不能为空
- ALTER TABLE student
- MODIFY COLUMN sname CHAR(20) NOT NULL;
- #性别默认为‘男’
- ALTER TABLE student
- MODIFY COLUMN ssex CHAR(2) DEFAULT '男';
- #性别取值只能为‘男’、‘女’
- ALTER TABLE student
- ADD CONSTRAINT CHECK (ssex='男'OR ssex='女');
- #学生年龄大于10、小于40
- ALTER TABLE student
- ADD CONSTRAINT CHECK (sage>10 AND sage<40);
- #学生表中的所在院系sdname参照department表的dname,删除规则是级联,更新规则是拒绝;
- #学生表中的专业spec参照speciality表的specno,删除规则是设置为空,更新规则是级联.
- ALTER TABLE student
- ADD FOREIGN KEY (sdname) REFERENCES department(dname) ON DELETE CASCADE ON UPDATE NO ACTION ;
- ALTER TABLE student
- ADD FOREIGN KEY (spec) REFERENCES speciality(specno) ON DELETE SET NULL ON UPDATE CASCADE ;
-
- ALTER TABLE student
- MODIFY COLUMN sname CHAR(20) NOT NULL ;
-
- #实体完整性检验
- INSERT INTO student (sno) VALUES (NULL);#用SQL语句,在学生表中插入一条学号为空的记录
- INSERT INTO student (sno) VALUES (493);
- INSERT INTO student (sno) VALUES (493);#插入重复学号的记录
-
- #学号sno、姓名sname、性别ssex、年龄sage、所在院系sdname、专业spec
-
- #用户定义完整性检验
- #用SQL语句,先在每个表中分别插入两条合法记录。
- INSERT INTO speciality VALUES (1001,'软件工程');
- INSERT INTO speciality VALUES (1002,'汉语言文学');
- #在专业表中插入两条记录
-
- #department,它由院名dname、院长dean、院职工人数dnum组成。其中院名为主属性,采用表级定义主键。
- INSERT INTO department VALUES ('软件学院','张三',50);
- INSERT INTO department VALUES ('文学院','李四',25);
- #在院系表中插入两条记录
-
- #Student,它由学号sno、姓名sname、性别ssex、年龄sage、所在院系sdname、专业spec六个属性组成。采用表级定义主键
- INSERT INTO student VALUES (30001,'喜羊羊',DEFAULT,15,'软件学院',1001);
- INSERT INTO student VALUES (30002,'魔法少女小樱','女',17,'文学院',1002);
-
- #插入非法的记录来检验第4题中的用户定义完整性约束条件。
- INSERT INTO speciality(specname) VALUES (NULL);#令专业表专业名为空
- INSERT INTO student(ssex) VALUES ('未知');#令学生表性别为除“男”与“女”之外的“未知”
- INSERT INTO student(sage) VALUES (100);#令学生表年龄为100,不在预设范围内
-
- #参照完整性检验
- #分别在三个表中插入若干条记录。在学生表中插入记录时,注意sdname要参照院系表,spec要参照专业表。
- #学生表中的所在院系sdname参照department表的dname,删除规则是级联,更新规则是拒绝;
- #学生表中的专业spec参照speciality表的specno,删除规则是设置为空,更新规则是级联.
- INSERT INTO student(sdname,spec) VALUES ('外语学院',6666);#在参照表学生表中插入的元组的sdname,spec在被参照表中不存在
-
- #用SQL语句,删除和修改:删除专业表中的,被学生表参照的一个专业记录,观察学生表中发生了什么变化,为什么?
- DELETE FROM speciality WHERE specno=1001;
- #修改专业表中的,被学生表参照的一个专业号,观察学生表中发生了什么变化,为什么?
- UPDATE speciality SET specno=9999 WHERE specno=1001;
-
- #删除院系表中的,被学生表参照的一条记录,观察学生表中发生了什么变化,为什么?
- DELETE FROM department WHERE dname='软件学院';
-
- #修改院系表中的,被学生表参照的一条记录的院系名,观察学生表中发生了什么变化,为什么?
- UPDATE department SET dname='历史学院' WHERE dname='文学院';
使用实验三中的Student、Course、SC表。
基本建表代码:
- CREATE DATABASE educ;
- USE educ;
- SELECT DATABASE();
-
- CREATE TABLE Student(
- Sno CHAR(9) PRIMARY KEY ,
- Sname CHAR(20) UNIQUE ,
- Ssex CHAR(2) DEFAULT'男',
- Sage SMALLINT,
- Sdept CHAR(20)
- );
-
- CREATE TABLE Course(
- Cno CHAR(4) NOT NULL 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(Sno,Cno),
- FOREIGN KEY (Sno) REFERENCES Student(Sno),
- FOREIGN KEY (Cno) REFERENCES Course(Cno)
- );
实验结果的运用:

