SQL 索引的操作 数据查询(1)数据更新

索引的建立与删除

建立索引

在SQL语言中,建立索引使用 CREATE INDEX 语句,其一般形式为

CREATE [UNIQUE][CLUSTER] INDEX <索引名>
ON <表名>(<列名> [<次序>][,<列名> [次序]] ...);

次序 可选ASC(升序)*、DESC(降序)
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);

建立索引后:
在这里插入图片描述
需要添加的索引添加完成!

CREATE (UNIQUE) INDEX 索引名 ON 表名(列名 排列方式,…);

修改索引

修改索引使用 ALTER INDEX 语句,一般格式为

ALTER INDEX <旧索引名> RENAME TO <新索引名>;

例3.14:将SC表的SCno索引名改为SCSno
在这里插入图片描述

ALTER INDEX SCno RENAME TO SCSno;

然而…
在这里插入图片描述
通过在网上查询,我们可以使用:

EXEC sp_rename 'SC.SCno','SCSno','INDEX';
//此处不使用EXEC也是可以的
//个人推测EXEC是为创建了另一进程来该索引名,加快运行速度吧

在这里插入图片描述

删除索引

删除索引一般是用 DROP INDEX 语句,一般格式为:

DROP INDEX <索引名>

例3.15:删除Student表的Stusname索引:
运行前:
在这里插入图片描述
放置一个错误做法

DROP INDEX Student.Stusno;

在这里插入图片描述
删除成功!

删除某一索引名,必须要添加对应的表名

数据更新

插入数据

SQL的数据插入语句INSERT通常有两种形式,一种是插入一个元组,另一种是插入子查询结果。后者可以一次插入多个元组

插入元组

插入元组的INSERT语句格式为:

INSERT
INTO <表名> [(<属性列1> [,<属性列2 >)]
VALUES (<常量1> [,<常量2>]);

其功能是将新元组插入指定表中。
其中新元组的属性列1的值为常量1,属性列2的值为常量2…
INTO 子句中没有出现的属性列,新元组在这些列上将取空值

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述
例3.70:将学生张成民的信息插入到Student表中:

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

在这里插入图片描述
例3.71:插入一条选课记录((‘201215128’,‘1’):

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

等价于==:

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

插入子查询结果

子查询不仅可以嵌套在SELECT语句中用以构造父查询的条件,也可以嵌套在INSERT语句中用以生成要插入的批量数据

插入子查询的语句格式为:

INSERT
INTO <表名> [(属性列1) [<属性列2>...]]
子查询;

例3.72:对每一个系,求学生的平均年龄,并把结果存入数据库
首先在数据库中定义一个新表,其中一列存放系名,另一列存放相应的学生平均年龄

CREATE TABLE Dept_age
(Sdept CHAR(15)
Avg_age SMALLINT);

然后对Student表按系分组求平均年龄,再把系名和平均年龄放入新表中

INSERT
INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;

修改数据

修改数据又称更新操作,一般格式为

UPDATE <表名>
SET <列名>=<表达式> [,<列名>=<表达式>]...
[WHERE <条件>];

eg1:将学生201215121的年龄改为22岁

UPDATE Student
SET Sage=22
WHERE Sno='201215121';

eg2:将所有学生的年龄增加1岁

UPDATE Student
SET Sage=Sage+1;

如果没有修饰条件,可以省略where语句,默认即为全部

eg3:将计算机科学系全体学生的成绩置0

UPDATE SC
SET Grade=0
WHERE Sno IN(
	SELECT Sno
	FROM Student
	WHERE  Sdept='CS'
);

删除数据

删除语句的一般格式为:

DELETE
FROM <表名>
[WHERE <条件>]

eg1:删除学号201215128的学生记录

DELETE
FROM Student
WHERE Sno='201215128';

eg2:删除所有学生的选课记录

DELETE
FROM SC;

eg3:删除计算机科学系所有学生的选课记录

DELETE
FROM SC
WHERE Sno IN(
	SELECT Sno
	FROM Student
	WHERE  Sdept='CS'
);

数据查询

单表查询

SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]FROM <表名或视图名>[,<表名或视图名> ]|(SELECT 语句)
[AS]<别名> 
[ WHERE <条件表达式> ] 
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
	[ ORDER BY <列名2> [ ASC|DESC ] ]

语句含义是:
根据WHERE子句的条件表达式从FROM子句指定的基本表、视图、派生表中找出满足条件的元组,再按SELECT子句中的目标列表达式选出元组中的属性值形成结果表
如果有GROUP BY子句,则将结果按列表1的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。如果GROUP BY子句带有HAVING短语,则只有满足指定条件的组才予以输出
如果有ORDER BY子句,则结果表还要按列名2的值的升序或降序排序
SELECT语句既可以完成简单的单表查询,也可以完成复杂的链接查询和嵌套查询。

例3.16:查询全体学生的学号与姓名:
在这里插入图片描述

SELECT Sno,Sname
FROM Student;

在这里插入图片描述
例3.17:查询全体学生的姓名、学号、所在系:

SELECT Sname,Sno,Sdept
FROM Student;

在这里插入图片描述

例3.18:查询全体学生的详细信息:
在这里插入图片描述

查询经过计算的值

SELECT 子句的<目标列表达式>不仅可以是表中的属性列,也可以是表达式

例3.19:查询全体学生的姓名及其出生月份:

SELECT Sname,2020-Sage
FROM Student;

在这里插入图片描述
例3.20:查询全体学生的姓名、出生月份和所在院系,要求用小写字母表示系名:

SELECT Sname,"Year of birth:",2021-Sage,LOWER(Sdept)
FROM Student;

在这里插入图片描述

用户可以通过指定别名来改变查询结果的列标题
列名+‘ ’+列标题,…

选择表中的若干元组

例3.21:查询选修了课程的学生学号:
执行下列语句,可能会出现重复的行

SELECT Sno
FROM SC;

而添加一个DISTINCT即可去重

SELECT DISTINCT Sno
FROM SC;

猜你喜欢

转载自blog.csdn.net/ChrisKevin0221/article/details/115262815