一、实验题目
已有条件:Kingbase数据库软件包。
要求:请安装Kingbase数据库软件,在数据库软件中创建一个自己名字的模式,在该模式下创建学生关系数据表、课程表、选课表。
插入一些数据,尝试查询、更新、删除
二、相关原理与知识
(完成实验所用到的相关原理与知识)
1.定义模式
在SQL语句中模式定义语句如下:
CREATE SCHEMA <模式名>AUTHORIZATION<用户名>;
2.定义基本表
CREATE TABLE<表名> (<列名><数据类型> [列级完整性约束条件]
[,<列名><数据类型> [列级完整性约束条件]]
…
[,<表级完整性约束条件>]);
SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC | DESC ] ] ;
注:
SELECT子句:指定要显示的属性列;
FROM子句:指定查询对象(基本表或视图);
WHERE子句:指定查询条件;
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中使用集函数;
HAVING短语:筛选出只有满足指定条件的组;
ORDER BY子句:对查询结果按指定列值升序或降序排序。
5.插入数据
插入单个元组--新元组插入指定表中。
语句格式:
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>] … ) ;
注:
INTO子句
指定要插入数据的表名及属性列
属性列的顺序可与表定义中的顺序不一致
没有指定属性列:表示要插入的是一条完整的元组,且属性列属性与表定义中的顺序一致
指定部分属性列:插入的元组在其余属性列上取空值
VALUES子句
提供的值的个数和值的类型必须与INTO子句匹配
6.修改数据:
语句格式:
UPDATE <表名>
SET <列名>=<表达式>[, <列名>=<表达式>]…
[WHERE <条件>];
功能:
修改指定表中满足WHERE子句条件的元组。
注:
SET子句--指定修改方式,要修改的列和修改后取值
WHERE子句
指定要修改的元组
缺省表示要修改表中的所有元组
7.删除数据
语句格式:
DELETE
FROM <表名>
[WHERE <条件>] ;
功能:
删除指定表中满足WHERE子句条件的元组
注:
WHERE子句
指定要删除的元组
缺省表示要修改表中的所有元组
7.设置搜索模式路径
SET search_path TO “S-T”;
SET search_path TO PUBLIC;
SET search_path TO “S-T”,PUBLIC;
三、实验过程
(清晰展示实际操作过程,相关截图及解释)
1.建立以@@@命名模式;
2.建立如下三个表:
学生表:Student(Sno,Sname,Ssex,Sage,Sdept),用来存放学号、学生姓名、性别、年龄和所在院系,其中Sno为主码;
课程表:Course(Cno,Cname,Cpno,Ccredit),存放课程编号、课程名称、先修课程和学分,其中Cno为主码;
学生选课表:SC(Sno,Cno,Grade),存放学号、课程号和该名学生在此课程得分,其中主码由两个属性(Sno和Cno)组成,必须作为表级完整性进行定义,另外,注意Sno和Cno为外码,参照表分别为STUDENT和COURSE。
建立模式和表后可以得到如下目录:
3.数据插入:
然后向STUDENT表、COURSE表和SC表中添加学生信息。
发挥想象,插入数据后的表如下:
4.数据查询:
接下来查询STUDENT表中的姓名与性别。
使用SELECT语句对STUDENT表进行查询姓名与性别。
5.数据修改:
修改COURSE 表中的数据,将课程号为05的信安数基的学分改为3。运行代码后,打开COURSE表,此时CCREDIT已修改为3,如图所示。
6.数据删除:
将SC表中学号为201803006的同学,且课程代码为02,得分为92的这条数据删除。
打开表SC可以发现,此时201803006同学在02课程中得分为92的数据已经删除。(左图为原来的SC表,右图为运行删除代码后的SC表)
四、实验结果与分析
用SQL语句建成了简单的学生选课信息系统,由三个表组成,分别为STUDENT表(用来存放学生信息,包括学号、姓名、性别、年龄、所在系),COURSE表(用来存放课程信息,内含课程号、课程名、先修课程、学分),以及SC表(由学号、课程号以及成绩组成),值得注意的是,SC表中的学号和课程号为外码,与STUDENT表和COURSE表相关。
有了表的框架之后,发挥想象,向表中插入数据。运用书中INSERT相关内容,逐个向表中插入数据。然后对表尝试查询、更新和删除操作。查询操作后,数据库会直接给出查询所得的内容。修改操作后,系统提示语句运行正确或错误,若成功,刷新表后,即可发现数据信息修改完毕,否则依据错误提示进行修改。删除操作与修改操作相似。
五、问题总结
(记录所遇到的问题及解决方法)
1.
遇到问题:在建立表的时候找不到我所定义的名为@@@的SHAME
解决方法:在定义表之前,加上一句SET search_path TO @@@;
2.
遇到问题:SQL语句中所有的标点符号均为英文字符,在写的过程中混入了中文字符,因无法识别导致运行失败。
解决方法:将中文字符改为英文字符。
六、源代码
(源程序)
建立模式:
CREATE SCHEMA @@@
建立STUDENT表:
SET search_ path TO @@@;
CREATE TABLE Student
( Sno CHAR(9) PRIMARY KEY ,
Sname CHAR(20) UNIQUE ,
Ssex CHAR(2) ,
Sage SMALLINT ,
Sdept CHAR(20)
) ;
建立COURSE表:
SET search_ path TO @@@;
CREATE TABLE Course
(Cno CHAR(4) PRIMARY KEY,
Cname CHAR(40) NOT NULL,
Cpno CHAR(4),
Ccredit SMALLINT,
);
建立SC表:
SET search_ path TO @@@;
CREATE TABLE SC
(Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY (Sno,Cno),
/* 主码由两个属性构成,必须作为表级完整性进行定义*/
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/* 表级完整性约束条件,Sno是外码,被参照表是Student */
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/* 表级完整性约束条件, Cno是外码,被参照表是Course*/
);
插入数据(部分代码):
INSERT INTO "@@@"."SC"
("201801001","04","94" )
VALUES
('CHAR (9)','CHAR (4)','SMALLINT' );
查询STUDENT表中的姓名与性别:
SELECT "SNAME","SSEX"
FROM "@@@"."STUDENT";
更新COURSE表中的数据:
UPDATE "@@@"."COURSE"
SET "CCREDIT"='3'
WHERE "CNO"='05';
删除SC中的数据:
DELETE "@@@."SC"
WHERE Sno='201803006' AND Cno='02' AND Grade='92' ;