1.建立索引 CREATE INDEX
语句:
CREATE [UNIQUE][CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>] [,<列名>[<次序>]],...);
解释:
- 次序分为 ASC → 升序,DESC → 降序。默认的情况下是ASC升序。
- UNIQUE 表示每个索引值对应唯一数据记录。
- CLUSTER 表示聚簇索引。
【例3.13】
CREATE UNIQUE INDEX Stusno ON Student(Sno);
/*按学号升序建立学生表的索引*/
CREATE UNIQUE INDEX Coucno ON Course(Cno);
/*按课程号升序建立课程表的索引*/
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
最后一行,建立选课表的索引,不是指同时既按学号的升序,也按课程号的降序,如果该表没有严格按照这种情况排列,那么这样看上去是矛盾的。这里建立索引的次序表示先按学号升序排列,如果学号取值相同,就进行第二个选项,也就是再按照课程号的降序排列。(学号不是这里的主码,(学号,课程号)才是,所以最好有可能相等)。
创建好的索引如下:(只展示一个)
2.修改索引 ALTER INDEX
语句:
ALTER INDEX <旧索引名> RENAME TO <新索引名>;
【例3.14】
ALTER INDEX SCno RENAME TO SCSno;
在SQL上运行会出现错误
ERROR:Incorrect syntax near ‘RENAME’.
百度一下:
(该图片截自百度知道)
- ‘object_name’表示旧索引名,格式为表名.旧索引名(注意一定要加表名做限定,不然会出错)
- ‘new_name’表示对象的新名称
- 'object_type’指更改对象类型,更改索引,就是index。
以上语句可简化为:
EXEC sp_rename '表名.旧索引名','新索引名','index'
--EXEC是EXECUTE(执行)的缩写,表示执行一个存储过程。
语句:
EXEC sp_rename 'SCno','SCSno','index';
索引名更改成功↓
另一种修改索引名的方式就是删掉重建。
DROP INDEX SC.SCno;
CREATE UNIQUE INDEX SCSno ON SC(Sno ASC,Cno DESC);
注意!这里删除索引,一定要指明是哪个表下的,不然会出现错误↓
Must specify the table name and index name for the DROP INDEX statement.
3.删除索引 DROP INDEX
语句:
DROP INDEX <表名.索引名>;
【例3.15】删除Student的Stusname索引
先创立Student的Stusname索引:
CREATE UNIQUE INDEX Stusname ON Student(Sname);
删除:
DROP INDEX Student.Stusname;
emmm…不知道是不是我的问题,用课本上的方法做,总是失败。这里必须添加表名,才可通过命令。
4.插入数据 INSERT
语句:
INSERT INTO <表名>[<属性列1>,...]
VALUES(<常量1>,...);
INTO后面加表名,属性列名可以与表中属性列排列顺序不一致,如【例3.69】,但VALUES后跟的值必须与所给属性列相对应,也可以省去,如【例3.70】,但省去后,VALUES后面跟的元组值必须与表中顺序完全一致。
【例3.69】
INSERT INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES('201215128','陈冬','男','IS',18);
表中的顺序是这样的↓
这里添加的顺序不一致,但是上下要相互对应。
【例3.70】
(INTO子句不写明属性名的情况)
INSERT INTO Student VALUES ('201215126','张老三','男',18,'CS');
没有写明属性名,按表中属性列的顺序。
【例】向课程表Course中插入信息。
INSERT INTO Course(Cno,Cname,Cpno,Ccredit)
VALUES('1','数据库','5',4);
--会出现错误,改为下述语句
INSERT INTO Course(Cno,Cname,Cpno,Ccredit)
VALUES('1','数据库',NULL,4);
这里因为是插入课程表的第一条记录,先行课Cpno是Cno的外码,根据参照完整性,Cpno只能取空或者Cno的值,所以这里Cpno取5错,为了防止这种错误,录入数据时将Cpno都置为空,而后再做修改。
【例3.71】插入一条选课记录(‘200215128’,‘1’)
INSERT INTO SC(Sno,Cno)
VALUES('200215128','1');
--或者
INSERT INTO SC
VALUES('200215128','1',NULL);
没有写的属性列,RDBMS会自动为他赋值为空。
5.SELECT查询(部分)
该部分主要写了关于SELECT…FROM…(WHERE语句)的使用。
语句:
SELECT[ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]...
FROM <表名或视图名>[,<表名或视图名>]...|(SELECT语句)[AS]<别名>
[WHERE<条件表达式>]
1.查找指定列—>相当于关系代数中的投影
【例3.16】查询全体学生的学号和姓名
SELECT Sno,Sname
FROM Student;
结果如下:
【例3.17】查询全体学生的姓名、学号、所在系
SELECT Sname,Sno,Sdept
FROM Student;
2.查询全部列使用 *
【例3.18】
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
--等价于
SELECT *
FROM Student;
3.SELECT子句的<目标表达式>不仅可以是属性列,还可以是表达式。即可以查询经过计算的结果值。
【例3.19】查全体学生的姓名及出生年份。
SELECT Sname,2020-Sage
FROM Student;
结果:
可以出现计算结果值,但是没有列名。
【例3.20】
SELECT Sname,'Year of Birth',2020-Sage,LOWER(Sdept)
--'Year of Birth'纯用来显示,增强可读性
--LOWER(Sdept),LOWER是变成小写字母的函数
FROM Student;
4.可以使用列别名改变查询结果的列标题。
【例】
SELECT Sname NAME,'Year of Birth' BIRTH,2020-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student;
列别名,直接跟在目标表达式后面用空格分开。
5.使用DISTINCT消除重复的元组(行)。
DISTINCT 可以消除重复的元组,ALL表示显示全部,缺省值为ALL。
【例3.21】查询选修了课程的学生学号。
SELECT Sno FROM SC;
--等价于
SELECT ALL Sno FROM SC;
--消除重复行
SELECT DISTINCT Sno FROM SC;
采用ALL或缺省:
采用DISTINCT:
6.WHERE语句可以加限制条件,以查询满足条件的元组。
①比较大小——比较运算符
【例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;
②确定范围——BETWEEN…AND…,NOT BETWEEN…AND…
【例3.25】查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
【例3.26】查询年龄不在20~23岁之间的学生的姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
③确定集合——IN , NOT IN (集合)
【例3.27】查询系别CS,MA的学生姓名和性别
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ('CS','MA');
【例3.28】查询不在CS,MA系别的学生姓名和性别
SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN('CS','MA');
———————————————————————————
【小体会】
这次的作业难度自我感觉不是很大,但是写完这次作业我还是用了将近三个小时,我是分两次完成的,感觉压力没有很大,甚至写到最后SELECT时感觉还蛮有趣的,喜欢敲键盘的感jio,而且没有那么多错误。以后还是要多多提高效率,缩短时间。虽然老师说截图省去,但做了感觉不截很不舒服的感觉,放在博客里,写完了还蛮有自豪感的~再接再厉!