题目有点儿乱,先来总结吧:
- 关于索引的:
- 在修改索引时候遇到了错误:将alter index <旧索引名> rename to <新索引名>改为:exec sp_rename ‘表名.旧索引名’ , ‘新索引名’ , ‘index’ 就好。
- 在删除索引时候没有指定 表名 而出错。正确写法:drop index 索引名 on 表名;
- 经常多次进行数据上的操作的表,个人建议不要建立太多的索引;
- 但是在经常进行搜索查询的列上创建索引的话,可以加快搜索的速度;
- 索引会有特定的排列顺序,所以可以在经常进行 一段范围上的数据搜索 的列上建立索引;
- 因为索引会进行排序,所以对于有大量重复数据的列上最好还是不用建立索引,因为这样并不会太大程度上提高搜索速度。
- 可以一些经常用于连接的列上创建索引,这样可以加快连接的速度;
- 关于插入的一些注意事项:
- 如果插入的时候,只给出表明而不给出属性名,那么要加入的 values 中的值要和属性列的数据存储类型一一对应;如果给出了属性名,那就要和用户给定的属性名一一对应。
- 对于给定表名,也给定部分属性名,表中没有被给出的属性的值自动赋空值;
- 对于给定表名,不给定属性名,values中必须给定和表中对应相等数目的值,因为表中的未给出值的部分不会自动赋空值,否则会报错。
- 关于查询:
- 单表查询列时候,可以按照任意顺序查询。
- select(查询)子句的目标表达式可以不仅可以是表中的属性列,也可以是一个算数表达式、字符串常量、函数等。
- 用户可以根据意愿改变输出结果的列表的 列的标题 (见例3.20附近)
- 查询时where子句的 判等 方式和各种语言判等方式不太相同 ,用一个等号 ‘=’ 即可;
- 最后,查询时可以视情况建立索引,可能很大程度上加快进度。
[例3.13] 为学生-课程数据库中的Student. Course和SC三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯-索引,SC表按学号升序和课程号降序建唯一索引。
create unique index Stusno on Student(Sno);
create unique index Coucno on Course(Cno);
create unique index Scno on SC(Sno ASC , Cno DESC);
在SQL语言中,建立索引使用CREATE INDEX语句,其一般格式为
:
CREATE [UNIQUE] [CLUSTER] INDEX<索引名>
ON<表名>(<列名>[<次序>][ <列名〉[<次序>]]…);
其中,<表名>是要建索引的基本表的名字。索引可以建立在该表的一列或多列上,各列名
之间用逗号分隔。每个<列名>后面还可以用<次序>指定索引值的排列次序,可选ASC (升
序)或DESC (降序),默认值为ASC。
UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。
CLUSTER表示要建立的索引是聚簇索引。
[例3.14] 将SC表的Scno索引名改为Scsno。
对于已经建立的索引,如果需要对其重新命名,可以使用ALTER INDEX语句。其一般格式为
ALTER INDEX <旧索引名> RENAME TO <新索引名>;
发现修改时不可用:
正确运行结果如下:
提示内容:更改对象名的任意部分都可能会破坏脚本和存储过程。
成功:
--失败的修改:
--alter index Scno rename to Scsno;
--成功的修改:
EXEC sp_rename 'SC.Scno', 'Scsno', 'index'
[例3.15 ] 删除Student表的Stusname索引。
删除索引时,系统会同时从数据字典中删去有关该索引的描述。索引一经建立就由系统使用和维护,不需用户干预。建立索引是为了减少査询操作的时间,但如果数据增、删、改频繁,系统会花费许多时间来维护索引,从而降低了査询效率。这时可以删除一些不必要的索引。
在SQL中,删除索引使用DROP INDEX语句,其一般格式为
DROP INDEX <索引名>;
结果为:
代码如下:
--drop index Stusno; //失败代码
drop index Stusno on Student; //成功代码
[例3.69] 将一个新学生元组(学号:201215128,姓名:陈冬,性别:男,所在系:IS,年龄:18岁)插入到Student表中。
在INTO子句中指出了表名Student,并指岀了新增加的元组在哪些属性上要赋值,属性的顺序可以与CREATE TABLE中的顺序不一样。VALUES子句对新元组的各属性赋值,字符串常数要用单引号(英文符号)括起来。
代码如下:
insert
into Student(Sno , Sname , Ssex , Sdept , Sage)
values('201215128' , '陈冬' , '男' , 'IS' , 18);
[例3.70] 将学生张成民的信息插入到Student表中。
insert
into Student
values('201215126' , '张成民' , '男' , 18 , 'CS');
在INTO子句中只指出了表名,没有指出属性名。这表示新元组要在表的所有属性列上都指定值,属性列的次序与CREATE TABLE中的次序相同。VALUES子句对新元组的各属性列赋值,一定要注意值与属性列要一 一对应,如果像例3.69那样,会因为数据类型不匹配出错。
[例3.71] 插入一条选课记录(‘201215128’ , ‘1’)
首先我们来看表的结构:
运行以下代码:
发现关系数据库管理系统将在新插入记录的Grade列上自动地赋空值:
指定对应 表的属性名 代码如下:
insert
into SC(Sno , Cno)
values('201215128','1');
如果不指定对应属性名,代码如下:
insert
into SC
values('201215128','1' , NULL);
[例3.16]査询全体学生的学号与姓名。
select Sno,Sname from Student;
该语句的执行过程可以是这样的:从Student表中取出一个元组,取出该元组在属性
Sno和Sname上的值,形成一个新的元组作为输出。对Student表中的所有元组做相同的处理,最后形成一个结果关系作为输出。
运行结果如下:
[例3.17] 査询全体学生的姓名、学号、所在系。
查询部分列(可以任意顺序查询):
select Sname,Sno,Sdept from Student;
查询全部列:
select * from Student;
结果如下:
[例3.18] 査询全体学生的详细记录.
[例3.19] 査询全体学生的姓名及其出生年份。
査询结果中第2列不是列名而是一个计算表达式,是用当时的年份(假设为2014年)减去学生的年龄。这样所得的即是学生的出生年份。输出的结果为:
代码为:
select Sname,2014-Sage from Student;
[例3.20] 査询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名。
结果为:
代码为:
select Sname,'Year of Birth:',2014-Sage,lower(Sdept) from Student;
用户可以通过指定别名来改变査询结果的列标题,这对于含算术表达式、常量、函数
名的目标列表达式尤为有用,例如对于例3.20可以定义如下列别名 :
代码如下:
select Sname name,'Year of Birth:' birth , 2014-Sage birthday,lower(Sdept) from Student department;
[例3.21] 査询选修了课程的学生学号。
代码如下:
select Sno From SC;
--等价于下面这句:
--select all Sno From SC;
如果要去除表中的重复的行:
select distinct 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;
[例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;
[例3.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('CS' , 'MA' , 'IS');