一、索引的建立,修改与删除
当表的数据量比较大时,查询操作会比较耗时,建立索引是加快查询速度的有效手段。根据需要可以在基
本表上建立一个或多个索引,以提供多种存取路径,加快查找速度。
数据库索引有多种类型,常见文件的索引包括顺序文件上的索引、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;
好啦,感谢观看。后面再进行补充!