索引建立与删除、数据简单插入与查询
- Ⅰ 索引的建立与删除
- 1.建立索引
- 2.修改索引
- 3.删除索引
- Ⅱ 数据插入
- Ⅲ 数据查询
- 1单表查询
Ⅰ 索引的建立与删除
1.建立索引
SQL语言建立索引的格式如下:
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>] [,<列名> [<次序>]]);
排列次序:(默认为升序)
ASC | 升序 |
DESC | 降序 |
索引的类型:
UNIQUE | 此索引的每一个索引值只对应唯一的数据记录 |
CLUSTER | 聚簇索引 |
【例3.13】为学生-课程数据库中的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.修改索引
SQL 修改索引语句的一般格式:
ALTER INDEX <旧索引名> RENAME TO <新索引名>;
【例3.14】将SC表的SCno索引名改为SCSno。
alter index SCno rename to SCSno;
此时会出现错误:
因为T-SQL与标准SQl修改索引的语句不同,T-SQL修改索引的语句为:
exec sp_rename 'SC.SCno','SCSno','index';
来自博客:
3.删除索引
SQL删除索引的语句:
DROP INDEX <索引名>;
T-SQ删除索引的语句为:(示例)
DROP INDEX IX_ProductVendor_BusinessEntityID
ON Purchasing.ProductVendor;
GO
【例3.15】删除Student表的Stusno索引。
drop index Stusno on Student;
删除索引时,系统会同时从数据字典中删去有关改索引的描述。
Ⅱ 数据插入
SQL 的数据插入方式有两种,一种是插入一个元组,令一种是插入子查询结果。后者可以一次性插入多个元组。先来说第一种插入方式吧。
插入语句格式为:
INSERT
INTO <表名> [(<属性列1> [,<属性列2>]...)]
VALUES (<常量1> [,<常量2>]...);
【例3.69】将一个新学生元组插入到Student表中。
insert
into Student (Sno,Sname,Ssex,Sdept,Sage)
values ('201215128','陈冬','男','IS',18);
注:在第二行的属性列中可以看到次序与截图表格中的次序是不同的,这就说明输入时的次序可以与表的次序有异,但属性列与常量必须一 一对应,即属性列1与常量1对应。
a.此种插入方式“into”后面指出了属性列,没有出现的属性列,新元组在这些列上取空值NULL,定义表时说明了NOT NULL的属性列是不能取空值的。
【例3.70】将学生张成民的信息插入到Student表中。
insert
into Student
values('201215126','张成民','男',18,'CS');
插入后的结果为:
b.这是因为into句子中只指出了表名,没有指出属性名,此时values子句对新元组的各属性列赋值一定要注意与属性列要一一对应。我的属性列里有S_entrance,但values中没有它的值,就会报错。删除S_entrance后成功插入数据:
或者在values语句中补上S-entrance对应的常量:
insert
into Student
values('201215127','张成民1','男',18,'CS','2019.09.01');
【例3.71】插入一条选课记录。
insert
into SC(Sno,Cno)
values('201215128','1');
c. 因为Snow,Cno是表SC的外码,此时的Course表还未添加数据,根据参照完整性规则是会出现错误的。
Course填入数据后:
insert
into SC(Sno,Cno)
values('201215128','1');
select * from SC;
Ⅲ 数据查询
1单表查询
(1)查询指定列:
在目标列表达式中输入要查询的列名即可,各列的先后顺序可与表中的顺序不同。
【3.16】查询全体学生的学号与姓名:(在此就不介绍3.17了)
select Sno,Sname
from Student;
(2)查询全部列:
有两种方法:
a. 在SELECT关键字后列出所有列名;
b. (列的显示顺序与在基表中的顺序相同)可将<目标列表达式>指定为 *。
【例3.18】查询全体学生的详细记录。
select *
from Student;