【例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);
至于调用存储过程的方法,破坏了操作封装性,容易出现问题,个人不推荐。
有需要可以自行阅读:另一种方法
【例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');