数据库作业5:SQL练习2 - INDEX / INSERT / SELECT

• 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'

数据库作业5:SQL练习2 - INDEX / INSERT / SELECT_第1张图片

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; 

数据库作业5:SQL练习2 - INDEX / INSERT / SELECT_第2张图片

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

SELECT Sname,Sno,Sdept
FROM Student;

数据库作业5:SQL练习2 - INDEX / INSERT / SELECT_第3张图片

(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;

输出结果:
数据库作业5:SQL练习2 - INDEX / INSERT / SELECT_第4张图片

<目标列表达式>可以是算术表达式、字符串常量、函数等。
【例3.20】查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名。

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

字符串常量:'Year of Birth: ’
表达式:2014-Sage
函数:用小写字母表示:LOWER()
Sdept:系名

输出结果:
数据库作业5:SQL练习2 - INDEX / INSERT / SELECT_第5张图片

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');

你可能感兴趣的:(数据库作业5:SQL练习2 - INDEX / INSERT / SELECT)