数据库原理——INDEX / INSERT / SELECT练习

Miki ·
更新时间:2024-11-11
· 883 次阅读

INDEX

【例3.13】为学生—课程数据库中的Student、Course和SC三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。

索引建立时可利用关键字修饰,asc代表升序,desc代表降序,未加修饰时默认为升序。

CREATE UNIQUE INDEX Stusno ON Student(Sno);

在Sudent表中按Sno升序建立名为Stunsno的索引。

CREATE UNIQUE INDEX Coucno ON Course(Cno);

在Course表中按Cno升序建立名为Coucno的索引。

CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);

在SC表中按Sno升序,Cno降序建立名为SCno的索引。
此时建立索引的依据多于一个,先按第一个建立索引,若建立后有排序相同的部分,那么同序部分按照第二个建立索引。
【例3.15】删除Student表的Stusname索引。(由于解决3.14中的一个错误需要使用删除语句,所以先对3.15进行说明)

DROP INDEX Stusno;

这条语句有错误(不得不吐槽一下错误真多(╯‵□′)╯︵┻━┻)
从上面建立索引的过程就可以得知,索引的操作要指明所在的表,删除操作也是同样的道理。
修改为

DROP INDEX Stusno on Student;

【例3.14】将SC表的SCno索引名改为SCSno。

ALTER INDEX SCno RENAME TO SCSno;

这条语句的执行会出现语法错误,ALTER语句不能用于修改索引名。
解决方法:可以利用下面的语句删除原有索引后,再建立新的索引

DROP INDEX SCno ON SC; CREATE UNIQUE INDEX SCSno ON SC(Sno ASC,Cno DESC);

至于调用存储过程的方法,破坏了操作封装性,容易出现问题,个人不推荐。
有需要可以自行阅读:另一种方法

INSERT

【例3.69】将一个新学生元组(学号:201215128,姓名:陈冬,性别:男,所在系:IS,年龄:18岁)插入到Student表中。

INSERT INTO Student (Sno,Sname,Ssex,Sdept,Sage) VALUES ('201215128','陈冬','男','IS',18);

数据录入的语句,会和下一个例子一起说明
【例3.70】将学生张成民的信息插入到Student表中。

INSERT INTO Student VALUES ('201215126','张成民','男',18,'CS');

同样是数据录入,但是这一次的语句中没有像上一个指定各属性名。
若指定了属性名,则需要数据部分的顺序与属性名一致;若没有指定属性名,则数据顺序要和默认(建表时)顺序一致,但这种情况必须给出所有数据,会引发又一个问题。
根据参照完整性规则,外键要么为空,要么源自于其引用的主码。
在录入时,若对应的主码还未录入,全属性数据录入会出现问题。
在指定属性名时,可以通过省略外键部分来规避。
未指定属性名时,可以先录入null,之后根据被参照项修改。
【例3.71】插入一条选课记录(‘201215128’,‘1’)。

INSERT INTO SC(Sno,Cno) VALUES ('201215128 ','1');

关系数据库管理系统将在新插入记录的Grade列上自动地赋空值。
或者:

INSERT INTO SC VALUES (' 201215128 ',' 1 ',NULL);

因为没有指出SC的属性名,在Grade列上要明确给出空值。

SELECT

【例3.16】查询全体学生的学号与姓名。

SELECT Sno,Sname FROM Student;

【例3.17】查询全体学生的姓名、学号、所在系。

SELECT Sname,Sno,Sdept FROM Student;

中各个列的先后顺序可以与表中的顺序不一致。
【例3.18】查询全体学生的详细记录。

SELECT * FROM Student;

等价于

SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student;

【例3.19】查询全体学生的姓名及其出生年份。

SELECT Sname,2014-Sage/*查询结果的第2列是一个算术表达式*/ FROM Student;

不仅可以是算术表达式,还可以是字符串常量、函数等。
【例3.20】查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名。

SELECT Sname,'Year of Birth: ',2014-Sage,LOWER(Sdept) FROM Student;

用户可以通过指定别名来改变查询结果的列标题,这对于含算术表达式、常量、函数名的目标列表达式尤为有用。
【例3.21】查询选修了课程的学生学号。

SELECT Sno FROM SC;

如果想去掉结果表中的重复行,必须指定DISTINCT:

SELECT DISTINCT Sno FROM SC;

如果没有指定DISTINCT关键词,则默认为ALL,即保留结果表中取值重复的行。

SELECT Sno FROM SC;

等价于

SELECT ALL Sno FROM SC;

【例3.22】查询计算机科学系全体学生的名单。

SELECT Sname FROM Student WHERE Sdept='CS';

【例3.23】查询所有年龄在20岁下的学生姓名及其年龄。

SELECT Sname,Sage FROM Student WHERE Sage < 20;

【例3.24】查询考试成绩不及格的学生的学号。

SELECT DISTINCT Sno FROM SC WHERE Grade<60;

这里使用了DISTINCT短语,当一个学生有多门课程不及格,他的学号也只列一次。
【例3.25】查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。

SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23;

BETWEEN后是范围下限(即低值),AND后是范围的上限(即高值)。
【例2.26】查询年龄不在20~23岁之间的学生的姓名、系别和年龄。

SELECT Sname, Sdept, Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;

【例2.27】查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。

SELECT Sname, Ssex FROM Student WHERE Sdept IN ('CS','MA','IS');

【例3.28】查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别。

SELECT Sname, Ssex FROM Student WHERE Sdept NOT IN ('IS','MA','CS');
作者:废卡一张



INDEX INSERT 数据 数据库原理 select 数据库

需要 登录 后方可回复, 如果你还没有账号请 注册新账号