数据库作业5:索引(index)、插入(insert)、查询(select) 例题 及 注意事项

这里写了课本上的数据库关于索引、插入、查询的例子,和自己的一些体会:o(* ̄▽ ̄*)ブ

题目有点儿乱,先来总结吧:
  • 关于索引的:
  1. 在修改索引时候遇到了错误:将alter index <旧索引名> rename to <新索引名>改为:exec sp_rename ‘表名.旧索引名’ , ‘新索引名’ , ‘index’ 就好。
  2. 在删除索引时候没有指定 表名 而出错。正确写法:drop index 索引名 on 表名;
  3. 经常多次进行数据上的操作的表,个人建议不要建立太多的索引;
  4. 但是在经常进行搜索查询的列上创建索引的话,可以加快搜索的速度;
  5. 索引会有特定的排列顺序,所以可以在经常进行 一段范围上的数据搜索 的列上建立索引;
  6. 因为索引会进行排序,所以对于有大量重复数据的列上最好还是不用建立索引,因为这样并不会太大程度上提高搜索速度。
  7. 可以一些经常用于连接的列上创建索引,这样可以加快连接的速度;
  • 关于插入的一些注意事项:
  1. 如果插入的时候,只给出表明而不给出属性名,那么要加入的 values 中的值要和属性列的数据存储类型一一对应;如果给出了属性名,那就要和用户给定的属性名一一对应。
  2. 对于给定表名,也给定部分属性名,表中没有被给出的属性的值自动赋空值;
  3. 对于给定表名,不给定属性名,values中必须给定和表中对应相等数目的值,因为表中的未给出值的部分不会自动赋空值,否则会报错。
  • 关于查询:
  1. 单表查询列时候,可以按照任意顺序查询。
  2. select(查询)子句的目标表达式可以不仅可以是表中的属性列,也可以是一个算数表达式、字符串常量、函数等。
  3. 用户可以根据意愿改变输出结果的列表的 列的标题 (见例3.20附近)
  4. 查询时where子句的 判等 方式和各种语言判等方式不太相同 ,用一个等号 ‘=’ 即可;
  5. 最后,查询时可以视情况建立索引,可能很大程度上加快进度。

[例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');
发布了12 篇原创文章 · 获赞 17 · 访问量 8476

猜你喜欢

转载自blog.csdn.net/qq_31747473/article/details/104882636