一、INDEX

建立索引(INDEX) 的目的: 加快查询速度。
关系数据库管理系统中常见的索引:顺序文件上的索引、B+树索引、散列(hash)索引、位图索引

1、建立索引

语句格式:
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);

表名:要建索引的基本表的名字
索引:可以建立在该表的一列或多列上,用逗号分隔
次序:指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC
UNIQUE:此索引的每一个索引值只对应唯一的数据记录,就是不存在重复值。
CLUSTER:表示建立聚簇索引

例1 为学生-课程数据库中的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 <旧索引名> RENAME TO <新索引名>

修改索引名

例2 将SC表的SCno索引名改为SCSno

ALTER INDEX SCno RENAME TO SCSno;

3、删除索引

语句格式:
DROP INDEX <索引名>;

删除索引时,系统会从数据字典中删去有关该索引的描述。
数据字典RDBMS内部的一组系统表,它记录了数据库中所有定义信息,包括:关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。
RDBMS在执行SQL的数据定义时,实际上就是在更新数据字典表中的相应信息。

例3 删除Student表的Stusname索引

DROP INDEX Stusname;

二、INSERT(插入数据)

两种插入数据方式:
1、插入元组
2、插入子查询结果 (可以一次插入多个元组)

1、插入元组

语句格式:
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>]… );
实现将新元组插入指定表中

其中;
INTO子句
(1)指定要插入数据的表名及属性列
(2)属性列的顺序可与表定义中的顺序不一致
(3)没有指定属性列:表示要插入的是一条完整的元组,且属性列属性与表定义中的顺序一致
(4)指定部分属性列:插入的元组在其余属性列上取空值

VALUES子句 提供的个数类型必须与INTO子句匹配

例4 将一个新学生元组(学号:201215128;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中。

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

!!! 如果填入的内容涉及引用其他或自身关系的属性值,该属性值必须是对应关系中存在的值。若不存在,先填NULL,存在后再修改。否则运行失败。

例5 插入一条选课记录( ‘200215128’,'1 ')。

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

新纪录的Grade列会自动赋空值。

或者

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

未指定属性列应按表定义的顺序插入。

例6 将学生张成民的信息插入到Student表中。(INTO 子句不写属性名的情况)

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

三、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、查询指定列(关系代数中的投影)

例7 查询全体学生的学号与姓名。

SELECT Sno,Sname
	FROM Student;

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

SELECT Sname,Sno,Sdept
	FROM Student;

2、查询全部列

选出所有属性列的方法:
(1)在SELECT后面列出所有列名
(2)用 *代表所有列名

例9 查询全体学生的详细记录

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

或者

SELECT  *
	FROM Student;

3、查询经过计算的值

SELECT 后可以接表达式
例10 查全体学生的姓名及其出生年份。

SELECT Sname,2016-Sage          /*假设当时为2016年*/
	FROM Student;

查询结果中第二列属性名为 2016-Sage ,各属性值皆为表达式对应值。

4、
例11 查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名。

SELECT Sname,'Year of Birth: ',2014-Sage,LOWER(Sdept)
	FROM Student;

查询结果中第二列属性名及属性值皆为Year of Birth:

5、用列别名改变查询结果的列标题:

SELECT Sname NAME,'Year of Birth:'  BIRTH,2014-Sage  BIRTHDAY,LOWER(Sdept)  DEPARTMENT
	FROM Student;

输出结果中属性名NAME取代Sname,BIRTH取代Year of Birth:

6、取消取值重复的行

(1)如果没有指定DISTINCT关键词,则缺省为**ALL **
例12 查询选修了课程的学生学号。

SELECT Sno   FROM SC;

SELECT ALL  Sno  FROM SC;

查询结果有重复行

(2)指定DISTINCT关键词,去掉表中重复的行

SELECT DISTINCT Sno
    FROM SC;

查询结果无重复行

比较大小

例13 查询计算机科学系全体学生的名单。

SELECT Sname
    FROM     Student
    WHERE  Sdept=‘CS’;

查询结果为系名是 CS 的学生名单

例14 查询所有年龄在20岁以下的学生姓名及其年龄。

SELECT Sname,Sage 
     FROM     Student    
     WHERE  Sage < 20;

查询结果为年龄小于20岁的学生名单

例15 查询考试成绩有不及格的学生的学号。

SELECT DISTINCT Sn
	FROM  SC
	WHERE Grade<60;

查询结果为考试成绩小于60的不重复的学号名单

确定范围

BETWEEN … AND …
NOT BETWEEN … AND …

例16 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄

SELECT Sname, Sdept, Sage
	FROM     Student
	WHERE   Sage BETWEEN 20 AND 23;

例17 查询年龄不在20~23岁之间的学生姓名、系别和年龄

SELECT Sname, Sdept, Sage
    FROM    Student
	WHERE Sage NOT BETWEEN 20 AND 23;

确定集合

IN , NOT IN

例18 查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。

SELECT Sname, Ssex
	FROM  Student
	WHERE Sdept IN ('CS','MA’,'IS' );

例19 查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别。

SELECT Sname, Ssex
	FROM Student
	WHERE Sdept NOT IN ('IS','MA’,'CS' );

心得体会:实验能发现很多细节问题,比如英文大小写,标点符号要用英文的等。很多内容其实都是类似的,比如查询中的比较大小、确定范围、确定集合、只是使用的谓词和符号不同,意思理解并记住格式就能正确使用。