• INDEX:
1、建立索引 :
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
表名:要建索引的基本表的名字
索引:可以建立在该表的一列或多列上,各列名之间用逗号分隔
次序:指定索引值的排列次序。
升序:ASC
降序:DESC
缺省值:ASC
UNIQUE:此索引的每一个索引值只对应唯一的数据记录
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、修改索引
【例3.14】将SC表的SCno索引名改为SCSno
书中语句:ALTER INDEX SCno RENAME TO SCSno;
在 SQL server中无法运行,找不到储存过程‘RENAME’。
EXEC sp_rename 'SC.SCno','SCSno','index'
3、删除索引【例3.15】
书中语句: DROP INDEX Stusno;
在 SQL server中无法运行,必须为 DROP INDEX 语句指定表名和索引名:
DROP INDEX Stusno on Student;
• 插入元组:
INSERT INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>]… );
1、INTO子句指定要插入数据的表名及属性列,属性列的顺序可与表定义中的顺序不一致:
【例3.69】将一个新学生元组(学号:201215128;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中。
INSERT INTO Student (Sno,Sname,Ssex,Sdept,Sage)
VALUES ('201215128','陈冬','男','IS',18);
2、没有指定属性列,表示要插入的是一条完整的元组,且属性列属性与表定义中的顺序一致:
【例3.70】将学生张成民的信息插入到Student表中。
(INTO 子句不写属性名的情况)
INSERT INTO Student
VALUES ('201215126','张成民','男',18,'CS');
3、指定部分属性列,插入的元组在其余属性列上取空值,VALUES子句提供的值必须与INTO子句匹配(值的个数、值的类型)。
【例3.71】插入一条选课记录( ‘200215128’,'1 ')。
INSERT INTO SC(Sno,Cno)
VALUES ('201215128 ','1');
INSERT INTO SC
VALUES ('201215128','1',NULL);
• SELECT:数据查询
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[,<表名或视图名> ]…|(SELECT 语句) [AS]<别名>
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
SELECT子句:指定要显示的属性列
FROM子句:指定查询对象(基本表或视图)
WHERE子句:指定查询条件
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。
HAVING短语:只有满足指定条件的组才予以输出
ORDER BY子句:对查询结果表按指定列值的升序或降序排序
1、单表查询
(1)查询指定列
【例3.16】查询全体学生的学号与姓名。
SELECT Sno,Sname
FROM Student;
【例3.17】查询全体学生的姓名、学号、所在系。
SELECT Sname,Sno,Sdept
FROM Student;
(2)查询全部列
【例3.18】查询全体学生的详细记录
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
SELECT *
FROM Student;
(3)查询经过计算的值
SELECT子句的<目标列表达式>可以是表中的属性列,也可以是表达式。
【例3.19】查全体学生的姓名及其出生年份。
SELECT Sname,2016-Sage /*假设当时为2016年*/
FROM Student;
<目标列表达式>可以是算术表达式、字符串常量、函数等。
【例3.20】查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名。
SELECT Sname,'Year of Birth: ',2014-Sage,LOWER(Sdept)
FROM Student;
字符串常量:'Year of Birth: ’
表达式:2014-Sage
函数:用小写字母表示:LOWER()
Sdept:系名
2、选择表中的若干元组
(1)消除取值重复的行 DISTINCT
【例3.21】查询选修了课程的学生学号。
指定DISTINCT关键词,去掉表中重复的行 :
SELECT DISTINCT Sno
FROM SC;
执行结果:
Sno
201215121
201215122
如果没有指定DISTINCT关键词,则缺省为ALL :
SELECT Sno FROM SC;
SELECT ALL Sno FROM SC;
执行上面的SELECT语句后,结果为:
Sno
201215121
201215121
201215121
201215122
201215122
(2)查询满足条件的元组 WHERE
①比较大小
【例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;
② 确定范围 BETWEEN AND
【例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;
③ 确定集合 IN ()
【例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');