数据库的索引,插入与查询。

 
一、索引的建立,修改与删除

  当表的数据量比较大时,查询操作会比较耗时,建立索引是加快查询速度的有效手段。根据需要可以在基

本表上建立一个或多个索引,以提供多种存取路径,加快查找速度。

  数据库索引有多种类型,常见文件的索引包括顺序文件上的索引、B+数索引、散列索引、位图索引等。

1.索引的建立

一般格式为:

  CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
  ON <表名>(<列名> [<次序>] [,<列名>[<次序>]]...);

  索引可以建立在该表的一列或多列上,列名之间用逗号分割。各个列名之后还可以用<次序>指定索引值的排

列次序,可选ASC(升序)或DESC(降序),默认值为ASC。

  NUIQUE表明此索引的每一个索引值只对应唯一的数据记录。

  CLUSTER表示要建立的索引是聚簇索引。

【例 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);

在相应的表下查看对应的索引:
在这里插入图片描述

2.索引的修改

对于已经建立的索引,可以使用ALTER INDEX语句,其格式为

ALTER INDEX <旧索引名> RENAME TO <新索引名>;

【例 3.14】将SC表的SCno索引名改为SCSno。

ALTER INDEX SCno RENAME TO SCSno;

但是enmm,报错啦。。。
在这里插入图片描述
查看啦一下,原因是alter不能改变索引名,格式应该如下:

  EXEC sp_rename '表名.旧索引名', '新索引名', 'INDEX';

然后改了一下,确实成功啦,但是下面有一句注意提示:

  EXEC sp_rename 'SC.SCno','SCSno','index';

在这里插入图片描述
3.删除索引

  建立索引是为啦减少查询操作的时间,但如果数据增、删、改频繁,系统会花费很多时间来维护,降低啦查

询效率,这时可以删除一下不必要的索引.

在SQL中,删除索引使用DROP INDEX语句,其一般格式为:

DROP INDEX <索引名>;

【例 3.15】删除 Student 表的 Stusname 索引。

DROP INDEX Stusname;

但是
在这里插入图片描述
所以,应修改为下面语句:

  DROP INDEX Student.Stusname; --注意该索引应该存在,才能被删除。

4.这里介绍一下数据字典的概念。

  数据字典是关系数据库管理系统内部的一组系统表,他记录了数据库中的所有的定义信息,包括关系模式、

视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。关系数据库管理系统在执

行SQL的数据定义语句时,实际上就是在更新数据字典表中的相关信息。在进行查询优化和查询处理时,数据字

典中的信息时其重要依据。
 

二、向表里面插入数据

  SQL的数据插入语句insert通常有两种形式,一种是插入一个元组,另一种是插入子查询结果。后者可以一

次性插入多个元组。

1.插入元祖

格式为:

  INSERT 
  INTO <表名> [(<属性列1>[,<属性列2>]...)]
  VALUES(<常量1> [,<常量2>]...);

  (1)INTO子句中没有出现的属性列,新元祖在这些列上将取空值。但必须注意的是,在表定义时说明啦NOT NULL的属性列不能取空值,否则会出错。

【例 3.69】将一个新学生元祖(学号:201215128,姓名:陈东,性别:男,所在系:IS,年龄:18)插入到Student中。

  INSERT
  INTO Student(Sno,Sname,Ssex,Sdept,Sage)
  VALUES('201215128','陈冬','男','IS',18);

  (2)VALUES子句对新元素的各属性赋值,字符串常数要用单引号(英文字符)括起来。

【例 3.70】将学生张成民的信息插入到Student表中。

  INSERT
  INTO Student 
  VALUES('201215126','张成民','男',18,'CS');

  (3)在INTO子句中只指出表名,无属性列名时,VALUES子句对新元祖的各属性赋值时,一定要注意值与表中的属性列要一一对应。

  (4)如果INTO子句没有指明任何属性列名,则新插入的元祖必须在每个属性列均有值。

【例 3.71】插入一条选课记录。

  INSERT
  INTO SC(Sno,Cno)
  VALUES('201215128','1');

也可以是:

  INSERT
  INTO SC
  VALUES('201215128','1',NULL);

  因为这里没有指出 SC 的属性名,在Grade列要明确给出空值。

 这里在进行Course表插入元祖时,可能会报错,因为这里面有外键约束,Cpno的数必须是Cno已经出现过的数,否则会报错。
在这里插入图片描述
把书本上对应的内容输进去,然后查询一下,如下图:

INSERT
INTO Student
VALUES('201215121','李勇','男',20,'CS'),
	  ('201215122','刘晨','女',19,'CS'),
	  ('201215123','王敏','女',18,'MA'),
	  ('201215125','张立','男',19,'IS');
	  
INSERT
INTO Course 
VALUES('1','数据库',NULL,4),
	  ('2','数学',NULL,2),
	  ('3','信息系统','1',4),
	  ('4','操作系统',NULL,3),
	  ('5','数据结构',NULL,4),
	  ('6','数据处理',NULL,2),
	  ('7','PASCAL语言','6',4);
	  
INSERT
INTO SC
VALUES('201215121','1',92),
	  ('201215121','2',85),
	  ('201215121','3',88),
	  ('201215122','2',90),
	  ('201215122','3',80);

在这里插入图片描述
然后再将Cpno对应的改为原来的对应的Cno!!

三、数据查询

一般格式为:

  SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]...
  FROM <表名或视图名>[,<表名或视图名>...]|(<SELECT 语句>)[AS]<别名>
  [WHERE<条件表达式>]
  [GROUP BY <列名1>[HAVING<条件表达式>]]
  [ORDER BY <列名2>[ASC|DESC]];

1.单表查询

单表查询是指仅涉及一个表的查询。

(1)指定查询列

【例 3.16】查询全体学生的学号和姓名。

  SELECT Sno,Sname
  FROM Student;

【例 3.17】查询全体学生的姓名、学号、所在系。

  SELECT Sname,Sno,Sdep
  FROM Student;

在这里插入图片描述
(2)查询全部列

【例 3.18】查询全体学生的详细记录。

  SELECT *
  FROM Student;

等价于

  SELECT Sno,Sname,Ssex,Sage,Sdep
  FROM Student;

在这里插入图片描述
好啦,感谢观看。后面再进行补充!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谁会没有丶遗憾呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值