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

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');
发布了5 篇原创文章 · 获赞 5 · 访问量 2465

猜你喜欢

转载自blog.csdn.net/jiesfriend/article/details/104793956