建立索引
语句格式:
CREATE [UNIQUE][CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>]]...)
需要注意的是:ASC为升序(默认情况下为ASC),DESC为降序
【例 3.13】为学生-课程数据库中的Student,Course,SC三个表建立索引。Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引
//为Student表按学号升序建唯一索引,默认为升序
CREATE UNIQUE INDEX Stusno ON Student(Sno);
//为Course表按课程号升序建唯一索引,默认为升序
CREATE UNIQUE INDEX Coucno ON Course(Cno);
//SC表按学号升序和课程表降序建唯一索引
CREATE UNIQUE INDEX SCno ON SC(SNO ASC,Cno DESC);
建立好的索引就是这样啦!!!
我这里在操作的过程中出现了一点点小问题
emmm ,这是咋回事呢?? 出现这种问题的小伙伴们不要慌,这样的原因是:我们在之前已经创建了这样索引,这段代码已经是第n次执行啦!所以,我们的索引已经创建好了!!
🤔:在第三个索引中,Sno升序排列与Cno降序排列,二者有没有冲突?
这里是说Sno升序排列正好是Cno降序排列吗???不是的!
这里建立的索引是先按照学号升序排序,在学号相同的情况下,再按照课程号降序进行排列(这样解释就很清楚啦!)
修改索引
ALERT INDEX <旧索引名> RENAME TO <新索引名>
【例 3.14】将SC表的SCno索引名改为SCSno
ALERT INDEX SCno RENAME TO SCSno;
运行代码时出现了问题,最后上网查资料,没找到合适答案!在老师的帮助下,解决了问题!这里是参考的某位好心同学的博客中的某个链接,这里直接附上原链接🗝
EXEC sp_rename 'SC.SCno', 'SCSno', 'index'
删除索引
删除索引时,系统会从数据字典中删去有关该索引的描述。
[例3.15] 删除Student表的Stusname索引
DROP INDEX Stusname;
但是使用这条语句,还是会报错!!这里必须添加表名,才能正常执行!(个人理解:可能在建立索引的时候,不同表的索引名可能一样,所以光写索引名可能并不能找到,要加上表名才能找到)
DROP INDEX Student.Stusname
插入元组
语句格式:
INSERT
INTO <表名>[(<属性名1>[,<属性名2>...)]
VALUES(<常量1>[,<常量2>]...);
)]
功能:将新元组插入指定表中
【例 3.69】将一个新学生元组(学号:201215128;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中
INSERT
INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES('201215129','陈冬','男','IS',18);
【例 3.70】将学生张成民的信息插入到Student表中。
(INTO 子句不写属性名的情况)
INSERT
INTO Student
VALUES('2012151126','张成民','男',18,'CS');
在不写属性名的情况下,VALUES的值必须和建表时的属性名相对应!!
【例 3.71】插入一条选课记录( ‘200215128’,'1 ')
INSERT
INTO SC(Sno,Cno)
VALUES('201215128','1')
关系数据库管理系统将在新插入记录的Grade列上自动地赋空值。
数据查询
语句格式:
SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]...
FROM <表名或视图名>[,<表名或视图名>]...|(SELECT语句)
[AS]<别名>
[WHERE <条件表达式>]
[GROUP BY <列名1>[HAVING]<条件表达式>]]
[GROUP BY <列名1>[ASC|DESC]];
【例 3.16】查询全体学生的学号与姓名。
SELECT Sno,Sname
FROM Student
【例 3.17】 查询全体学生的姓名、学号、所在系
SELECT Sno,Sname,Sdept
FROM Student
【例 3.18】查询全体学生的详细记录
SELECT Sno,Sname,Sdept,Sage,Ssex
FROM Student
或者,查询详细的,写这么属性名觉得太麻烦了,直接用 * 代替他们即可!(这样输入速度就很快啦)
SELECT *
FROM Student
【例 3.19】查全体学生的姓名及其出生年份。
SELECT Sname,2020-Sage
FROM Student;
因为数据库里存储的是年龄,所以要用当前的年份减去年龄,但是在数据库里还是存储出生年月比较好,不会改变!!
【例 3.20】查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名。
SELECT Sname,'Year of Birth:',2020-Sage,LOWER(Sdept)
FROM Student;
LOWER()相当于C语言中的函数,可以将所有字母转变为小写
【例 3.21】查询选修了课程的学生学号。
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 Grage < 60;
DISTINCT 的作用就相当于对于学号相同的学号,只显示其中一个
【例 3.25】查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄
DELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
BETWEEN … AND …包括边界值
【例 3.26】查询年龄不在20~23岁之间的学生姓名、系别和年龄
DELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
NOT BETWEEN … AND …表示否定
到这里,这次作业就算结束啦!!我用了大概三个小时,上课听老师讲完,再做一遍确实会加深记忆和理解,自己做的过程中也会遇到不少问题,加深了对知识的理解!!