一.索引的建立与删除
(一)建立索引
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>]]...);
88页【例3.13】为学生-课程数据库中的Student、Course和SC 三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。
ASC表示升序,DESC表示降序。缺省值:ASC。
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
先对Sno进行升序排序,对某个Sno对Cno进行降序排序
(二)修改索引
ALTER INDEX <旧索引名> RENAME TO <新索引名>;
89页【例3.14】将SC表的SCno索引名改为SCno。
ALTER INDEX SCno RENAME TO SCSno;
原因:alter不能改变索引名,如若改变索引名就需要调用存储过程。
调用存储过程代码如下:
EXEC sp_rename @objname = 'student.stusno1', @newname = 'stusno2', @objtype = 'index'
/*或者如下*/
EXEC sp_rename '表名.旧索引名', '新索引名', 'INDEX'
调用存储过程时会出现:
注意: 更改对象名的任一部分都可能会破坏脚本和存储过程。
这时命令已经成功执行了。
EXEC sp_rename N'SC.SCno',N'SCSno',N'INDEX' ;
GO
(三)删除索引
DROP INDEX <表名.索引名>;
89页【例3.15】删除Course表的Course索引。
DROP INDEX Course;
书上的代码有误
正确代码:
DROP INDEX Course.Course;
二.插入数据(插入元组)
INSERT
INTO <表名> [(<属性列1>[,<属性列2>]...)]
VALUES(<常量1>[,<常量2>]...);
116页【例3.69】将一个新学生元组(学号:201215128,姓名:陈冬,性别:男,所在系:IS,年龄:18岁)插入到Student表中
INSERT
INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES('201215128','陈冬','男','IS',18);
116页【例3.70】将学生张成民的信息插入到Student表中。
INSERT
INTO Student
VALUES('201215126','张成民','男',18,'CS');
116页【例3.71】插入一条选课记录(‘201215128’,‘1’)。
INSERT
INTO SC(Sno,Cno)
VALUES('201215128','1');
或
INSERT
INTO SC
VALUES('201215128','1',NULL);
解析理论:外键约束,SC表存在一个字段Cno,有外键约束,引用于Course表的主键Cno,那么在向SC表插入数据时,字段Cno必须为Course表中Cno已经存在的值,如果SC中存放一个Cno中没有的值,则会报违反外键约束。
注意:SQL的空语句不能用空格,空格也占1个字符,要用NULL,要么不写系统自定义为NULL
INSERT
INTO Course
VALUES('9','离散数学','',4)
Student,Course,SC表整体插入查询:
--创建学生表Student
INSERT
INTO Student
VALUES('201215121','李勇','男',20,'CS'),
('201215122','刘晨','女',19,'CS'),
('201215123','王敏','女',18,'MA'),
('201215125','张立','男',19,'IS');
--创建课程表Course
INSERT
INTO Course
VALUES('1','数据库','5',4),
('2','数学',NULL,2),
('3','信息系统','1',4),
('4','操作系统','6',3),
('5','数据结构','7',4),
('6','数据处理',NULL,2),
('7','PASCAL语言','6',4),
('8','C语言',NULL,4),
('9','离散数学',NULL,4);
--创建选课表SC
INSERT
INTO SC
VALUES('201215121','1',92),
('201215121','2',85),
('201215121','3',88),
('201215122','2',90),
('201215122','3',80);
SELECT * FROM Student;
SELECT * FROM Course;
SELECT * FROM SC;
三.数据查询
一般格式:
SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]...
FROM <表名或视图名>[,<表名或视图名>...]|(<SELECT 语句>)[AS]<别名>
[WHERE<条件表达式>]
[GROUP BY <列名1>[HAVING<条件表达式>]]
[ORDER BY <列名2>[ASC|DESC]];
单表查询
1.选择表中的若干列
选择表中的全部或部分列即关系代数的投影运算
(1)查询指定列
90页【例3.16】查询全体学生的学号与姓名。
SELECT Sno,Sname
FROM Student;
90页【例3.17】查询全体学生的姓名,学号,所在系
SELECT Sname,Sno,Sdept
FROM Student;
(2)查询全部列
90页【例3.18】查询全体学生的详细记录
SELECT * FROM Student;
等价于
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
图例在上面